1- use super :: CommitmentError ;
1+ use crate :: commitments:: metadata:: { CommitmentMetadata , CommitmentStatus } ;
2+ use crate :: commitments:: CommitmentError ;
23use lru:: LruCache ;
34use parking_lot:: Mutex ;
45use rocksdb:: { Options , DB } ;
5- use serde:: { Deserialize , Serialize } ;
6- use std:: collections:: HashMap ;
76use std:: fmt;
87use std:: ops:: Deref ;
98use std:: path:: PathBuf ;
@@ -13,15 +12,6 @@ use tracing::error;
1312
1413// Cache size is just enough for last 2 salts to be stored
1514const COMMITMENTS_CACHE_SIZE : usize = 2 ;
16- const COMMITMENTS_KEY : & [ u8 ] = b"commitments" ;
17-
18- #[ derive( Debug , Copy , Clone , Eq , PartialEq , Serialize , Deserialize ) ]
19- enum CommitmentStatus {
20- /// In-progress commitment to the part of the plot
21- InProgress ,
22- /// Commitment to the whole plot and not some in-progress partial commitment
23- Created ,
24- }
2515
2616pub ( super ) struct CreateDbEntryResult {
2717 pub ( super ) db_entry : Arc < DbEntry > ,
@@ -48,45 +38,25 @@ impl Deref for DbEntry {
4838}
4939
5040impl DbEntry {
51- pub ( super ) fn salt ( & self ) -> & Salt {
52- & self . salt
41+ pub ( super ) fn salt ( & self ) -> Salt {
42+ self . salt
5343 }
5444}
5545
5646#[ derive( Debug ) ]
5747pub ( super ) struct CommitmentDatabases {
5848 base_directory : PathBuf ,
5949 databases : LruCache < Salt , Arc < DbEntry > > ,
60- metadata_cache : HashMap < Salt , CommitmentStatus > ,
61- metadata_db : Arc < DB > ,
50+ metadata : Mutex < CommitmentMetadata > ,
6251}
6352
6453impl CommitmentDatabases {
6554 pub ( super ) fn new ( base_directory : PathBuf ) -> Result < Self , CommitmentError > {
66- let metadata_db = DB :: open_default ( base_directory. join ( "metadata" ) )
67- . map_err ( CommitmentError :: MetadataDb ) ?;
68- let metadata_cache: HashMap < Salt , CommitmentStatus > = metadata_db
69- . get ( COMMITMENTS_KEY )
70- . map_err ( CommitmentError :: MetadataDb ) ?
71- . map ( |bytes| {
72- serde_json:: from_slice :: < HashMap < String , CommitmentStatus > > ( & bytes)
73- . unwrap ( )
74- . into_iter ( )
75- . map ( |( salt, status) | ( hex:: decode ( salt) . unwrap ( ) . try_into ( ) . unwrap ( ) , status) )
76- . collect ( )
77- } )
78- . unwrap_or_default ( ) ;
79-
80- let mut commitment_databases = CommitmentDatabases {
81- base_directory : base_directory. clone ( ) ,
82- databases : LruCache :: new ( COMMITMENTS_CACHE_SIZE ) ,
83- metadata_cache,
84- metadata_db : Arc :: new ( metadata_db) ,
85- } ;
55+ let mut metadata = CommitmentMetadata :: new ( base_directory. join ( "metadata" ) ) ?;
56+ let mut databases = LruCache :: new ( COMMITMENTS_CACHE_SIZE ) ;
8657
87- if commitment_databases
88- . metadata_cache
89- . drain_filter ( |salt, status| match status {
58+ metadata. mutate ( |metadata| {
59+ metadata. drain_filter ( |salt, status| match status {
9060 CommitmentStatus :: InProgress => {
9161 if let Err ( error) =
9262 std:: fs:: remove_dir_all ( base_directory. join ( hex:: encode ( salt) ) )
@@ -100,35 +70,29 @@ impl CommitmentDatabases {
10070 true
10171 }
10272 CommitmentStatus :: Created => false ,
103- } )
104- . next ( )
105- . is_some ( )
106- {
107- commitment_databases. persist_metadata_cache ( ) ?;
108- }
109-
110- // Open databases that were fully created during previous run
111- for salt in commitment_databases. metadata_cache . keys ( ) {
112- let db = DB :: open ( & Options :: default ( ) , base_directory. join ( hex:: encode ( salt) ) )
113- . map_err ( CommitmentError :: CommitmentDb ) ?;
114- commitment_databases. databases . put (
115- * salt,
116- Arc :: new ( DbEntry {
117- salt : * salt,
118- db : Mutex :: new ( Some ( Arc :: new ( db) ) ) ,
119- } ) ,
120- ) ;
121- }
122-
123- Ok :: < _ , CommitmentError > ( commitment_databases)
124- }
73+ } ) ;
12574
126- /// Get salts for all current database entries
127- pub ( super ) fn get_salts ( & self ) -> Vec < Salt > {
128- self . databases
129- . iter ( )
130- . map ( |( salt, _db_entry) | * salt)
131- . collect ( )
75+ // Open databases that were fully created during previous run
76+ for salt in metadata. keys ( ) {
77+ let db = DB :: open ( & Options :: default ( ) , base_directory. join ( hex:: encode ( salt) ) )
78+ . map_err ( CommitmentError :: CommitmentDb ) ?;
79+ databases. put (
80+ * salt,
81+ Arc :: new ( DbEntry {
82+ salt : * salt,
83+ db : Mutex :: new ( Some ( Arc :: new ( db) ) ) ,
84+ } ) ,
85+ ) ;
86+ }
87+
88+ Ok ( ( ) )
89+ } ) ?;
90+
91+ Ok ( CommitmentDatabases {
92+ base_directory : base_directory. clone ( ) ,
93+ databases,
94+ metadata : Mutex :: new ( metadata) ,
95+ } )
13296 }
13397
13498 /// Returns current and next `db_entry`.
@@ -176,7 +140,11 @@ impl CommitmentDatabases {
176140 let old_db_path = self . base_directory . join ( hex:: encode ( old_salt) ) ;
177141
178142 // Remove old commitments for `old_salt`
179- self . metadata_cache . remove ( & old_salt) ;
143+ self . metadata . lock ( ) . mutate ( |metadata| {
144+ metadata. remove ( & old_salt) ;
145+
146+ Ok ( ( ) )
147+ } ) ?;
180148
181149 tokio:: task:: spawn_blocking ( move || {
182150 // Take a lock to make sure database was released by whatever user there was and we
@@ -202,35 +170,16 @@ impl CommitmentDatabases {
202170 }
203171
204172 pub ( super ) fn mark_in_progress ( & mut self , salt : Salt ) -> Result < ( ) , CommitmentError > {
205- self . update_status ( salt, CommitmentStatus :: InProgress )
173+ self . metadata . lock ( ) . mutate ( |metadata| {
174+ metadata. insert ( salt, CommitmentStatus :: InProgress ) ;
175+ Ok ( ( ) )
176+ } )
206177 }
207178
208179 pub ( super ) fn mark_created ( & mut self , salt : Salt ) -> Result < ( ) , CommitmentError > {
209- self . update_status ( salt, CommitmentStatus :: Created )
210- }
211-
212- fn update_status (
213- & mut self ,
214- salt : Salt ,
215- status : CommitmentStatus ,
216- ) -> Result < ( ) , CommitmentError > {
217- self . metadata_cache . insert ( salt, status) ;
218-
219- self . persist_metadata_cache ( )
220- }
221-
222- fn persist_metadata_cache ( & self ) -> Result < ( ) , CommitmentError > {
223- let prepared_metadata_cache: HashMap < String , CommitmentStatus > = self
224- . metadata_cache
225- . iter ( )
226- . map ( |( salt, status) | ( hex:: encode ( salt) , * status) )
227- . collect ( ) ;
228-
229- self . metadata_db
230- . put (
231- COMMITMENTS_KEY ,
232- & serde_json:: to_vec ( & prepared_metadata_cache) . unwrap ( ) ,
233- )
234- . map_err ( CommitmentError :: MetadataDb )
180+ self . metadata . lock ( ) . mutate ( |metadata| {
181+ metadata. insert ( salt, CommitmentStatus :: Created ) ;
182+ Ok ( ( ) )
183+ } )
235184 }
236185}
0 commit comments