@@ -391,6 +391,71 @@ func TestPartitionIntegration(t *testing.T) {
391391 require .Len (t , deletedKeys , 0 )
392392}
393393
394+ func TestFlushMemtable (t * testing.T ) {
395+ // create temp directory for test db
396+ tempDir := t .TempDir ()
397+ path := filepath .Join (tempDir , "test-db" )
398+
399+ // set up db with a configuration that will trigger a GC after multiple partitions
400+ db , err := badger .OpenManaged (badger .DefaultOptions (path ).WithNumVersionsToKeep (math .MaxInt64 ).
401+ WithValueThreshold (1 ).WithLoggingLevel (badger .INFO ).WithMemTableSize (int64 (units .GB )))
402+ require .NoError (t , err )
403+ // set up the store
404+ store , err := NewStoreWithDB (db , nil , lib .NewDefaultLogger (), true )
405+ require .NoError (t , err )
406+ defer func () {
407+ require .NoError (t , store .Close ())
408+ }()
409+
410+ // insert large dataset at various heights before partition boundary
411+ var k []byte
412+ keys := [][]byte {
413+ bytes .Repeat ([]byte ("0" ), 32 ),
414+ bytes .Repeat ([]byte ("1" ), 32 ),
415+ bytes .Repeat ([]byte ("2" ), 32 ),
416+ bytes .Repeat ([]byte ("3" ), 32 ),
417+ bytes .Repeat ([]byte ("4" ), 32 ),
418+ bytes .Repeat ([]byte ("5" ), 32 ),
419+ bytes .Repeat ([]byte ("6" ), 32 ),
420+ bytes .Repeat ([]byte ("7" ), 32 ),
421+ bytes .Repeat ([]byte ("8" ), 32 ),
422+ bytes .Repeat ([]byte ("9" ), 32 ),
423+ }
424+ iterations := 1000
425+ for i := 1 ; i < iterations ; i ++ {
426+ // if not the first iteration
427+ if i != 0 {
428+ // delete the last key in the db
429+ require .NoError (t , store .Delete (k ))
430+ }
431+ // use a key to be updated repeatedly to generate versions
432+ k = keys [i % 10 ]
433+
434+ // set the value in the db
435+ require .NoError (t , store .Set (k , nil ))
436+
437+ // commit regularly to create multiple versions
438+ _ , err = store .Commit ()
439+ require .NoError (t , err )
440+ }
441+ db .SetDiscardTs (uint64 (iterations - 1 ))
442+ require .NoError (t , FlushMemTable (db ))
443+ require .NoError (t , db .Flatten (32 ))
444+
445+ // use an archive iterator to iterate through the deleted keys
446+ iterator , err := store .lss .ArchiveIterator (nil )
447+ require .NoError (t , err )
448+ it := iterator .(* Iterator )
449+ defer it .Close ()
450+
451+ numKeys := 0
452+ for ; it .Valid (); it .Next () {
453+ numKeys ++
454+ }
455+
456+ require .True (t , numKeys == 1 )
457+ }
458+
394459func TestHistoricalPrefix (t * testing.T ) {
395460 tests := []struct {
396461 name string
0 commit comments