@@ -18,7 +18,7 @@ type ComputedImmutablesDigestsResult = Result<ComputedImmutablesDigests, io::Err
18
18
19
19
struct ComputedImmutablesDigests {
20
20
entries : BTreeMap < ImmutableFile , HexEncodedDigest > ,
21
- new_cached_entries : Vec < ( ImmutableFileName , HexEncodedDigest ) > ,
21
+ new_cached_entries : Vec < ImmutableFileName > ,
22
22
}
23
23
24
24
/// A digester working directly on a Cardano DB immutables files
@@ -75,6 +75,28 @@ impl CardanoImmutableDigester {
75
75
76
76
Ok ( computed_digests)
77
77
}
78
+
79
+ async fn update_cache ( & self , computed_immutables_digests : & ComputedImmutablesDigests ) {
80
+ if let Some ( cache_provider) = self . cache_provider . as_ref ( ) {
81
+ let new_cached_entries = computed_immutables_digests
82
+ . entries
83
+ . iter ( )
84
+ . filter ( |( file, _hash) | {
85
+ computed_immutables_digests
86
+ . new_cached_entries
87
+ . contains ( & file. filename )
88
+ } )
89
+ . map ( |( file, hash) | ( file. filename . clone ( ) , hash. clone ( ) ) )
90
+ . collect ( ) ;
91
+
92
+ if let Err ( error) = cache_provider. store ( new_cached_entries) . await {
93
+ warn ! (
94
+ self . logger, "Error while storing new immutable files digests to cache" ;
95
+ "error" => ?error
96
+ ) ;
97
+ }
98
+ }
99
+ }
78
100
}
79
101
80
102
#[ async_trait]
@@ -89,6 +111,8 @@ impl ImmutableDigester for CardanoImmutableDigester {
89
111
info ! ( self . logger, ">> compute_digest" ; "beacon" => #?beacon, "nb_of_immutables" => immutables_to_process. len( ) ) ;
90
112
let computed_immutables_digests = self . process_immutables ( immutables_to_process) . await ?;
91
113
114
+ self . update_cache ( & computed_immutables_digests) . await ;
115
+
92
116
let digest = {
93
117
let mut hasher = Sha256 :: new ( ) ;
94
118
hasher. update ( compute_beacon_hash ( & self . cardano_network , beacon) . as_bytes ( ) ) ;
@@ -102,18 +126,6 @@ impl ImmutableDigester for CardanoImmutableDigester {
102
126
103
127
debug ! ( self . logger, "Computed digest: {digest:?}" ) ;
104
128
105
- if let Some ( cache_provider) = self . cache_provider . as_ref ( ) {
106
- if let Err ( error) = cache_provider
107
- . store ( computed_immutables_digests. new_cached_entries )
108
- . await
109
- {
110
- warn ! (
111
- self . logger, "Error while storing new immutable files digests to cache" ;
112
- "error" => ?error
113
- ) ;
114
- }
115
- }
116
-
117
129
Ok ( digest)
118
130
}
119
131
@@ -127,6 +139,8 @@ impl ImmutableDigester for CardanoImmutableDigester {
127
139
info ! ( self . logger, ">> compute_merkle_tree" ; "beacon" => #?beacon, "nb_of_immutables" => immutables_to_process. len( ) ) ;
128
140
let computed_immutables_digests = self . process_immutables ( immutables_to_process) . await ?;
129
141
142
+ self . update_cache ( & computed_immutables_digests) . await ;
143
+
130
144
let digests: Vec < HexEncodedDigest > =
131
145
computed_immutables_digests. entries . into_values ( ) . collect ( ) ;
132
146
let mktree =
@@ -136,18 +150,6 @@ impl ImmutableDigester for CardanoImmutableDigester {
136
150
self . logger,
137
151
"Successfully computed Merkle tree for Cardano database" ; "beacon" => #?beacon) ;
138
152
139
- if let Some ( cache_provider) = self . cache_provider . as_ref ( ) {
140
- if let Err ( error) = cache_provider
141
- . store ( computed_immutables_digests. new_cached_entries )
142
- . await
143
- {
144
- warn ! (
145
- self . logger, "Error while storing new immutable files digests to cache" ;
146
- "error" => ?error
147
- ) ;
148
- }
149
- }
150
-
151
153
Ok ( mktree)
152
154
}
153
155
}
@@ -190,17 +192,15 @@ fn compute_immutables_digests(
190
192
191
193
let mut digests = BTreeMap :: new ( ) ;
192
194
193
- for ( ix, ( entry, cache) ) in entries. iter ( ) . enumerate ( ) {
194
- match cache {
195
+ for ( ix, ( entry, cache) ) in entries. into_iter ( ) . enumerate ( ) {
196
+ let hash = match cache {
195
197
None => {
196
- let data = hex:: encode ( entry. compute_raw_hash :: < Sha256 > ( ) ?) ;
197
- digests. insert ( entry. clone ( ) , data. clone ( ) ) ;
198
- new_cached_entries. push ( ( entry. filename . clone ( ) , data) ) ;
199
- }
200
- Some ( digest) => {
201
- digests. insert ( entry. clone ( ) , digest. to_string ( ) ) ;
198
+ new_cached_entries. push ( entry. filename . clone ( ) ) ;
199
+ hex:: encode ( entry. compute_raw_hash :: < Sha256 > ( ) ?)
202
200
}
201
+ Some ( digest) => digest,
203
202
} ;
203
+ digests. insert ( entry, hash) ;
204
204
205
205
if progress. report ( ix) {
206
206
info ! ( logger, "Hashing: {progress}" ) ;
0 commit comments