@@ -18,11 +18,11 @@ use rand::{thread_rng, Rng};
1818use std:: collections:: hash_map;
1919use std:: collections:: HashMap ;
2020use std:: env;
21- use std:: io:: { Cursor , Read , Write } ;
21+ use std:: io:: { self , Write } ;
2222use std:: path:: PathBuf ;
2323use std:: str:: FromStr ;
2424use std:: sync:: atomic:: { AtomicBool , Ordering } ;
25- use std:: sync:: { Arc , Mutex , RwLock } ;
25+ use std:: sync:: { Arc , Mutex } ;
2626use std:: time:: Duration ;
2727
2828macro_rules! expect_event {
@@ -42,25 +42,20 @@ macro_rules! expect_event {
4242pub ( crate ) use expect_event;
4343
4444pub ( crate ) struct TestStore {
45- persisted_bytes : RwLock < HashMap < String , HashMap < String , Arc < RwLock < Vec < u8 > > > > > > ,
45+ persisted_bytes : Mutex < HashMap < String , HashMap < String , Vec < u8 > > > > ,
4646 did_persist : Arc < AtomicBool > ,
4747}
4848
4949impl TestStore {
5050 pub fn new ( ) -> Self {
51- let persisted_bytes = RwLock :: new ( HashMap :: new ( ) ) ;
51+ let persisted_bytes = Mutex :: new ( HashMap :: new ( ) ) ;
5252 let did_persist = Arc :: new ( AtomicBool :: new ( false ) ) ;
5353 Self { persisted_bytes, did_persist }
5454 }
5555
5656 pub fn get_persisted_bytes ( & self , namespace : & str , key : & str ) -> Option < Vec < u8 > > {
57- if let Some ( outer_ref) = self . persisted_bytes . read ( ) . unwrap ( ) . get ( namespace) {
58- if let Some ( inner_ref) = outer_ref. get ( key) {
59- let locked = inner_ref. read ( ) . unwrap ( ) ;
60- return Some ( ( * locked) . clone ( ) ) ;
61- }
62- }
63- None
57+ let persisted_lock = self . persisted_bytes . lock ( ) . unwrap ( ) ;
58+ persisted_lock. get ( namespace) . and_then ( |e| e. get ( key) . cloned ( ) )
6459 }
6560
6661 pub fn get_and_clear_did_persist ( & self ) -> bool {
@@ -69,46 +64,45 @@ impl TestStore {
6964}
7065
7166impl KVStore for TestStore {
72- type Reader = TestReader ;
67+ type Reader = io :: Cursor < Vec < u8 > > ;
7368
74- fn read ( & self , namespace : & str , key : & str ) -> std:: io:: Result < Self :: Reader > {
75- if let Some ( outer_ref) = self . persisted_bytes . read ( ) . unwrap ( ) . get ( namespace) {
69+ fn read ( & self , namespace : & str , key : & str ) -> io:: Result < Self :: Reader > {
70+ let persisted_lock = self . persisted_bytes . lock ( ) . unwrap ( ) ;
71+ if let Some ( outer_ref) = persisted_lock. get ( namespace) {
7672 if let Some ( inner_ref) = outer_ref. get ( key) {
77- Ok ( TestReader :: new ( Arc :: clone ( inner_ref) ) )
73+ let bytes = inner_ref. clone ( ) ;
74+ Ok ( io:: Cursor :: new ( bytes) )
7875 } else {
79- let msg = format ! ( "Key not found: {}" , key) ;
80- Err ( std:: io:: Error :: new ( std:: io:: ErrorKind :: NotFound , msg) )
76+ Err ( io:: Error :: new ( io:: ErrorKind :: NotFound , "Key not found" ) )
8177 }
8278 } else {
83- let msg = format ! ( "Namespace not found: {}" , namespace) ;
84- Err ( std:: io:: Error :: new ( std:: io:: ErrorKind :: NotFound , msg) )
79+ Err ( io:: Error :: new ( io:: ErrorKind :: NotFound , "Namespace not found" ) )
8580 }
8681 }
8782
88- fn write ( & self , namespace : & str , key : & str , buf : & [ u8 ] ) -> std:: io:: Result < ( ) > {
89- let mut guard = self . persisted_bytes . write ( ) . unwrap ( ) ;
90- let outer_e = guard. entry ( namespace. to_string ( ) ) . or_insert ( HashMap :: new ( ) ) ;
91- let inner_e = outer_e. entry ( key. to_string ( ) ) . or_insert ( Arc :: new ( RwLock :: new ( Vec :: new ( ) ) ) ) ;
92-
93- let mut guard = inner_e. write ( ) . unwrap ( ) ;
94- guard. write_all ( buf) ?;
83+ fn write ( & self , namespace : & str , key : & str , buf : & [ u8 ] ) -> io:: Result < ( ) > {
84+ let mut persisted_lock = self . persisted_bytes . lock ( ) . unwrap ( ) ;
85+ let outer_e = persisted_lock. entry ( namespace. to_string ( ) ) . or_insert ( HashMap :: new ( ) ) ;
86+ let mut bytes = Vec :: new ( ) ;
87+ bytes. write_all ( buf) ?;
88+ outer_e. insert ( key. to_string ( ) , bytes) ;
9589 self . did_persist . store ( true , Ordering :: SeqCst ) ;
9690 Ok ( ( ) )
9791 }
9892
99- fn remove ( & self , namespace : & str , key : & str ) -> std:: io:: Result < ( ) > {
100- match self . persisted_bytes . write ( ) . unwrap ( ) . entry ( namespace. to_string ( ) ) {
101- hash_map:: Entry :: Occupied ( mut e) => {
102- self . did_persist . store ( true , Ordering :: SeqCst ) ;
103- e. get_mut ( ) . remove ( & key. to_string ( ) ) ;
104- Ok ( ( ) )
105- }
106- hash_map:: Entry :: Vacant ( _) => Ok ( ( ) ) ,
93+ fn remove ( & self , namespace : & str , key : & str ) -> io:: Result < ( ) > {
94+ let mut persisted_lock = self . persisted_bytes . lock ( ) . unwrap ( ) ;
95+ if let Some ( outer_ref) = persisted_lock. get_mut ( namespace) {
96+ outer_ref. remove ( & key. to_string ( ) ) ;
97+ self . did_persist . store ( true , Ordering :: SeqCst ) ;
10798 }
99+
100+ Ok ( ( ) )
108101 }
109102
110- fn list ( & self , namespace : & str ) -> std:: io:: Result < Vec < String > > {
111- match self . persisted_bytes . write ( ) . unwrap ( ) . entry ( namespace. to_string ( ) ) {
103+ fn list ( & self , namespace : & str ) -> io:: Result < Vec < String > > {
104+ let mut persisted_lock = self . persisted_bytes . lock ( ) . unwrap ( ) ;
105+ match persisted_lock. entry ( namespace. to_string ( ) ) {
112106 hash_map:: Entry :: Occupied ( e) => Ok ( e. get ( ) . keys ( ) . cloned ( ) . collect ( ) ) ,
113107 hash_map:: Entry :: Vacant ( _) => Ok ( Vec :: new ( ) ) ,
114108 }
@@ -139,24 +133,6 @@ impl KVStorePersister for TestStore {
139133 }
140134}
141135
142- pub struct TestReader {
143- entry_ref : Arc < RwLock < Vec < u8 > > > ,
144- }
145-
146- impl TestReader {
147- pub fn new ( entry_ref : Arc < RwLock < Vec < u8 > > > ) -> Self {
148- Self { entry_ref }
149- }
150- }
151-
152- impl Read for TestReader {
153- fn read ( & mut self , buf : & mut [ u8 ] ) -> std:: io:: Result < usize > {
154- let bytes = self . entry_ref . read ( ) . unwrap ( ) . clone ( ) ;
155- let mut reader = Cursor :: new ( bytes) ;
156- reader. read ( buf)
157- }
158- }
159-
160136// Copied over from upstream LDK
161137#[ allow( dead_code) ]
162138pub struct TestLogger {
0 commit comments