fix: double buffer was invalid when put entry which size larger than max size (#31549)

relate: https://github.com/milvus-io/milvus/issues/31548

---------

Signed-off-by: aoiasd <zhicheng.yue@zilliz.com>
pull/31559/head
aoiasd 2024-03-23 21:09:07 +08:00 committed by GitHub
parent 368180bce4
commit 7c234f23c3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 60 additions and 4 deletions

View File

@ -64,8 +64,7 @@ func (c *doubleCacheBuffer[T]) Put(entry T) {
err := c.head.Put(entry) err := c.head.Put(entry)
if errors.Is(err, errBufferFull) { if errors.Is(err, errBufferFull) {
c.evict(entry.Timestamp()) c.evict(entry.Timestamp(), entry)
c.head.Put(entry)
} }
} }
@ -84,9 +83,14 @@ func (c *doubleCacheBuffer[T]) ListAfter(ts uint64) []T {
} }
// evict sets head as tail and evicts tail. // evict sets head as tail and evicts tail.
func (c *doubleCacheBuffer[T]) evict(newTs uint64) { func (c *doubleCacheBuffer[T]) evict(newTs uint64, entry T) {
c.tail = c.head c.tail = c.head
c.head = newDoubleCacheItem[T](newTs, c.maxSize/2) c.head = &doubleCacheItem[T]{
headTs: newTs,
maxSize: c.maxSize / 2,
size: entry.Size(),
data: []T{entry},
}
c.ts = c.tail.headTs c.ts = c.tail.headTs
} }

View File

@ -78,6 +78,58 @@ func (s *DoubleCacheBufferSuite) TestCache() {
s.Equal(1, len(buffer.ListAfter(12))) s.Equal(1, len(buffer.ListAfter(12)))
} }
func (s *DoubleCacheBufferSuite) TestPut() {
buffer := NewDoubleCacheDeleteBuffer[*Item](10, 1)
buffer.Put(&Item{
Ts: 11,
Data: []BufferItem{
{
PartitionID: 200,
DeleteData: storage.DeleteData{
Pks: []storage.PrimaryKey{storage.NewVarCharPrimaryKey("test1")},
Tss: []uint64{11},
RowCount: 1,
},
},
},
})
buffer.Put(&Item{
Ts: 12,
Data: []BufferItem{
{
PartitionID: 200,
DeleteData: storage.DeleteData{
Pks: []storage.PrimaryKey{storage.NewVarCharPrimaryKey("test2")},
Tss: []uint64{12},
RowCount: 1,
},
},
},
})
s.Equal(2, len(buffer.ListAfter(11)))
s.Equal(1, len(buffer.ListAfter(12)))
buffer.Put(&Item{
Ts: 13,
Data: []BufferItem{
{
PartitionID: 200,
DeleteData: storage.DeleteData{
Pks: []storage.PrimaryKey{storage.NewVarCharPrimaryKey("test3")},
Tss: []uint64{13},
RowCount: 1,
},
},
},
})
s.Equal(2, len(buffer.ListAfter(11)))
s.Equal(2, len(buffer.ListAfter(12)))
s.Equal(1, len(buffer.ListAfter(13)))
}
func TestDoubleCacheDeleteBuffer(t *testing.T) { func TestDoubleCacheDeleteBuffer(t *testing.T) {
suite.Run(t, new(DoubleCacheBufferSuite)) suite.Run(t, new(DoubleCacheBufferSuite))
} }