@@ -661,4 +661,87 @@ mod tests {
661661 do_read_write_remove_list_persist ( & vss_store) ;
662662 drop ( vss_store)
663663 }
664+
665+ #[ tokio:: test( flavor = "multi_thread" , worker_threads = 1 ) ]
666+ async fn vss_lazy_delete ( ) {
667+ let vss_base_url = std:: env:: var ( "TEST_VSS_BASE_URL" ) . unwrap ( ) ;
668+ let mut rng = thread_rng ( ) ;
669+ let rand_store_id: String = ( 0 ..7 ) . map ( |_| rng. sample ( Alphanumeric ) as char ) . collect ( ) ;
670+ let mut vss_seed = [ 0u8 ; 32 ] ;
671+ rng. fill_bytes ( & mut vss_seed) ;
672+ let header_provider = Arc :: new ( FixedHeaders :: new ( HashMap :: new ( ) ) ) ;
673+ let logger = Arc :: new ( Logger :: new_log_facade ( ) ) ;
674+ let runtime = Arc :: new ( Runtime :: new ( logger) . unwrap ( ) ) ;
675+ let vss_store =
676+ VssStore :: new ( vss_base_url, rand_store_id, vss_seed, header_provider, runtime) ;
677+
678+ let primary_namespace = "test_namespace" ;
679+ let secondary_namespace = "" ;
680+ let key_to_delete = "key_to_delete" ;
681+ let key_for_trigger = "key_for_trigger" ;
682+ let data_to_delete = b"data_to_delete" . to_vec ( ) ;
683+ let trigger_data = b"trigger_data" . to_vec ( ) ;
684+
685+ // Write the key that we'll later lazily delete
686+ KVStore :: write (
687+ & vss_store,
688+ primary_namespace,
689+ secondary_namespace,
690+ key_to_delete,
691+ data_to_delete. clone ( ) ,
692+ )
693+ . await
694+ . unwrap ( ) ;
695+
696+ // Verify the key exists
697+ let read_data =
698+ KVStore :: read ( & vss_store, primary_namespace, secondary_namespace, key_to_delete)
699+ . await
700+ . unwrap ( ) ;
701+ assert_eq ! ( read_data, data_to_delete) ;
702+
703+ // Perform a lazy delete
704+ KVStore :: remove ( & vss_store, primary_namespace, secondary_namespace, key_to_delete, true )
705+ . await
706+ . unwrap ( ) ;
707+
708+ // Verify the key still exists (lazy delete doesn't immediately remove it)
709+ let read_data =
710+ KVStore :: read ( & vss_store, primary_namespace, secondary_namespace, key_to_delete)
711+ . await
712+ . unwrap ( ) ;
713+ assert_eq ! ( read_data, data_to_delete) ;
714+
715+ // Verify the key is still in the list
716+ let keys = KVStore :: list ( & vss_store, primary_namespace, secondary_namespace) . await . unwrap ( ) ;
717+ assert ! ( keys. contains( & key_to_delete. to_string( ) ) ) ;
718+
719+ // Trigger the actual deletion by performing a write operation
720+ KVStore :: write (
721+ & vss_store,
722+ primary_namespace,
723+ secondary_namespace,
724+ key_for_trigger,
725+ trigger_data. clone ( ) ,
726+ )
727+ . await
728+ . unwrap ( ) ;
729+
730+ // Now verify the key is actually deleted
731+ let read_result =
732+ KVStore :: read ( & vss_store, primary_namespace, secondary_namespace, key_to_delete) . await ;
733+ assert ! ( read_result. is_err( ) ) ;
734+ assert_eq ! ( read_result. unwrap_err( ) . kind( ) , ErrorKind :: NotFound ) ;
735+
736+ // Verify the key is no longer in the list
737+ let keys = KVStore :: list ( & vss_store, primary_namespace, secondary_namespace) . await . unwrap ( ) ;
738+ assert ! ( !keys. contains( & key_to_delete. to_string( ) ) ) ;
739+
740+ // Verify the trigger key still exists
741+ let read_data =
742+ KVStore :: read ( & vss_store, primary_namespace, secondary_namespace, key_for_trigger)
743+ . await
744+ . unwrap ( ) ;
745+ assert_eq ! ( read_data, trigger_data) ;
746+ }
664747}
0 commit comments