Skip to content
Snippets Groups Projects
Commit 06620935 authored by Bingyi Sun 【孙秉义】's avatar Bingyi Sun 【孙秉义】 Committed by yefu.chen
Browse files

Move expire timestamp to SegIDAssignment


Signed-off-by: default avatarsunby <bingyi.sun@zilliz.com>
parent 9694203f
No related branches found
No related tags found
No related merge requests found
......@@ -180,7 +180,7 @@ func (sa *SegIDAssigner) syncSegments() {
}
now := time.Now()
expiredTime := now.Add(time.Millisecond * time.Duration(resp.ExpireDuration))
expiredTime := now.Add(time.Millisecond * time.Duration(1000))
for _, info := range resp.PerChannelAssignment {
sa.removeSegInfo(info.CollName, info.PartitionTag, info.ChannelID)
}
......
......@@ -443,19 +443,11 @@ func (s *Master) AssignSegmentID(ctx context.Context, request *internalpb.Assign
Status: &commonpb.Status{ErrorCode: commonpb.ErrorCode_UNEXPECTED_ERROR},
}, nil
}
ts, err := s.tsoAllocator.AllocOne()
if err != nil {
return &internalpb.AssignSegIDResponse{
Status: &commonpb.Status{ErrorCode: commonpb.ErrorCode_UNEXPECTED_ERROR},
}, nil
}
return &internalpb.AssignSegIDResponse{
Status: &commonpb.Status{
ErrorCode: commonpb.ErrorCode_SUCCESS,
Reason: "",
},
Timestamp: ts,
ExpireDuration: 10000,
PerChannelAssignment: segInfos,
}, nil
}
......@@ -38,6 +38,11 @@ type SegmentAssigner struct {
mu sync.Mutex
}
type AssignResult struct {
isSuccess bool
expireTime Timestamp
}
func (assigner *SegmentAssigner) OpenSegment(segmentID UniqueID, numRows int) error {
assigner.mu.Lock()
defer assigner.mu.Unlock()
......@@ -64,31 +69,33 @@ func (assigner *SegmentAssigner) CloseSegment(segmentID UniqueID) error {
return nil
}
func (assigner *SegmentAssigner) Assign(segmentID UniqueID, numRows int) (bool, error) {
func (assigner *SegmentAssigner) Assign(segmentID UniqueID, numRows int) (*AssignResult, error) {
assigner.mu.Lock()
defer assigner.mu.Unlock()
res := &AssignResult{false, 0}
status, ok := assigner.segmentStatus[segmentID]
if !ok {
return false, errors.Errorf("segment %d is not opened", segmentID)
return res, errors.Errorf("segment %d is not opened", segmentID)
}
allocated, err := assigner.totalOfAssignments(segmentID)
if err != nil {
return false, err
return res, err
}
segMeta, err := assigner.mt.GetSegmentByID(segmentID)
if err != nil {
return false, err
return res, err
}
free := status.total - int(segMeta.NumRows) - allocated
if numRows > free {
return false, nil
return res, nil
}
ts, err := assigner.globalTSOAllocator()
if err != nil {
return false, err
return res, err
}
physicalTs, logicalTs := tsoutil.ParseTS(ts)
expirePhysicalTs := physicalTs.Add(time.Duration(assigner.segmentExpireDuration))
......@@ -99,7 +106,9 @@ func (assigner *SegmentAssigner) Assign(segmentID UniqueID, numRows int) (bool,
ts,
})
return true, nil
res.isSuccess = true
res.expireTime = expireTs
return res, nil
}
func (assigner *SegmentAssigner) CheckAssignmentExpired(segmentID UniqueID, timestamp Timestamp) (bool, error) {
......
......@@ -87,11 +87,11 @@ func TestSegmentManager_AssignSegmentID(t *testing.T) {
assert.Nil(t, err)
result, err := segAssigner.Assign(100, 10000)
assert.Nil(t, err)
assert.True(t, result)
assert.True(t, result.isSuccess)
result, err = segAssigner.Assign(100, 95000)
assert.Nil(t, err)
assert.False(t, result)
assert.False(t, result.isSuccess)
time.Sleep(2 * time.Second)
timestamp, err = globalTsoAllocator()
......@@ -109,7 +109,7 @@ func TestSegmentManager_AssignSegmentID(t *testing.T) {
time.Sleep(500 * time.Millisecond)
result, err = segAssigner.Assign(100, 100000)
assert.Nil(t, err)
assert.True(t, result)
assert.True(t, result.isSuccess)
err = segAssigner.CloseSegment(100)
assert.Nil(t, err)
......@@ -132,8 +132,8 @@ func TestSegmentManager_AssignSegmentID(t *testing.T) {
assert.Nil(t, err)
result, err = segAssigner.Assign(200, 10001)
assert.Nil(t, err)
assert.False(t, result)
assert.False(t, result.isSuccess)
result, err = segAssigner.Assign(200, 10000)
assert.Nil(t, err)
assert.True(t, result)
assert.True(t, result.isSuccess)
}
......@@ -114,7 +114,7 @@ func (manager *SegmentManager) assignSegment(
if err != nil {
return nil, err
}
if !result {
if !result.isSuccess {
continue
}
......@@ -124,6 +124,7 @@ func (manager *SegmentManager) assignSegment(
Count: count,
CollName: collName,
PartitionTag: partitionTag,
ExpireTime: result.expireTime,
}, nil
}
......@@ -145,7 +146,7 @@ func (manager *SegmentManager) assignSegment(
if err != nil {
return nil, err
}
if !result {
if !result.isSuccess {
return nil, errors.Errorf("assign failed for segment %d", id)
}
return &internalpb.SegIDAssignment{
......@@ -154,6 +155,7 @@ func (manager *SegmentManager) assignSegment(
Count: count,
CollName: collName,
PartitionTag: partitionTag,
ExpireTime: result.expireTime,
}, nil
}
......
......@@ -94,13 +94,12 @@ message SegIDAssignment {
uint32 count = 3;
string coll_name = 4;
string partition_tag = 5;
uint64 expire_time = 6;
}
message AssignSegIDResponse {
common.Status status = 1;
uint64 timestamp = 2;
uint64 expire_duration = 3;
repeated SegIDAssignment per_channel_assignment = 4;
repeated SegIDAssignment per_channel_assignment = 2;
}
message CreateCollectionRequest {
......
This diff is collapsed.
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment