@@ -12,11 +12,10 @@ use subspace_networking::libp2p::identity::Keypair;
1212use subspace_networking:: libp2p:: kad:: record:: Key ;
1313use subspace_networking:: libp2p:: kad:: ProviderRecord ;
1414use subspace_networking:: libp2p:: multihash:: Multihash ;
15- use subspace_networking:: utils:: multihash:: MultihashCode ;
1615use subspace_networking:: {
1716 create, peer_id, BootstrappedNetworkingParameters , Config , Node , NodeRunner ,
1817 ParityDbProviderStorage , PieceByHashRequest , PieceByHashRequestHandler , PieceByHashResponse ,
19- PieceKey , ToMultihash ,
18+ ToMultihash ,
2019} ;
2120use tokio:: runtime:: Handle ;
2221use tracing:: { debug, info, trace, warn} ;
@@ -86,9 +85,16 @@ pub(super) async fn configure_dsn(
8685 networking_parameters_registry : BootstrappedNetworkingParameters :: new ( bootstrap_nodes)
8786 . boxed ( ) ,
8887 request_response_protocols : vec ! [ PieceByHashRequestHandler :: create( move |req| {
89- let result = match req. key {
90- PieceKey :: ArchivalStorage ( piece_index_hash) => {
91- debug!( key=?req. key, "Archival storage piece request received." ) ;
88+ let result = {
89+ debug!( piece_index_hash = ?req. piece_index_hash, "Piece request received. Trying cache..." ) ;
90+ let multihash = req. piece_index_hash. to_multihash( ) ;
91+
92+ let piece_from_cache = piece_storage. get( & multihash. into( ) ) ;
93+
94+ if piece_from_cache. is_some( ) {
95+ piece_from_cache
96+ } else {
97+ debug!( piece_index_hash = ?req. piece_index_hash, "No piece in the cache. Trying archival storage..." ) ;
9298
9399 let ( mut reader, piece_details) = {
94100 let readers_and_pieces = match weak_readers_and_pieces. upgrade( ) {
@@ -103,23 +109,26 @@ pub(super) async fn configure_dsn(
103109 Some ( readers_and_pieces) => readers_and_pieces,
104110 None => {
105111 debug!(
106- ?piece_index_hash,
112+ ?req . piece_index_hash,
107113 "Readers and pieces are not initialized yet"
108114 ) ;
109115 return None ;
110116 }
111117 } ;
112- let piece_details =
113- match readers_and_pieces. pieces. get( & piece_index_hash) . copied( ) {
114- Some ( piece_details) => piece_details,
115- None => {
116- trace!(
117- ?piece_index_hash,
118- "Piece is not stored in any of the local plots"
119- ) ;
120- return None ;
121- }
122- } ;
118+ let piece_details = match readers_and_pieces
119+ . pieces
120+ . get( & req. piece_index_hash)
121+ . copied( )
122+ {
123+ Some ( piece_details) => piece_details,
124+ None => {
125+ trace!(
126+ ?req. piece_index_hash,
127+ "Piece is not stored in any of the local plots"
128+ ) ;
129+ return None ;
130+ }
131+ } ;
123132 let reader = readers_and_pieces
124133 . readers
125134 . get( piece_details. plot_offset)
@@ -136,11 +145,6 @@ pub(super) async fn configure_dsn(
136145 )
137146 } )
138147 }
139- PieceKey :: Cache ( piece_index_hash) => {
140- debug!( key=?req. key, "Cache piece request received." ) ;
141-
142- piece_storage. get( & piece_index_hash. to_multihash( ) . into( ) )
143- }
144148 } ;
145149
146150 Some ( PieceByHashResponse { piece: result } )
@@ -171,7 +175,6 @@ impl<PS: PieceStorage> FarmerProviderRecordProcessor<PS> {
171175 //TODO: consider introducing get-piece helper
172176 async fn get_piece ( & self , piece_index_hash : PieceIndexHash ) -> Option < Piece > {
173177 let multihash = piece_index_hash. to_multihash ( ) ;
174- let piece_key = PieceKey :: Cache ( piece_index_hash) ;
175178
176179 let get_providers_result = self . node . get_providers ( multihash) . await ;
177180
@@ -180,29 +183,34 @@ impl<PS: PieceStorage> FarmerProviderRecordProcessor<PS> {
180183 while let Some ( provider_id) = get_providers_stream. next ( ) . await {
181184 trace ! ( ?multihash, %provider_id, "get_providers returned an item" ) ;
182185
186+ if provider_id == self . node . id ( ) {
187+ trace ! ( ?multihash, %provider_id, "Attempted to get a piece from itself." ) ;
188+ continue ;
189+ }
190+
183191 let request_result = self
184192 . node
185- . send_generic_request ( provider_id, PieceByHashRequest { key : piece_key } )
193+ . send_generic_request ( provider_id, PieceByHashRequest { piece_index_hash } )
186194 . await ;
187195
188196 match request_result {
189197 Ok ( PieceByHashResponse { piece : Some ( piece) } ) => {
190- trace ! ( %provider_id, ?multihash, ?piece_key , "Piece request succeeded." ) ;
198+ trace ! ( %provider_id, ?multihash, ?piece_index_hash , "Piece request succeeded." ) ;
191199 return Some ( piece) ;
192200 }
193201 Ok ( PieceByHashResponse { piece : None } ) => {
194- debug ! ( %provider_id, ?multihash, ?piece_key , "Piece request returned empty piece." ) ;
202+ debug ! ( %provider_id, ?multihash, ?piece_index_hash , "Piece request returned empty piece." ) ;
195203 }
196204 Err ( error) => {
197- warn ! ( %provider_id, ?multihash, ?piece_key , ?error, "Piece request failed." ) ;
205+ warn ! ( %provider_id, ?multihash, ?piece_index_hash , ?error, "Piece request failed." ) ;
198206 }
199207 }
200208 }
201209 }
202210 Err ( err) => {
203211 warn ! (
204212 ?multihash,
205- ?piece_key ,
213+ ?piece_index_hash ,
206214 ?err,
207215 "get_providers returned an error"
208216 ) ;
@@ -244,21 +252,17 @@ impl<PS: PieceStorage> FarmerProviderRecordProcessor<PS> {
244252 return ;
245253 }
246254
247- if multihash. code ( ) == u64:: from ( MultihashCode :: PieceIndex ) {
248- trace ! ( key=?rec. key, "Starting processing provider record..." ) ;
255+ trace ! ( key=?rec. key, "Starting processing provider record..." ) ;
249256
250- if self . piece_storage . should_include_in_storage ( & rec. key ) {
251- let piece_index_hash: Blake2b256Hash = multihash. digest ( ) [ ..BLAKE2B_256_HASH_SIZE ]
252- . try_into ( )
253- . expect ( "Multihash should be known 32 bytes size." ) ;
257+ if self . piece_storage . should_include_in_storage ( & rec. key ) {
258+ let piece_index_hash: Blake2b256Hash = multihash. digest ( ) [ ..BLAKE2B_256_HASH_SIZE ]
259+ . try_into ( )
260+ . expect ( "Multihash should be known 32 bytes size." ) ;
254261
255- if let Some ( piece) = self . get_piece ( piece_index_hash. into ( ) ) . await {
256- self . piece_storage . add_piece ( rec. key . clone ( ) , piece) ;
257- self . announce_piece ( multihash) . await ;
258- }
262+ if let Some ( piece) = self . get_piece ( piece_index_hash. into ( ) ) . await {
263+ self . piece_storage . add_piece ( rec. key . clone ( ) , piece) ;
264+ self . announce_piece ( multihash) . await ;
259265 }
260- } else {
261- trace ! ( key=?rec. key, "Processing of the provider record cancelled." ) ;
262266 }
263267 }
264268}
0 commit comments