Skip to content

Commit c9c6575

Browse files
committed
fix(embedded/tbtree): add marker entry to store timestamp when tree is empty
Signed-off-by: Stefano Scafiti <[email protected]>
1 parent cdd00cb commit c9c6575

File tree

3 files changed

+49
-6
lines changed

3 files changed

+49
-6
lines changed

embedded/tbtree/snapshot.go

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -505,11 +505,23 @@ func (l *leafNode) writeTo(nw, hw io.Writer, writeOpts *WriteOpts, buf []byte) (
505505
buf[bi] = LeafNodeType
506506
bi++
507507

508-
binary.BigEndian.PutUint16(buf[bi:], uint16(len(l.values)))
509-
bi += 2
508+
if len(l.values) == 0 && l._ts > 0 {
509+
// NOTE: we store a marker entry to remember the highest timestamp seen
510510

511-
accH := int64(0)
511+
binary.BigEndian.PutUint16(buf[bi:], 1)
512+
bi += 2
512513

514+
binary.BigEndian.PutUint16(buf[bi:], 0)
515+
bi += 2
516+
517+
binary.BigEndian.PutUint64(buf[bi:], l._ts)
518+
bi += 8
519+
} else {
520+
binary.BigEndian.PutUint16(buf[bi:], uint16(len(l.values)))
521+
bi += 2
522+
}
523+
524+
accH := int64(0)
513525
for _, v := range l.values {
514526
timedValue := v.timedValues[0]
515527

embedded/tbtree/tbtree.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -825,7 +825,6 @@ func (t *TBtree) readNodeFrom(r *appendable.Reader) (node, error) {
825825
n.off = off
826826
return n, nil
827827
}
828-
829828
return nil, ErrReadingFileContent
830829
}
831830

@@ -914,6 +913,16 @@ func (t *TBtree) readLeafNodeFrom(r *appendable.Reader) (*leafNode, error) {
914913
return nil, err
915914
}
916915

916+
if ksize == 0 {
917+
ts, err := r.ReadUint64()
918+
if err != nil {
919+
return nil, err
920+
}
921+
922+
l._ts = ts
923+
return l, nil
924+
}
925+
917926
key := make([]byte, ksize)
918927
_, err = r.Read(key)
919928
if err != nil {
@@ -959,7 +968,6 @@ func (t *TBtree) readLeafNodeFrom(r *appendable.Reader) (*leafNode, error) {
959968
l._ts = ts
960969
}
961970
}
962-
963971
return l, nil
964972
}
965973

@@ -1607,7 +1615,6 @@ func (t *TBtree) IncreaseTs(ts uint64) error {
16071615
_, _, err := t.flushTree(t.cleanupPercentage, false, false, "increaseTs")
16081616
return err
16091617
}
1610-
16111618
return nil
16121619
}
16131620

embedded/tbtree/tbtree_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1314,6 +1314,30 @@ func TestTBTreeIncreaseTs(t *testing.T) {
13141314
require.ErrorIs(t, err, ErrAlreadyClosed)
13151315
}
13161316

1317+
func TestTBTreeFlushEmptyTree(t *testing.T) {
1318+
dir := t.TempDir()
1319+
t.Cleanup(func() {
1320+
os.RemoveAll(dir)
1321+
})
1322+
1323+
tbtree, err := Open(dir, DefaultOptions())
1324+
require.NoError(t, err)
1325+
1326+
err = tbtree.IncreaseTs(100)
1327+
require.NoError(t, err)
1328+
1329+
_, _, err = tbtree.Flush()
1330+
require.NoError(t, err)
1331+
1332+
err = tbtree.Close()
1333+
require.NoError(t, err)
1334+
1335+
tbtree, err = Open(dir, DefaultOptions())
1336+
require.NoError(t, err)
1337+
1338+
require.Equal(t, tbtree.Ts(), uint64(100))
1339+
}
1340+
13171341
func BenchmarkRandomInsertion(b *testing.B) {
13181342
seed := rand.NewSource(time.Now().UnixNano())
13191343
rnd := rand.New(seed)

0 commit comments

Comments
 (0)