提交 1aafe86f 编写于 作者: X XuanYang-cn 提交者: yefu.chen

Change MsgPosition Logic

Signed-off-by: NXuanYang-cn <xuan.yang@zilliz.com>
上级 b92ff69c
......@@ -21,8 +21,7 @@ type collectionReplica interface {
hasCollection(collectionID UniqueID) bool
// segment
addSegment(segmentID UniqueID, collID UniqueID, partitionID UniqueID,
positions []*internalpb2.MsgPosition) error
addSegment(segmentID UniqueID, collID UniqueID, partitionID UniqueID, channelName string) error
removeSegment(segmentID UniqueID) error
hasSegment(segmentID UniqueID) bool
updateStatistics(segmentID UniqueID, numRows int64) error
......@@ -40,8 +39,8 @@ type (
isNew bool
createTime Timestamp // not using
endTime Timestamp // not using
startPositions []*internalpb2.MsgPosition
endPositions []*internalpb2.MsgPosition // not using
startPosition *internalpb2.MsgPosition
endPosition *internalpb2.MsgPosition // not using
}
collectionReplicaImpl struct {
......@@ -74,21 +73,28 @@ func (colReplica *collectionReplicaImpl) getSegmentByID(segmentID UniqueID) (*Se
return nil, errors.Errorf("Cannot find segment, id = %v", segmentID)
}
func (colReplica *collectionReplicaImpl) addSegment(segmentID UniqueID, collID UniqueID,
partitionID UniqueID, positions []*internalpb2.MsgPosition) error {
func (colReplica *collectionReplicaImpl) addSegment(
segmentID UniqueID,
collID UniqueID,
partitionID UniqueID,
channelName string) error {
colReplica.mu.Lock()
defer colReplica.mu.Unlock()
log.Println("Add Segment", segmentID)
position := &internalpb2.MsgPosition{
ChannelName: channelName,
}
seg := &Segment{
segmentID: segmentID,
collectionID: collID,
partitionID: partitionID,
isNew: true,
createTime: 0,
startPositions: positions,
endPositions: make([]*internalpb2.MsgPosition, 0),
startPosition: position,
endPosition: new(internalpb2.MsgPosition),
}
colReplica.segments = append(colReplica.segments, seg)
return nil
......@@ -151,7 +157,7 @@ func (colReplica *collectionReplicaImpl) getSegmentStatisticsUpdates(segmentID U
}
if ele.isNew {
updates.StartPositions = ele.startPositions
updates.StartPosition = ele.startPosition
ele.isNew = false
}
return updates, nil
......
......@@ -5,7 +5,6 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/zilliztech/milvus-distributed/internal/proto/internalpb2"
)
func initTestReplicaMeta(t *testing.T, replica collectionReplica, collectionName string, collectionID UniqueID, segmentID UniqueID) {
......@@ -112,7 +111,7 @@ func TestReplica_Segment(t *testing.T) {
replica := newReplica()
assert.False(t, replica.hasSegment(0))
err := replica.addSegment(0, 1, 2, make([]*internalpb2.MsgPosition, 0))
err := replica.addSegment(0, 1, 2, "insert-01")
assert.NoError(t, err)
assert.True(t, replica.hasSegment(0))
......
......@@ -139,7 +139,7 @@ func TestFlowGraphDDNode_Operate(t *testing.T) {
DropPartitionRequest: dropPartitionReq,
}
replica.addSegment(1, collID, partitionID, make([]*internalpb2.MsgPosition, 0))
replica.addSegment(1, collID, partitionID, "insert-01")
inFlushCh <- &flushMsg{
msgID: 5,
timestamp: 5,
......
......@@ -112,7 +112,7 @@ func (ibNode *insertBufferNode) Operate(in []*Msg) []*Msg {
partitionID := msg.GetPartitionID()
if !ibNode.replica.hasSegment(currentSegID) {
err := ibNode.replica.addSegment(currentSegID, collID, partitionID, iMsg.startPositions)
err := ibNode.replica.addSegment(currentSegID, collID, partitionID, msg.GetChannelID())
if err != nil {
log.Println("Error: add segment error", err)
}
......@@ -134,14 +134,23 @@ func (ibNode *insertBufferNode) Operate(in []*Msg) []*Msg {
uniqueSeg[currentSegID] = true
}
}
segIDs := make([]UniqueID, 0, len(uniqueSeg))
for id := range uniqueSeg {
segIDs = append(segIDs, id)
}
err := ibNode.updateSegStatistics(segIDs)
if len(segIDs) > 0 {
switch {
case iMsg.startPositions == nil || len(iMsg.startPositions) <= 0:
log.Println("Warning: insert Msg StartPosition empty")
default:
err := ibNode.updateSegStatistics(segIDs, iMsg.startPositions[0])
if err != nil {
log.Println("Error: update segment statistics error, ", err)
}
}
}
// iMsg is insertMsg
// 1. iMsg -> buffer
......@@ -579,7 +588,7 @@ func (ibNode *insertBufferNode) writeHardTimeTick(ts Timestamp) error {
return ibNode.timeTickStream.Produce(&msgPack)
}
func (ibNode *insertBufferNode) updateSegStatistics(segIDs []UniqueID) error {
func (ibNode *insertBufferNode) updateSegStatistics(segIDs []UniqueID, currentPosition *internalpb2.MsgPosition) error {
log.Println("Updating segments statistics...")
statsUpdates := make([]*internalpb2.SegmentStatisticsUpdates, 0, len(segIDs))
for _, segID := range segIDs {
......@@ -588,6 +597,8 @@ func (ibNode *insertBufferNode) updateSegStatistics(segIDs []UniqueID) error {
log.Println("Error get segment", segID, "statistics updates", err)
continue
}
updates.StartPosition.Timestamp = currentPosition.GetTimestamp()
updates.StartPosition.MsgID = currentPosition.GetMsgID()
statsUpdates = append(statsUpdates, updates)
}
......@@ -603,7 +614,7 @@ func (ibNode *insertBufferNode) updateSegStatistics(segIDs []UniqueID) error {
var msg msgstream.TsMsg = &msgstream.SegmentStatisticsMsg{
BaseMsg: msgstream.BaseMsg{
HashValues: []uint32{0},
HashValues: []uint32{0}, // GOOSE TODO
},
SegmentStatistics: segStats,
}
......
......@@ -648,8 +648,8 @@ func (s *Server) GetSegmentStates(req *datapb.SegmentStatesRequest) (*datapb.Seg
state.CreateTime = segmentInfo.OpenTime
state.SealedTime = segmentInfo.SealedTime
state.FlushedTime = segmentInfo.FlushedTime
state.StartPositions = segmentInfo.StartPosition
state.EndPositions = segmentInfo.EndPosition
state.StartPosition = segmentInfo.StartPosition
state.EndPosition = segmentInfo.EndPosition
}
resp.States = append(resp.States, state)
}
......
......@@ -22,23 +22,9 @@ func (handler *statsHandler) HandleSegmentStat(segStats *internalpb2.SegmentStat
if segStats.IsNewSegment {
segMeta.OpenTime = segStats.CreateTime
segMeta.StartPosition = append(segMeta.StartPosition, segStats.StartPositions...)
segMeta.StartPosition = segStats.StartPosition
}
segMeta.SealedTime = segStats.EndTime
for _, pos := range segStats.EndPositions {
isNew := true
for _, epos := range segMeta.EndPosition {
if epos.ChannelName == pos.ChannelName {
epos.Timestamp = pos.Timestamp
epos.MsgID = pos.MsgID
isNew = false
break
}
}
if isNew {
segMeta.EndPosition = append(segMeta.EndPosition, pos)
}
}
segMeta.NumRows = segStats.NumRows
segMeta.MemSize = segStats.MemorySize
......
......@@ -82,8 +82,8 @@ message SegmentStateInfo {
uint64 create_time = 3;
uint64 sealed_time = 4;
uint64 flushed_time = 5;
repeated internal.MsgPosition start_positions = 6;
repeated internal.MsgPosition end_positions = 7;
internal.MsgPosition start_position = 6;
internal.MsgPosition end_position = 7;
common.Status status = 8;
}
......@@ -145,8 +145,8 @@ message SegmentInfo {
int64 num_rows = 8;
int64 mem_size = 9;
common.SegmentState state = 10;
repeated internal.MsgPosition start_position = 11;
repeated internal.MsgPosition end_position = 12;
internal.MsgPosition start_position = 11;
internal.MsgPosition end_position = 12;
}
message SegmentMsg{
......
......@@ -179,8 +179,8 @@ message SegmentStatisticsUpdates {
int64 NumRows = 3;
uint64 create_time = 4;
uint64 end_time = 5;
repeated internal.MsgPosition start_positions = 6;
repeated internal.MsgPosition end_positions = 7;
internal.MsgPosition start_position = 6;
internal.MsgPosition end_position = 7;
bool isNewSegment = 8;
}
......
......@@ -1280,8 +1280,8 @@ type SegmentStatisticsUpdates struct {
NumRows int64 `protobuf:"varint,3,opt,name=NumRows,proto3" json:"NumRows,omitempty"`
CreateTime uint64 `protobuf:"varint,4,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
EndTime uint64 `protobuf:"varint,5,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"`
StartPositions []*MsgPosition `protobuf:"bytes,6,rep,name=start_positions,json=startPositions,proto3" json:"start_positions,omitempty"`
EndPositions []*MsgPosition `protobuf:"bytes,7,rep,name=end_positions,json=endPositions,proto3" json:"end_positions,omitempty"`
StartPosition *MsgPosition `protobuf:"bytes,6,opt,name=start_position,json=startPosition,proto3" json:"start_position,omitempty"`
EndPosition *MsgPosition `protobuf:"bytes,7,opt,name=end_position,json=endPosition,proto3" json:"end_position,omitempty"`
IsNewSegment bool `protobuf:"varint,8,opt,name=isNewSegment,proto3" json:"isNewSegment,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
......@@ -1348,16 +1348,16 @@ func (m *SegmentStatisticsUpdates) GetEndTime() uint64 {
return 0
}
func (m *SegmentStatisticsUpdates) GetStartPositions() []*MsgPosition {
func (m *SegmentStatisticsUpdates) GetStartPosition() *MsgPosition {
if m != nil {
return m.StartPositions
return m.StartPosition
}
return nil
}
func (m *SegmentStatisticsUpdates) GetEndPositions() []*MsgPosition {
func (m *SegmentStatisticsUpdates) GetEndPosition() *MsgPosition {
if m != nil {
return m.EndPositions
return m.EndPosition
}
return nil
}
......@@ -1771,99 +1771,99 @@ func init() { proto.RegisterFile("internal.proto", fileDescriptor_41f4a519b878ee
var fileDescriptor_41f4a519b878ee3b = []byte{
// 1510 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0x5b, 0x6f, 0x1b, 0x45,
0x14, 0x66, 0x6d, 0x27, 0xb6, 0x8f, 0x9d, 0xc4, 0x5d, 0x7a, 0xd9, 0x42, 0xa0, 0xee, 0x72, 0x0b,
0x54, 0x24, 0x55, 0x8a, 0x10, 0xe2, 0xa5, 0x4d, 0xe2, 0x5e, 0x56, 0x49, 0x4c, 0x18, 0xa7, 0x95,
0xda, 0x97, 0xd5, 0x7a, 0x77, 0x62, 0x4f, 0xbb, 0x17, 0x77, 0x66, 0xdc, 0xd4, 0x7d, 0xe6, 0x0d,
0xc1, 0x03, 0x12, 0x7f, 0x80, 0x1f, 0xc0, 0x33, 0x4f, 0x20, 0xf1, 0x84, 0xc4, 0x3b, 0x12, 0x12,
0x3f, 0x80, 0xdf, 0xc0, 0x13, 0x9a, 0xcb, 0xee, 0xda, 0xa9, 0x93, 0xa6, 0x81, 0x0a, 0x21, 0x78,
0xf3, 0x9c, 0x39, 0x7b, 0x66, 0xbe, 0xef, 0x3b, 0x67, 0xce, 0x8c, 0x61, 0x9e, 0xc4, 0x1c, 0xd3,
0xd8, 0x0b, 0x97, 0x07, 0x34, 0xe1, 0x89, 0x79, 0x26, 0x22, 0xe1, 0xa3, 0x21, 0x53, 0xa3, 0xe5,
0x74, 0xf2, 0x95, 0xba, 0x9f, 0x44, 0x51, 0x12, 0x2b, 0xb3, 0xfd, 0xbd, 0x01, 0x73, 0x1b, 0x49,
0x34, 0x48, 0x62, 0x1c, 0x73, 0x27, 0xde, 0x4b, 0xcc, 0xb3, 0x30, 0x1b, 0x27, 0x01, 0x76, 0x5a,
0x96, 0xd1, 0x34, 0x96, 0x8a, 0x48, 0x8f, 0x4c, 0x13, 0x4a, 0x34, 0x09, 0xb1, 0x55, 0x68, 0x1a,
0x4b, 0x55, 0x24, 0x7f, 0x9b, 0x57, 0x01, 0x18, 0xf7, 0x38, 0x76, 0xfd, 0x24, 0xc0, 0x56, 0xb1,
0x69, 0x2c, 0xcd, 0xaf, 0x36, 0x97, 0xa7, 0xae, 0xbb, 0xdc, 0x11, 0x8e, 0x1b, 0x49, 0x80, 0x51,
0x95, 0xa5, 0x3f, 0xcd, 0x6b, 0x00, 0xf8, 0x31, 0xa7, 0x9e, 0x4b, 0xe2, 0xbd, 0xc4, 0x2a, 0x35,
0x8b, 0x4b, 0xb5, 0xd5, 0x8b, 0x93, 0x01, 0xf4, 0x76, 0x37, 0xf1, 0xe8, 0x8e, 0x17, 0x0e, 0xf1,
0x8e, 0x47, 0x28, 0xaa, 0xca, 0x8f, 0xc4, 0x76, 0xed, 0x5f, 0x0d, 0x58, 0xc8, 0x00, 0xc8, 0x35,
0x98, 0xf9, 0x31, 0xcc, 0xc8, 0x25, 0x24, 0x82, 0xda, 0xea, 0x9b, 0x87, 0xec, 0x68, 0x02, 0x37,
0x52, 0x9f, 0x98, 0xb7, 0xe1, 0x65, 0x36, 0xec, 0xfa, 0xe9, 0x94, 0x2b, 0xad, 0xcc, 0x2a, 0xc8,
0xad, 0x1d, 0x2f, 0x92, 0x39, 0x1e, 0x40, 0x6f, 0xe9, 0x0a, 0xcc, 0x8a, 0x48, 0x43, 0x26, 0x59,
0xaa, 0xad, 0xbe, 0x3a, 0x15, 0x64, 0x47, 0xba, 0x20, 0xed, 0x6a, 0xdf, 0x81, 0x4a, 0x5b, 0x90,
0x2f, 0x64, 0xf9, 0x10, 0xca, 0x5e, 0x10, 0x50, 0xcc, 0x98, 0x46, 0xb5, 0x38, 0x35, 0xc2, 0x9a,
0xf2, 0x41, 0xa9, 0xf3, 0x34, 0xd9, 0xec, 0xfb, 0x00, 0x4e, 0x4c, 0xf8, 0x8e, 0x47, 0xbd, 0x88,
0x1d, 0x2a, 0x78, 0x0b, 0xea, 0x8c, 0x7b, 0x94, 0xbb, 0x03, 0xe9, 0xa7, 0x29, 0x38, 0x86, 0x3a,
0x35, 0xf9, 0x99, 0x8a, 0x6e, 0xdf, 0x05, 0xe8, 0x70, 0x4a, 0xe2, 0xde, 0x16, 0x61, 0x5c, 0xac,
0xf5, 0x48, 0xf8, 0x09, 0x10, 0xc5, 0xa5, 0x2a, 0xd2, 0xa3, 0x31, 0x7a, 0x0a, 0xc7, 0xa7, 0xe7,
0x2a, 0xd4, 0x76, 0x49, 0x84, 0x77, 0x89, 0xff, 0x60, 0x9b, 0xf5, 0xcc, 0xcb, 0x50, 0xea, 0x7a,
0x0c, 0x1f, 0x49, 0xcf, 0x36, 0xeb, 0xad, 0x7b, 0x0c, 0x23, 0xe9, 0x69, 0xff, 0x66, 0xc0, 0xb9,
0x0d, 0x8a, 0x65, 0x32, 0x86, 0x21, 0xf6, 0x39, 0x49, 0x62, 0x84, 0x1f, 0x0e, 0x31, 0xe3, 0xcf,
0x1f, 0xcd, 0x3c, 0x07, 0xe5, 0xa0, 0xeb, 0xc6, 0x5e, 0x94, 0x92, 0x3d, 0x1b, 0x74, 0xdb, 0x5e,
0x84, 0xcd, 0xb7, 0x61, 0xde, 0xcf, 0xe2, 0x0b, 0x8b, 0xcc, 0x81, 0x2a, 0x3a, 0x60, 0x15, 0x52,
0x05, 0x5d, 0xa7, 0x65, 0x95, 0xa4, 0x0c, 0xf2, 0xb7, 0x69, 0x43, 0x3d, 0xf7, 0x72, 0x5a, 0xd6,
0x8c, 0x9c, 0x9b, 0xb0, 0x09, 0x52, 0x99, 0xdf, 0xc7, 0x91, 0x67, 0xcd, 0x36, 0x8d, 0xa5, 0x3a,
0xd2, 0x23, 0xfb, 0x47, 0x03, 0xce, 0xb4, 0x68, 0x32, 0xf8, 0x37, 0x83, 0xb3, 0xbf, 0x28, 0xc0,
0x59, 0xa5, 0xd1, 0x8e, 0x47, 0x39, 0x79, 0x41, 0x28, 0xde, 0x81, 0x85, 0x7c, 0x55, 0xe5, 0x30,
0x1d, 0xc6, 0x5b, 0x30, 0x3f, 0x48, 0xf7, 0xa1, 0xfc, 0x4a, 0xd2, 0x6f, 0x2e, 0xb3, 0x4e, 0xa0,
0x9d, 0x39, 0x02, 0xed, 0xec, 0x14, 0x29, 0x9b, 0x50, 0xcb, 0x02, 0x39, 0x2d, 0xab, 0x2c, 0x5d,
0xc6, 0x4d, 0xf6, 0xe7, 0x05, 0x38, 0x2d, 0x44, 0xfd, 0x9f, 0x0d, 0xc1, 0xc6, 0x0f, 0x05, 0x30,
0x55, 0x76, 0x38, 0x71, 0x80, 0x1f, 0xff, 0x93, 0x5c, 0xbc, 0x06, 0xb0, 0x47, 0x70, 0x18, 0x8c,
0xf3, 0x50, 0x95, 0x96, 0xbf, 0xc4, 0x81, 0x05, 0x65, 0x19, 0x24, 0xc3, 0x9f, 0x0e, 0xc5, 0xf9,
0xac, 0x7a, 0xa7, 0x3e, 0x9f, 0x2b, 0xc7, 0x3e, 0x9f, 0xe5, 0x67, 0xfa, 0x7c, 0xfe, 0xb6, 0x08,
0x73, 0x4e, 0xcc, 0x30, 0xe5, 0xff, 0xe5, 0x44, 0x32, 0x17, 0xa1, 0xca, 0x70, 0x2f, 0x12, 0x2d,
0xbc, 0x65, 0x55, 0xe4, 0x7c, 0x6e, 0x10, 0xb3, 0x7e, 0xdf, 0x8b, 0x63, 0x1c, 0x3a, 0x2d, 0xab,
0xaa, 0xa4, 0xcd, 0x0c, 0xe6, 0xeb, 0x00, 0x9c, 0x44, 0x98, 0x71, 0x2f, 0x1a, 0x30, 0x0b, 0x9a,
0xc5, 0xa5, 0x12, 0x1a, 0xb3, 0x88, 0xf3, 0x99, 0x26, 0xfb, 0x4e, 0x8b, 0x59, 0xb5, 0x66, 0x51,
0x34, 0x58, 0x35, 0x32, 0x3f, 0x80, 0x0a, 0x4d, 0xf6, 0xdd, 0xc0, 0xe3, 0x9e, 0x55, 0x97, 0xe2,
0x9d, 0x9f, 0x4a, 0xf6, 0x7a, 0x98, 0x74, 0x51, 0x99, 0x26, 0xfb, 0x2d, 0x8f, 0x7b, 0xf6, 0x77,
0x05, 0x98, 0xeb, 0x60, 0x8f, 0xfa, 0xfd, 0x93, 0x0b, 0xf6, 0x2e, 0x34, 0x28, 0x66, 0xc3, 0x90,
0xbb, 0x39, 0x2c, 0xa5, 0xdc, 0x82, 0xb2, 0x6f, 0x64, 0xe0, 0x52, 0xca, 0x8b, 0x47, 0x50, 0x5e,
0x9a, 0x42, 0xb9, 0x0d, 0xf5, 0x31, 0x7e, 0x99, 0x35, 0x23, 0xa1, 0x4f, 0xd8, 0xcc, 0x06, 0x14,
0x03, 0x16, 0x4a, 0xc5, 0xaa, 0x48, 0xfc, 0x34, 0x2f, 0xc1, 0xa9, 0x41, 0xe8, 0xf9, 0xb8, 0x9f,
0x84, 0x01, 0xa6, 0x6e, 0x8f, 0x26, 0xc3, 0x81, 0x94, 0xab, 0x8e, 0x1a, 0x63, 0x13, 0x37, 0x85,
0xdd, 0x5c, 0x81, 0x99, 0x87, 0x43, 0x4c, 0x47, 0x52, 0xaf, 0x23, 0xc9, 0x53, 0x7e, 0xf6, 0x2f,
0x46, 0x4e, 0x9d, 0x40, 0xc9, 0x4e, 0x40, 0xdd, 0x49, 0x6e, 0x2a, 0x53, 0xf9, 0x2e, 0x4e, 0xe7,
0xfb, 0x02, 0xd4, 0x22, 0xcc, 0x29, 0xf1, 0x5d, 0x3e, 0x1a, 0xa4, 0x65, 0x00, 0xca, 0xb4, 0x3b,
0x1a, 0xc8, 0x1a, 0xe8, 0x13, 0xae, 0x08, 0xad, 0x23, 0xf9, 0xdb, 0xfe, 0xd9, 0x80, 0xb9, 0x16,
0x0e, 0x31, 0xc7, 0x27, 0xcf, 0x89, 0x29, 0xb5, 0x5a, 0x98, 0x5a, 0xab, 0x13, 0xc5, 0x50, 0x3c,
0xba, 0x18, 0x4a, 0x4f, 0x15, 0xc3, 0x45, 0xa8, 0x0f, 0x28, 0x89, 0x3c, 0x3a, 0x72, 0x1f, 0xe0,
0x51, 0x9a, 0x17, 0x35, 0x6d, 0xdb, 0xc4, 0x23, 0x66, 0x7f, 0x63, 0x40, 0xe5, 0x46, 0x38, 0x64,
0xfd, 0x13, 0xdd, 0xea, 0x26, 0x4b, 0xb9, 0x70, 0xb0, 0x94, 0x0f, 0xe6, 0x6e, 0xf1, 0x19, 0xb9,
0xbb, 0xeb, 0xf5, 0xb4, 0x08, 0x13, 0x36, 0xfb, 0x0f, 0x03, 0xaa, 0x5b, 0x89, 0x17, 0xc8, 0xbe,
0xf3, 0xb7, 0xef, 0x72, 0x11, 0xf2, 0xd6, 0x91, 0x72, 0x9c, 0xf7, 0x92, 0xb1, 0x9e, 0x50, 0x9a,
0xec, 0x09, 0x17, 0xa0, 0x46, 0xc4, 0x86, 0xdc, 0x81, 0xc7, 0xfb, 0x8a, 0xdc, 0x2a, 0x02, 0x69,
0xda, 0x11, 0x16, 0xd1, 0x34, 0x52, 0x07, 0xd9, 0x34, 0x66, 0x8f, 0xdd, 0x34, 0x74, 0x10, 0xd9,
0x34, 0x7e, 0x2f, 0x80, 0xd5, 0x51, 0x9b, 0x15, 0x99, 0x4e, 0x18, 0x27, 0x3e, 0xbb, 0x3d, 0x08,
0xe4, 0x53, 0x67, 0x11, 0xaa, 0x9d, 0x0c, 0x99, 0x7a, 0x52, 0xe4, 0x06, 0x91, 0x1f, 0xdb, 0x38,
0x4a, 0xe8, 0xa8, 0x43, 0x9e, 0x60, 0x0d, 0x7c, 0xcc, 0x22, 0xb0, 0xb5, 0x87, 0x11, 0x4a, 0xf6,
0x99, 0x96, 0x26, 0x1d, 0x0a, 0x6c, 0xbe, 0x6c, 0xf5, 0xae, 0x48, 0x27, 0x89, 0xbc, 0x84, 0x40,
0x99, 0xc4, 0x3b, 0xc0, 0x3c, 0x0f, 0x15, 0x1c, 0x07, 0x6a, 0x76, 0x46, 0xce, 0x96, 0x71, 0x1c,
0xc8, 0xa9, 0x4d, 0x58, 0xd0, 0x6f, 0x99, 0x84, 0x49, 0x09, 0x53, 0xe4, 0xf6, 0x21, 0x2f, 0xba,
0x6d, 0xd6, 0xdb, 0xd1, 0xae, 0x68, 0x5e, 0xbd, 0x67, 0xd2, 0x2f, 0xcd, 0x9b, 0x30, 0x27, 0xd6,
0xc9, 0x43, 0x95, 0x8f, 0x1d, 0xaa, 0x8e, 0xe3, 0x20, 0x0f, 0x64, 0x43, 0x9d, 0xb0, 0x36, 0xde,
0xd7, 0xec, 0xc8, 0x73, 0xac, 0x82, 0x26, 0x6c, 0xf6, 0x57, 0x06, 0x9c, 0x7a, 0x8a, 0xea, 0x13,
0xe4, 0xdb, 0x26, 0x54, 0x3a, 0xb8, 0x27, 0x42, 0xa4, 0x2f, 0xb9, 0x95, 0xc3, 0x1e, 0xea, 0x87,
0x08, 0x8b, 0xb2, 0x00, 0xf6, 0xfd, 0x4c, 0x7e, 0x59, 0xa7, 0xe2, 0xf9, 0x2b, 0x0e, 0x9f, 0xe0,
0x05, 0x14, 0xac, 0xfd, 0x99, 0x21, 0x5e, 0xab, 0x01, 0x7e, 0x2c, 0x97, 0x7e, 0x2a, 0x81, 0x8d,
0x93, 0x24, 0xb0, 0x79, 0x19, 0x4e, 0xc7, 0xc3, 0xc8, 0xa5, 0x38, 0xf4, 0x38, 0x0e, 0x5c, 0xbd,
0x1a, 0xd3, 0xab, 0x9b, 0xf1, 0x30, 0x42, 0x6a, 0x4a, 0xc3, 0x64, 0xf6, 0x97, 0x06, 0xc0, 0x0d,
0x51, 0x65, 0x6a, 0x1b, 0x07, 0x8f, 0x11, 0xe3, 0xe8, 0xab, 0x5b, 0x61, 0xb2, 0x4c, 0xd7, 0xd3,
0x32, 0x65, 0x52, 0x8f, 0xe2, 0x34, 0x0c, 0x99, 0x1e, 0x39, 0x78, 0x5d, 0xc9, 0x4a, 0x83, 0xaf,
0x0d, 0xa8, 0x8f, 0x49, 0xc5, 0x26, 0x69, 0x34, 0x0e, 0x9e, 0x28, 0xb2, 0xaf, 0x88, 0x2a, 0x73,
0xd9, 0x58, 0xe1, 0x45, 0x79, 0xe1, 0x9d, 0x87, 0x8a, 0xa4, 0x64, 0xac, 0xf2, 0x62, 0x5d, 0x79,
0x97, 0xe0, 0x14, 0xc5, 0x3e, 0x8e, 0x79, 0x38, 0x72, 0xa3, 0x24, 0x20, 0x7b, 0x04, 0x07, 0xb2,
0xfe, 0x2a, 0xa8, 0x91, 0x4e, 0x6c, 0x6b, 0xbb, 0xfd, 0x93, 0x01, 0xf3, 0x9f, 0x8a, 0x76, 0xdb,
0x4e, 0x02, 0xac, 0x76, 0xf6, 0xfc, 0x29, 0x71, 0x4d, 0x62, 0xd1, 0xf4, 0xa8, 0x74, 0x7d, 0xe3,
0xd9, 0xe9, 0xca, 0x50, 0x85, 0xe9, 0x14, 0x15, 0x14, 0xab, 0xeb, 0xf8, 0x71, 0x28, 0xce, 0x85,
0x45, 0xea, 0x12, 0xaf, 0x28, 0x0e, 0xa0, 0x36, 0x56, 0xbc, 0xa2, 0x75, 0xe9, 0x3e, 0xa7, 0xda,
0xa3, 0x21, 0xcf, 0xe5, 0x9a, 0xb6, 0xc9, 0x93, 0xf9, 0x34, 0xcc, 0x44, 0xac, 0x97, 0xdd, 0xa6,
0xd4, 0x40, 0x28, 0x93, 0x75, 0x40, 0xc9, 0x6d, 0x09, 0xe5, 0x86, 0xf7, 0x3e, 0x82, 0x6a, 0xf6,
0xdf, 0x98, 0xd9, 0x80, 0xba, 0xd3, 0x76, 0x76, 0x9d, 0xb5, 0x2d, 0xe7, 0x9e, 0xd3, 0xbe, 0xd9,
0x78, 0xc9, 0xac, 0x41, 0xf9, 0xd6, 0xf5, 0xb5, 0xad, 0xdd, 0x5b, 0x77, 0x1b, 0x86, 0x59, 0x87,
0xca, 0xda, 0x7a, 0xfb, 0x13, 0xb4, 0xbd, 0xb6, 0xd5, 0x28, 0xac, 0x5f, 0xbf, 0xb7, 0xd1, 0x23,
0xbc, 0x3f, 0xec, 0x0a, 0x12, 0x57, 0x9e, 0x90, 0x30, 0x24, 0x4f, 0x38, 0xf6, 0xfb, 0x2b, 0x0a,
0xe5, 0xfb, 0x01, 0x61, 0x9c, 0x92, 0xee, 0x90, 0xe3, 0x60, 0x25, 0xc5, 0xba, 0x22, 0xa1, 0x67,
0xc3, 0x41, 0x77, 0xb5, 0x3b, 0x2b, 0x4d, 0x57, 0xfe, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xac, 0xb7,
0x6c, 0x03, 0x41, 0x14, 0x00, 0x00,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0xcd, 0x6f, 0x1b, 0x45,
0x14, 0x67, 0x6d, 0x27, 0xb6, 0xdf, 0x3a, 0xa9, 0xbb, 0xf4, 0x63, 0x0b, 0x81, 0xba, 0xcb, 0x57,
0xa0, 0x22, 0xa9, 0x52, 0x84, 0x10, 0x97, 0x36, 0x89, 0xfb, 0xb1, 0x6a, 0x62, 0xc2, 0x38, 0xad,
0xd4, 0x5e, 0x56, 0xeb, 0xdd, 0x89, 0x3d, 0xed, 0x7e, 0xb8, 0x33, 0xe3, 0xa6, 0xee, 0x99, 0x1b,
0x82, 0x03, 0x12, 0xff, 0x00, 0x7f, 0x00, 0x67, 0x4e, 0x20, 0x71, 0x42, 0xe2, 0x8e, 0x84, 0xc4,
0x91, 0xbf, 0x82, 0x13, 0x9a, 0x8f, 0x5d, 0xdb, 0xa9, 0x93, 0xa6, 0x86, 0x0a, 0x21, 0xb8, 0xed,
0xbc, 0x79, 0x7e, 0x33, 0xbf, 0xdf, 0xef, 0xbd, 0x79, 0x33, 0x86, 0x45, 0x92, 0x70, 0x4c, 0x13,
0x3f, 0x5a, 0xe9, 0xd3, 0x94, 0xa7, 0xd6, 0xe9, 0x98, 0x44, 0x8f, 0x06, 0x4c, 0x8d, 0x56, 0xb2,
0xc9, 0x57, 0x6a, 0x41, 0x1a, 0xc7, 0x69, 0xa2, 0xcc, 0xce, 0xf7, 0x06, 0x2c, 0x6c, 0xa6, 0x71,
0x3f, 0x4d, 0x70, 0xc2, 0xdd, 0x64, 0x2f, 0xb5, 0xce, 0xc0, 0x7c, 0x92, 0x86, 0xd8, 0x6d, 0xda,
0x46, 0xc3, 0x58, 0x2e, 0x22, 0x3d, 0xb2, 0x2c, 0x28, 0xd1, 0x34, 0xc2, 0x76, 0xa1, 0x61, 0x2c,
0x57, 0x91, 0xfc, 0xb6, 0xae, 0x00, 0x30, 0xee, 0x73, 0xec, 0x05, 0x69, 0x88, 0xed, 0x62, 0xc3,
0x58, 0x5e, 0x5c, 0x6b, 0xac, 0x4c, 0x5d, 0x77, 0xa5, 0x2d, 0x1c, 0x37, 0xd3, 0x10, 0xa3, 0x2a,
0xcb, 0x3e, 0xad, 0xab, 0x00, 0xf8, 0x31, 0xa7, 0xbe, 0x47, 0x92, 0xbd, 0xd4, 0x2e, 0x35, 0x8a,
0xcb, 0xe6, 0xda, 0x85, 0xc9, 0x00, 0x7a, 0xbb, 0xb7, 0xf0, 0xf0, 0x8e, 0x1f, 0x0d, 0xf0, 0x8e,
0x4f, 0x28, 0xaa, 0xca, 0x1f, 0x89, 0xed, 0x3a, 0xbf, 0x1a, 0x70, 0x22, 0x07, 0x20, 0xd7, 0x60,
0xd6, 0xc7, 0x30, 0x27, 0x97, 0x90, 0x08, 0xcc, 0xb5, 0x37, 0x0f, 0xd9, 0xd1, 0x04, 0x6e, 0xa4,
0x7e, 0x62, 0xdd, 0x86, 0x97, 0xd9, 0xa0, 0x13, 0x64, 0x53, 0x9e, 0xb4, 0x32, 0xbb, 0x20, 0xb7,
0x76, 0xbc, 0x48, 0xd6, 0x78, 0x00, 0xbd, 0xa5, 0xcb, 0x30, 0x2f, 0x22, 0x0d, 0x98, 0x64, 0xc9,
0x5c, 0x7b, 0x75, 0x2a, 0xc8, 0xb6, 0x74, 0x41, 0xda, 0xd5, 0xb9, 0x03, 0x95, 0x96, 0x20, 0x5f,
0xc8, 0xf2, 0x21, 0x94, 0xfd, 0x30, 0xa4, 0x98, 0x31, 0x8d, 0x6a, 0x69, 0x6a, 0x84, 0x75, 0xe5,
0x83, 0x32, 0xe7, 0x69, 0xb2, 0x39, 0xf7, 0x01, 0xdc, 0x84, 0xf0, 0x1d, 0x9f, 0xfa, 0x31, 0x3b,
0x54, 0xf0, 0x26, 0xd4, 0x18, 0xf7, 0x29, 0xf7, 0xfa, 0xd2, 0x4f, 0x53, 0x70, 0x0c, 0x75, 0x4c,
0xf9, 0x33, 0x15, 0xdd, 0xb9, 0x0b, 0xd0, 0xe6, 0x94, 0x24, 0xdd, 0x2d, 0xc2, 0xb8, 0x58, 0xeb,
0x91, 0xf0, 0x13, 0x20, 0x8a, 0xcb, 0x55, 0xa4, 0x47, 0x63, 0xf4, 0x14, 0x8e, 0x4f, 0xcf, 0x15,
0x30, 0x77, 0x49, 0x8c, 0x77, 0x49, 0xf0, 0x60, 0x9b, 0x75, 0xad, 0x4b, 0x50, 0xea, 0xf8, 0x0c,
0x1f, 0x49, 0xcf, 0x36, 0xeb, 0x6e, 0xf8, 0x0c, 0x23, 0xe9, 0xe9, 0xfc, 0x66, 0xc0, 0xd9, 0x4d,
0x8a, 0x65, 0x32, 0x46, 0x11, 0x0e, 0x38, 0x49, 0x13, 0x84, 0x1f, 0x0e, 0x30, 0xe3, 0xcf, 0x1f,
0xcd, 0x3a, 0x0b, 0xe5, 0xb0, 0xe3, 0x25, 0x7e, 0x9c, 0x91, 0x3d, 0x1f, 0x76, 0x5a, 0x7e, 0x8c,
0xad, 0xb7, 0x61, 0x31, 0xc8, 0xe3, 0x0b, 0x8b, 0xcc, 0x81, 0x2a, 0x3a, 0x60, 0x15, 0x52, 0x85,
0x1d, 0xb7, 0x69, 0x97, 0xa4, 0x0c, 0xf2, 0xdb, 0x72, 0xa0, 0x36, 0xf2, 0x72, 0x9b, 0xf6, 0x9c,
0x9c, 0x9b, 0xb0, 0x09, 0x52, 0x59, 0xd0, 0xc3, 0xb1, 0x6f, 0xcf, 0x37, 0x8c, 0xe5, 0x1a, 0xd2,
0x23, 0xe7, 0x47, 0x03, 0x4e, 0x37, 0x69, 0xda, 0xff, 0x37, 0x83, 0x73, 0xbe, 0x28, 0xc0, 0x19,
0xa5, 0xd1, 0x8e, 0x4f, 0x39, 0x79, 0x41, 0x28, 0xde, 0x81, 0x13, 0xa3, 0x55, 0x95, 0xc3, 0x74,
0x18, 0x6f, 0xc1, 0x62, 0x3f, 0xdb, 0x87, 0xf2, 0x2b, 0x49, 0xbf, 0x85, 0xdc, 0x3a, 0x81, 0x76,
0xee, 0x08, 0xb4, 0xf3, 0x53, 0xa4, 0x6c, 0x80, 0x99, 0x07, 0x72, 0x9b, 0x76, 0x59, 0xba, 0x8c,
0x9b, 0x9c, 0xcf, 0x0b, 0x70, 0x4a, 0x88, 0xfa, 0x3f, 0x1b, 0x82, 0x8d, 0x1f, 0x0a, 0x60, 0xa9,
0xec, 0x70, 0x93, 0x10, 0x3f, 0xfe, 0x27, 0xb9, 0x78, 0x0d, 0x60, 0x8f, 0xe0, 0x28, 0x1c, 0xe7,
0xa1, 0x2a, 0x2d, 0x7f, 0x89, 0x03, 0x1b, 0xca, 0x32, 0x48, 0x8e, 0x3f, 0x1b, 0x8a, 0xf3, 0x59,
0xf5, 0x4e, 0x7d, 0x3e, 0x57, 0x8e, 0x7d, 0x3e, 0xcb, 0x9f, 0xe9, 0xf3, 0xf9, 0xdb, 0x22, 0x2c,
0xb8, 0x09, 0xc3, 0x94, 0xff, 0x97, 0x13, 0xc9, 0x5a, 0x82, 0x2a, 0xc3, 0xdd, 0x58, 0xb4, 0xf0,
0xa6, 0x5d, 0x91, 0xf3, 0x23, 0x83, 0x98, 0x0d, 0x7a, 0x7e, 0x92, 0xe0, 0xc8, 0x6d, 0xda, 0x55,
0x25, 0x6d, 0x6e, 0xb0, 0x5e, 0x07, 0xe0, 0x24, 0xc6, 0x8c, 0xfb, 0x71, 0x9f, 0xd9, 0xd0, 0x28,
0x2e, 0x97, 0xd0, 0x98, 0x45, 0x9c, 0xcf, 0x34, 0xdd, 0x77, 0x9b, 0xcc, 0x36, 0x1b, 0x45, 0xd1,
0x60, 0xd5, 0xc8, 0xfa, 0x00, 0x2a, 0x34, 0xdd, 0xf7, 0x42, 0x9f, 0xfb, 0x76, 0x4d, 0x8a, 0x77,
0x6e, 0x2a, 0xd9, 0x1b, 0x51, 0xda, 0x41, 0x65, 0x9a, 0xee, 0x37, 0x7d, 0xee, 0x3b, 0xdf, 0x15,
0x60, 0xa1, 0x8d, 0x7d, 0x1a, 0xf4, 0x66, 0x17, 0xec, 0x5d, 0xa8, 0x53, 0xcc, 0x06, 0x11, 0xf7,
0x46, 0xb0, 0x94, 0x72, 0x27, 0x94, 0x7d, 0x33, 0x07, 0x97, 0x51, 0x5e, 0x3c, 0x82, 0xf2, 0xd2,
0x14, 0xca, 0x1d, 0xa8, 0x8d, 0xf1, 0xcb, 0xec, 0x39, 0x09, 0x7d, 0xc2, 0x66, 0xd5, 0xa1, 0x18,
0xb2, 0x48, 0x2a, 0x56, 0x45, 0xe2, 0xd3, 0xba, 0x08, 0x27, 0xfb, 0x91, 0x1f, 0xe0, 0x5e, 0x1a,
0x85, 0x98, 0x7a, 0x5d, 0x9a, 0x0e, 0xfa, 0x52, 0xae, 0x1a, 0xaa, 0x8f, 0x4d, 0xdc, 0x10, 0x76,
0x6b, 0x15, 0xe6, 0x1e, 0x0e, 0x30, 0x1d, 0x4a, 0xbd, 0x8e, 0x24, 0x4f, 0xf9, 0x39, 0xbf, 0x18,
0x23, 0xea, 0x04, 0x4a, 0x36, 0x03, 0x75, 0xb3, 0xdc, 0x54, 0xa6, 0xf2, 0x5d, 0x9c, 0xce, 0xf7,
0x79, 0x30, 0x63, 0xcc, 0x29, 0x09, 0x3c, 0x3e, 0xec, 0x67, 0x65, 0x00, 0xca, 0xb4, 0x3b, 0xec,
0xcb, 0x1a, 0xe8, 0x11, 0xae, 0x08, 0xad, 0x21, 0xf9, 0xed, 0xfc, 0x6c, 0xc0, 0x42, 0x13, 0x47,
0x98, 0xe3, 0xd9, 0x73, 0x62, 0x4a, 0xad, 0x16, 0xa6, 0xd6, 0xea, 0x44, 0x31, 0x14, 0x8f, 0x2e,
0x86, 0xd2, 0x53, 0xc5, 0x70, 0x01, 0x6a, 0x7d, 0x4a, 0x62, 0x9f, 0x0e, 0xbd, 0x07, 0x78, 0x98,
0xe5, 0x85, 0xa9, 0x6d, 0xb7, 0xf0, 0x90, 0x39, 0xdf, 0x18, 0x50, 0xb9, 0x1e, 0x0d, 0x58, 0x6f,
0xa6, 0x5b, 0xdd, 0x64, 0x29, 0x17, 0x0e, 0x96, 0xf2, 0xc1, 0xdc, 0x2d, 0x3e, 0x23, 0x77, 0x77,
0xfd, 0xae, 0x16, 0x61, 0xc2, 0xe6, 0xfc, 0x61, 0x40, 0x75, 0x2b, 0xf5, 0x43, 0xd9, 0x77, 0xfe,
0xf6, 0x5d, 0x2e, 0xc1, 0xa8, 0x75, 0x64, 0x1c, 0x8f, 0x7a, 0xc9, 0x58, 0x4f, 0x28, 0x4d, 0xf6,
0x84, 0xf3, 0x60, 0x12, 0xb1, 0x21, 0xaf, 0xef, 0xf3, 0x9e, 0x22, 0xb7, 0x8a, 0x40, 0x9a, 0x76,
0x84, 0x45, 0x34, 0x8d, 0xcc, 0x41, 0x36, 0x8d, 0xf9, 0x63, 0x37, 0x0d, 0x1d, 0x44, 0x36, 0x8d,
0xdf, 0x0b, 0x60, 0xb7, 0xd5, 0x66, 0x45, 0xa6, 0x13, 0xc6, 0x49, 0xc0, 0x6e, 0xf7, 0x43, 0xf9,
0xd4, 0x59, 0x82, 0x6a, 0x3b, 0x47, 0xa6, 0x9e, 0x14, 0x23, 0x83, 0xc8, 0x8f, 0x6d, 0x1c, 0xa7,
0x74, 0xd8, 0x26, 0x4f, 0xb0, 0x06, 0x3e, 0x66, 0x11, 0xd8, 0x5a, 0x83, 0x18, 0xa5, 0xfb, 0x4c,
0x4b, 0x93, 0x0d, 0x05, 0xb6, 0x40, 0xb6, 0x7a, 0x4f, 0xa4, 0x93, 0x44, 0x5e, 0x42, 0xa0, 0x4c,
0xe2, 0x1d, 0x60, 0x9d, 0x83, 0x0a, 0x4e, 0x42, 0x35, 0x3b, 0x27, 0x67, 0xcb, 0x38, 0x09, 0xe5,
0x94, 0x0b, 0x8b, 0xfa, 0x2d, 0x93, 0x32, 0x29, 0xa1, 0x3c, 0x74, 0xcc, 0x35, 0xe7, 0x90, 0x07,
0xdd, 0x36, 0xeb, 0xee, 0x68, 0x4f, 0xb4, 0xa0, 0x9e, 0x33, 0x7a, 0x68, 0x5d, 0x83, 0x9a, 0x58,
0x25, 0x0f, 0x54, 0x3e, 0x76, 0x20, 0x13, 0x27, 0x61, 0x1e, 0xc6, 0x81, 0x1a, 0x61, 0x2d, 0xbc,
0xaf, 0x99, 0x91, 0x67, 0x58, 0x05, 0x4d, 0xd8, 0x9c, 0xaf, 0x0c, 0x38, 0xf9, 0x14, 0xcd, 0x33,
0xe4, 0xda, 0x2d, 0xa8, 0xb4, 0x71, 0x57, 0x84, 0xc8, 0x5e, 0x71, 0xab, 0x87, 0x3d, 0xd2, 0x0f,
0x11, 0x15, 0xe5, 0x01, 0x9c, 0xfb, 0xb9, 0xf4, 0xb2, 0x46, 0xc5, 0xd3, 0x57, 0x1c, 0x3c, 0xe1,
0x0b, 0x28, 0x56, 0xe7, 0x33, 0x43, 0xbc, 0x54, 0x43, 0xfc, 0x58, 0x2e, 0xfd, 0x54, 0xf2, 0x1a,
0xb3, 0x24, 0xaf, 0x75, 0x09, 0x4e, 0x25, 0x83, 0xd8, 0xa3, 0x38, 0xf2, 0x39, 0x0e, 0x3d, 0xbd,
0x1a, 0xd3, 0xab, 0x5b, 0xc9, 0x20, 0x46, 0x6a, 0x4a, 0xc3, 0x64, 0xce, 0x97, 0x06, 0xc0, 0x75,
0x51, 0x61, 0x6a, 0x1b, 0x07, 0x8f, 0x10, 0xe3, 0xe8, 0x6b, 0x5b, 0x61, 0xb2, 0x44, 0x37, 0xb2,
0x12, 0x65, 0x52, 0x8f, 0xe2, 0x34, 0x0c, 0xb9, 0x1e, 0x23, 0xf0, 0xba, 0x8a, 0x95, 0x06, 0x5f,
0x1b, 0x50, 0x1b, 0x93, 0x8a, 0x4d, 0xd2, 0x68, 0x1c, 0x3c, 0x4d, 0x64, 0x4f, 0x11, 0x15, 0xe6,
0xb1, 0xb1, 0xa2, 0x8b, 0x47, 0x45, 0x77, 0x0e, 0x2a, 0x92, 0x92, 0xb1, 0xaa, 0x4b, 0x74, 0xd5,
0x5d, 0x84, 0x93, 0x14, 0x07, 0x38, 0xe1, 0xd1, 0xd0, 0x8b, 0xd3, 0x90, 0xec, 0x11, 0x1c, 0xca,
0xda, 0xab, 0xa0, 0x7a, 0x36, 0xb1, 0xad, 0xed, 0xce, 0x4f, 0x06, 0x2c, 0x7e, 0x2a, 0x5a, 0x6d,
0x2b, 0x0d, 0xb1, 0xda, 0xd9, 0xf3, 0xa7, 0xc4, 0x55, 0x89, 0x45, 0xd3, 0xa3, 0xd2, 0xf5, 0x8d,
0x67, 0xa7, 0x2b, 0x43, 0x15, 0xa6, 0x53, 0x54, 0x50, 0xac, 0xae, 0xe2, 0xc7, 0xa1, 0x78, 0x24,
0x2c, 0x52, 0x17, 0x78, 0x45, 0x71, 0x08, 0xe6, 0x58, 0xed, 0x8a, 0xb6, 0xa5, 0x7b, 0x9c, 0x6a,
0x8d, 0x86, 0x3c, 0x93, 0x4d, 0x6d, 0x93, 0xa7, 0xf2, 0x29, 0x98, 0x8b, 0x59, 0x37, 0xbf, 0x49,
0xa9, 0x81, 0x50, 0x26, 0xef, 0x7e, 0x92, 0xdb, 0x12, 0x1a, 0x19, 0xde, 0xfb, 0x08, 0xaa, 0xf9,
0xff, 0x62, 0x56, 0x1d, 0x6a, 0x6e, 0xcb, 0xdd, 0x75, 0xd7, 0xb7, 0xdc, 0x7b, 0x6e, 0xeb, 0x46,
0xfd, 0x25, 0xcb, 0x84, 0xf2, 0xcd, 0x6b, 0xeb, 0x5b, 0xbb, 0x37, 0xef, 0xd6, 0x0d, 0xab, 0x06,
0x95, 0xf5, 0x8d, 0xd6, 0x27, 0x68, 0x7b, 0x7d, 0xab, 0x5e, 0xd8, 0xb8, 0x76, 0x6f, 0xb3, 0x4b,
0x78, 0x6f, 0xd0, 0x11, 0x24, 0xae, 0x3e, 0x21, 0x51, 0x44, 0x9e, 0x70, 0x1c, 0xf4, 0x56, 0x15,
0xca, 0xf7, 0x43, 0xc2, 0x38, 0x25, 0x9d, 0x01, 0xc7, 0xe1, 0x6a, 0x86, 0x75, 0x55, 0x42, 0xcf,
0x87, 0xfd, 0xce, 0x5a, 0x67, 0x5e, 0x9a, 0x2e, 0xff, 0x19, 0x00, 0x00, 0xff, 0xff, 0x23, 0xe9,
0x2e, 0x4b, 0x3d, 0x14, 0x00, 0x00,
}
......@@ -444,8 +444,6 @@ func (node *NodeImpl) GetIndexState(request *milvuspb.IndexStateRequest) (*milvu
dipt := &GetIndexStateTask{
Condition: NewTaskCondition(ctx),
IndexStateRequest: request,
indexServiceClient: node.indexServiceClient,
masterClientInterface: node.masterClient,
}
err := node.sched.DdQueue.Enqueue(dipt)
......
......@@ -23,7 +23,6 @@ type MasterClient interface {
CreateIndex(in *milvuspb.CreateIndexRequest) (*commonpb.Status, error)
DescribeIndex(in *milvuspb.DescribeIndexRequest) (*milvuspb.DescribeIndexResponse, error)
ShowSegments(in *milvuspb.ShowSegmentRequest) (*milvuspb.ShowSegmentResponse, error)
DescribeSegment(in *milvuspb.DescribeSegmentRequest) (*milvuspb.DescribeSegmentResponse, error)
}
type IndexServiceClient interface {
......
......@@ -6,8 +6,6 @@ import (
"math"
"strconv"
"github.com/zilliztech/milvus-distributed/internal/proto/indexpb"
"github.com/zilliztech/milvus-distributed/internal/proto/datapb"
"github.com/golang/protobuf/proto"
......@@ -1288,7 +1286,6 @@ type GetIndexStateTask struct {
Condition
*milvuspb.IndexStateRequest
indexServiceClient IndexServiceClient
masterClientInterface MasterClient
result *milvuspb.IndexStateResponse
}
......@@ -1339,98 +1336,17 @@ func (dipt *GetIndexStateTask) PreExecute() error {
}
func (dipt *GetIndexStateTask) Execute() error {
collectionName := dipt.CollectionName
collectionID, err := globalMetaCache.GetCollectionID(collectionName)
if err != nil { // err is not nil if collection not exists
return err
}
showPartitionRequest := &milvuspb.ShowPartitionRequest{
Base: &commonpb.MsgBase{
MsgType: commonpb.MsgType_kShowPartitions,
MsgID: dipt.Base.MsgID,
Timestamp: dipt.Base.Timestamp,
SourceID: Params.ProxyID,
},
DbName: dipt.DbName,
CollectionName: collectionName,
CollectionID: collectionID,
}
partitions, err := dipt.masterClientInterface.ShowPartitions(showPartitionRequest)
if err != nil {
return err
}
for _, partitionID := range partitions.PartitionIDs {
showSegmentsRequest := &milvuspb.ShowSegmentRequest{
Base: &commonpb.MsgBase{
MsgType: commonpb.MsgType_kShowSegment,
MsgID: dipt.Base.MsgID,
Timestamp: dipt.Base.Timestamp,
SourceID: Params.ProxyID,
},
CollectionID: collectionID,
PartitionID: partitionID,
}
segments, err := dipt.masterClientInterface.ShowSegments(showSegmentsRequest)
if err != nil {
return err
}
getIndexStatesRequest := &indexpb.IndexStatesRequest{
IndexBuildIDs: make([]UniqueID, 0),
}
for _, segmentID := range segments.SegmentIDs {
describeSegmentRequest := &milvuspb.DescribeSegmentRequest{
Base: &commonpb.MsgBase{
MsgType: commonpb.MsgType_kDescribeSegment,
MsgID: dipt.Base.MsgID,
Timestamp: dipt.Base.Timestamp,
SourceID: Params.ProxyID,
},
CollectionID: collectionID,
SegmentID: segmentID,
}
segmentDesc, err := dipt.masterClientInterface.DescribeSegment(describeSegmentRequest)
if err != nil {
return err
}
getIndexStatesRequest.IndexBuildIDs = append(getIndexStatesRequest.IndexBuildIDs, segmentDesc.BuildID)
}
states, err := dipt.indexServiceClient.GetIndexStates(getIndexStatesRequest)
if err != nil {
return err
}
if states.Status.ErrorCode != commonpb.ErrorCode_SUCCESS {
dipt.result = &milvuspb.IndexStateResponse{
Status: states.Status,
State: commonpb.IndexState_FAILED,
}
return nil
}
for _, state := range states.States {
if state.State != commonpb.IndexState_FINISHED {
dipt.result = &milvuspb.IndexStateResponse{
Status: states.Status,
State: state.State,
}
return nil
}
}
}
// TODO: use index service client
//var err error
//dipt.result, err = dipt.masterClient.GetIndexState(dipt.IndexStateRequest)
//return err
dipt.result = &milvuspb.IndexStateResponse{
Status: &commonpb.Status{
ErrorCode: commonpb.ErrorCode_SUCCESS,
ErrorCode: 0,
Reason: "",
},
State: commonpb.IndexState_FINISHED,
}
return nil
}
......
......@@ -383,7 +383,7 @@ func (s *loadService) releaseSegment(segmentID UniqueID) error {
return err
}
func (s *loadService) seekSegment(positions []*internalpb2.MsgPosition) error {
func (s *loadService) seekSegment(position *internalpb2.MsgPosition) error {
// TODO: open seek
//for _, position := range positions {
// err := s.dmStream.Seek(position)
......
......@@ -446,8 +446,8 @@ func (node *QueryNode) LoadSegments(in *queryPb.LoadSegmentRequest) (*commonpb.S
// segments are ordered before LoadSegments calling
if in.LastSegmentState.State == commonpb.SegmentState_SegmentGrowing {
segmentNum := len(segmentIDs)
positions := in.LastSegmentState.StartPositions
err = node.loadService.seekSegment(positions)
position := in.LastSegmentState.StartPosition
err = node.loadService.seekSegment(position)
if err != nil {
status := &commonpb.Status{
ErrorCode: commonpb.ErrorCode_UNEXPECTED_ERROR,
......
......@@ -318,14 +318,14 @@ func (qs *QueryService) LoadPartitions(req *querypb.LoadPartitionRequest) (*comm
segmentID := state.SegmentID
segmentStates[segmentID] = state
var flatChannelName string
channelNames := make([]string, 0)
for i, str := range state.StartPositions {
flatChannelName += str.ChannelName
channelNames = append(channelNames, str.ChannelName)
if i+1 < len(state.StartPositions) {
flatChannelName += "/"
}
}
// channelNames := make([]string, 0)
// for i, str := range state.StartPositions {
// flatChannelName += str.ChannelName
// channelNames = append(channelNames, str.ChannelName)
// if i+1 < len(state.StartPositions) {
// flatChannelName += "/"
// }
// }
if flatChannelName == "" {
log.Fatal("segmentState's channel name is empty")
}
......@@ -365,8 +365,8 @@ func (qs *QueryService) LoadPartitions(req *querypb.LoadPartitionRequest) (*comm
if channels == node.insertChannels {
statesID := id2segs[i][len(id2segs[i])-1]
//TODO :: should be start position
position := segmentStates[statesID-1].StartPositions
segmentStates[statesID].StartPositions = position
// position := segmentStates[statesID-1].StartPositions
// segmentStates[statesID].StartPositions = position
loadSegmentRequest := &querypb.LoadSegmentRequest{
CollectionID: collectionID,
PartitionID: partitionID,
......
......@@ -118,7 +118,7 @@ func newDataMock() *dataMock {
SegmentID: segmentID,
State: state,
CreateTime: time,
StartPositions: position,
// StartPositions: position,
}
}
segmentStates := make(map[UniqueID]*datapb.SegmentStateInfo)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册