@@ -1314,6 +1314,97 @@ 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+ err := tbtree .Insert (
1345+ binary .BigEndian .AppendUint32 (nil , uint32 (i )),
1346+ binary .BigEndian .AppendUint32 (nil , uint32 (i )),
1347+ )
1348+ require .NoError (t , err )
1349+ }
1350+ }
1351+
1352+ t .Run ("increase ts after insertions" , func (t * testing.T ) {
1353+ insertValues (10 )
1354+ require .Equal (t , uint64 (110 ), tbtree .Ts ())
1355+
1356+ err := tbtree .IncreaseTs (200 )
1357+ require .NoError (t , err )
1358+
1359+ _ , _ , err = tbtree .Flush ()
1360+ require .NoError (t , err )
1361+
1362+ err = tbtree .Close ()
1363+ require .NoError (t , err )
1364+
1365+ tbtree , err = Open (dir , DefaultOptions ())
1366+ require .NoError (t , err )
1367+
1368+ require .Equal (t , uint64 (200 ), tbtree .Ts ())
1369+
1370+ ln , isLeaf := tbtree .root .(* leafNode )
1371+ require .True (t , isLeaf )
1372+
1373+ require .Equal (t , uint64 (200 ), ln .ts ())
1374+ require .Len (t , ln .values , 10 )
1375+
1376+ for _ , v := range ln .values {
1377+ require .Less (t , v .timedValue ().Ts , ln .ts ())
1378+ }
1379+ })
1380+
1381+ t .Run ("increase ts after more insertions" , func (t * testing.T ) {
1382+ insertValues (1000 )
1383+ require .Equal (t , uint64 (1200 ), tbtree .Ts ())
1384+
1385+ err := tbtree .IncreaseTs (2500 )
1386+ require .NoError (t , err )
1387+
1388+ _ , _ , err = tbtree .Flush ()
1389+ require .NoError (t , err )
1390+
1391+ err = tbtree .Close ()
1392+ require .NoError (t , err )
1393+
1394+ tbtree , err = Open (dir , DefaultOptions ())
1395+ require .NoError (t , err )
1396+
1397+ require .Equal (t , uint64 (2500 ), tbtree .Ts ())
1398+
1399+ nd , isInner := tbtree .root .(* innerNode )
1400+ require .True (t , isInner )
1401+
1402+ for _ , child := range nd .nodes {
1403+ require .Less (t , child .ts (), nd .ts ())
1404+ }
1405+ })
1406+ }
1407+
13171408func BenchmarkRandomInsertion (b * testing.B ) {
13181409 seed := rand .NewSource (time .Now ().UnixNano ())
13191410 rnd := rand .New (seed )
0 commit comments