@@ -1314,6 +1314,100 @@ func TestTBTreeIncreaseTs(t *testing.T) {
13141314 require .ErrorIs (t , err , ErrAlreadyClosed )
13151315}
13161316
1317+ func TestTBTreeFlushAfterIncreaseTs (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+ t .Run ("increase ts to empty tree" , func (t * testing.T ) {
1327+ err = tbtree .IncreaseTs (100 )
1328+ require .NoError (t , err )
1329+
1330+ _ , _ , err = tbtree .Flush ()
1331+ require .NoError (t , err )
1332+
1333+ err = tbtree .Close ()
1334+ require .NoError (t , err )
1335+
1336+ tbtree , err = Open (dir , DefaultOptions ())
1337+ require .NoError (t , err )
1338+
1339+ require .Equal (t , tbtree .Ts (), uint64 (100 ))
1340+ })
1341+
1342+ insertValues := func (n int ) {
1343+ for i := 0 ; i < n ; i ++ {
1344+ var buf [4 ]byte
1345+ binary .BigEndian .PutUint32 (buf [:], uint32 (i ))
1346+
1347+ err := tbtree .Insert (
1348+ buf [:],
1349+ buf [:],
1350+ )
1351+ require .NoError (t , err )
1352+ }
1353+ }
1354+
1355+ t .Run ("increase ts after insertions" , func (t * testing.T ) {
1356+ insertValues (10 )
1357+ require .Equal (t , uint64 (110 ), tbtree .Ts ())
1358+
1359+ err := tbtree .IncreaseTs (200 )
1360+ require .NoError (t , err )
1361+
1362+ _ , _ , err = tbtree .Flush ()
1363+ require .NoError (t , err )
1364+
1365+ err = tbtree .Close ()
1366+ require .NoError (t , err )
1367+
1368+ tbtree , err = Open (dir , DefaultOptions ())
1369+ require .NoError (t , err )
1370+
1371+ require .Equal (t , uint64 (200 ), tbtree .Ts ())
1372+
1373+ ln , isLeaf := tbtree .root .(* leafNode )
1374+ require .True (t , isLeaf )
1375+
1376+ require .Equal (t , uint64 (200 ), ln .ts ())
1377+ require .Len (t , ln .values , 10 )
1378+
1379+ for _ , v := range ln .values {
1380+ require .Less (t , v .timedValue ().Ts , ln .ts ())
1381+ }
1382+ })
1383+
1384+ t .Run ("increase ts after more insertions" , func (t * testing.T ) {
1385+ insertValues (1000 )
1386+ require .Equal (t , uint64 (1200 ), tbtree .Ts ())
1387+
1388+ err := tbtree .IncreaseTs (2500 )
1389+ require .NoError (t , err )
1390+
1391+ _ , _ , err = tbtree .Flush ()
1392+ require .NoError (t , err )
1393+
1394+ err = tbtree .Close ()
1395+ require .NoError (t , err )
1396+
1397+ tbtree , err = Open (dir , DefaultOptions ())
1398+ require .NoError (t , err )
1399+
1400+ require .Equal (t , uint64 (2500 ), tbtree .Ts ())
1401+
1402+ nd , isInner := tbtree .root .(* innerNode )
1403+ require .True (t , isInner )
1404+
1405+ for _ , child := range nd .nodes {
1406+ require .Less (t , child .ts (), nd .ts ())
1407+ }
1408+ })
1409+ }
1410+
13171411func BenchmarkRandomInsertion (b * testing.B ) {
13181412 seed := rand .NewSource (time .Now ().UnixNano ())
13191413 rnd := rand .New (seed )
0 commit comments