1+ use core:: hash:: { BuildHasher , Hasher } ;
12use lightning:: util:: persist:: { KVStore , KVStoreSync } ;
23use lightning_persister:: fs_store:: FilesystemStore ;
34use std:: fs;
45use tokio:: runtime:: Runtime ;
5- use uuid:: Uuid ;
66
77use crate :: utils:: test_logger;
88
@@ -20,7 +20,8 @@ impl TempFilesystemStore {
2020 std:: env:: temp_dir ( )
2121 } ;
2222
23- let random_folder_name = format ! ( "fs_store_fuzz_{}" , Uuid :: new_v4( ) ) ;
23+ let random_number = std:: collections:: hash_map:: RandomState :: new ( ) . build_hasher ( ) . finish ( ) ;
24+ let random_folder_name = format ! ( "fs_store_fuzz_{:016x}" , random_number) ;
2425 temp_path. push ( random_folder_name) ;
2526
2627 let inner = FilesystemStore :: new ( temp_path. clone ( ) ) ;
@@ -46,10 +47,11 @@ async fn do_test_internal<Out: test_logger::Output>(data: &[u8], _out: Out) {
4647 ( $len: expr) => { {
4748 let slice_len = $len as usize ;
4849 if data. len( ) < read_pos + slice_len {
49- return ;
50+ None
51+ } else {
52+ read_pos += slice_len;
53+ Some ( & data[ read_pos - slice_len..read_pos] )
5054 }
51- read_pos += slice_len;
52- & data[ read_pos - slice_len..read_pos]
5355 } } ;
5456 }
5557
@@ -72,7 +74,10 @@ async fn do_test_internal<Out: test_logger::Output>(data: &[u8], _out: Out) {
7274
7375 let mut handles = Vec :: new ( ) ;
7476 loop {
75- let v = get_slice ! ( 1 ) [ 0 ] ;
77+ let v = match get_slice ! ( 1 ) {
78+ Some ( b) => b[ 0 ] ,
79+ None => break ,
80+ } ;
7681 match v % 13 {
7782 // Sync write
7883 0 => {
@@ -104,7 +109,7 @@ async fn do_test_internal<Out: test_logger::Output>(data: &[u8], _out: Out) {
104109 3 => {
105110 _ = KVStoreSync :: read ( fs_store, primary_namespace, secondary_namespace, key) ;
106111 } ,
107- // Async write
112+ // Async write. Bias writes a bit.
108113 4 ..=9 => {
109114 let data_value = get_next_data_value ( ) ;
110115
@@ -127,8 +132,9 @@ async fn do_test_internal<Out: test_logger::Output>(data: &[u8], _out: Out) {
127132 } ,
128133 // Async remove
129134 10 | 11 => {
135+ let lazy = v == 10 ;
130136 let fut =
131- KVStore :: remove ( fs_store, primary_namespace, secondary_namespace, key, v == 10 ) ;
137+ KVStore :: remove ( fs_store, primary_namespace, secondary_namespace, key, lazy ) ;
132138
133139 // Already set the current_data, even though writing hasn't finished yet. This supports the call-time
134140 // ordering semantics.
@@ -143,9 +149,7 @@ async fn do_test_internal<Out: test_logger::Output>(data: &[u8], _out: Out) {
143149 let _ = handle. await . unwrap ( ) ;
144150 }
145151 } ,
146- _ => {
147- return ;
148- } ,
152+ _ => unreachable ! ( ) ,
149153 }
150154
151155 // If no more writes are pending, we can reliably see if the data is consistent.
@@ -160,6 +164,12 @@ async fn do_test_internal<Out: test_logger::Output>(data: &[u8], _out: Out) {
160164 assert_eq ! ( 0 , fs_store. state_size( ) ) ;
161165 }
162166 }
167+
168+ // Always make sure that all async tasks are completed before returning. Otherwise the temporary storage dir could
169+ // be removed, and then again recreated by unfinished tasks.
170+ for handle in handles. drain ( ..) {
171+ let _ = handle. await . unwrap ( ) ;
172+ }
163173}
164174
165175/// Method that needs to be added manually, {name}_test
0 commit comments