@@ -133,7 +133,7 @@ func (r *cachedSectionReader) Close() error {
133
133
return nil
134
134
}
135
135
136
- func (cpr * CachedPieceReader ) getPieceReaderFromMarketPieceDeal (ctx context.Context , pieceCidV2 cid.Cid ) (storiface.Reader , uint64 , error ) {
136
+ func (cpr * CachedPieceReader ) getPieceReaderFromMarketPieceDeal (ctx context.Context , pieceCidV2 cid.Cid , retrieval bool ) (storiface.Reader , uint64 , error ) {
137
137
// Get all deals containing this piece
138
138
139
139
commp , err := commcidv2 .CommPFromPCidV2 (pieceCidV2 )
@@ -175,7 +175,14 @@ func (cpr *CachedPieceReader) getPieceReaderFromMarketPieceDeal(ctx context.Cont
175
175
}
176
176
177
177
if len (deals ) == 0 {
178
- return nil , 0 , fmt .Errorf ("piece cid %s: %w" , pieceCid , ErrNoDeal )
178
+ if retrieval {
179
+ return nil , 0 , fmt .Errorf ("piece cid %s: %w" , pieceCid , ErrNoDeal )
180
+ }
181
+ reader , rawSize , err := cpr .getPieceReaderFromPiecePark (ctx , nil , & pieceCid , & pieceSize )
182
+ if err != nil {
183
+ return nil , 0 , fmt .Errorf ("failed to read piece from piece park: %w" , err )
184
+ }
185
+ return reader , rawSize , nil
179
186
}
180
187
181
188
// For each deal, try to read an unsealed copy of the data from the sector
@@ -204,7 +211,8 @@ func (cpr *CachedPieceReader) getPieceReaderFromMarketPieceDeal(ctx context.Cont
204
211
205
212
if dl .PieceRef .Valid {
206
213
// This is a MK20 deal, get from piece park
207
- reader , rawSize , err := cpr .getPieceReaderFromPiecePark (ctx , dl .PieceRef .Int64 )
214
+ ref := dl .PieceRef .Int64
215
+ reader , rawSize , err := cpr .getPieceReaderFromPiecePark (ctx , & ref , nil , nil )
208
216
if err != nil {
209
217
merr = multierror .Append (merr , xerrors .Errorf ("failed to read piece from piece park: %w" , err ))
210
218
continue
@@ -217,42 +225,67 @@ func (cpr *CachedPieceReader) getPieceReaderFromMarketPieceDeal(ctx context.Cont
217
225
return nil , 0 , merr
218
226
}
219
227
220
- func (cpr * CachedPieceReader ) getPieceReaderFromPiecePark (ctx context.Context , piece_ref int64 ) (storiface.Reader , uint64 , error ) {
221
- // Query parked_pieces and parked_piece_refs in one go
222
- var pieceData []struct {
228
+ func (cpr * CachedPieceReader ) getPieceReaderFromPiecePark (ctx context.Context , pieceRef * int64 , pieceCid * cid.Cid , pieceSize * abi.PaddedPieceSize ) (storiface.Reader , uint64 , error ) {
229
+ type pieceData struct {
223
230
ID int64 `db:"id"`
224
231
PieceCid string `db:"piece_cid"`
225
232
PieceRawSize int64 `db:"piece_raw_size"`
226
233
}
227
234
228
- err := cpr .db .Select (ctx , & pieceData , `
235
+ var pd []pieceData
236
+
237
+ if pieceRef != nil {
238
+ var pdr []pieceData
239
+ err := cpr .db .Select (ctx , & pdr , `
229
240
SELECT
230
241
pp.id,
231
242
pp.piece_cid,
232
243
pp.piece_raw_size
233
244
FROM parked_piece_refs pr
234
245
JOIN parked_pieces pp ON pp.id = pr.piece_id
235
246
WHERE pr.ref_id = $1 AND pp.complete = TRUE and pp.long_term = TRUE;
236
- ` , piece_ref )
237
- if err != nil {
238
- return nil , 0 , fmt .Errorf ("failed to query parked_pieces and parked_piece_refs for piece_ref %d: %w" , piece_ref , err )
247
+ ` , pieceRef )
248
+ if err != nil {
249
+ return nil , 0 , fmt .Errorf ("failed to query parked_pieces and parked_piece_refs for piece_ref %d: %w" , pieceRef , err )
250
+ }
251
+ if len (pdr ) > 0 {
252
+ pd = append (pd , pdr ... )
253
+ }
254
+ }
255
+
256
+ if pieceCid != nil && pieceSize != nil {
257
+ pcid := * pieceCid
258
+ var pdc []pieceData
259
+ err := cpr .db .Select (ctx , & pdc , `
260
+ SELECT
261
+ id,
262
+ piece_cid,
263
+ piece_raw_size
264
+ FROM parked_pieces
265
+ WHERE piece_cid = $1 AND piece_padded_size = $2;` , pcid .String (), * pieceSize )
266
+ if err != nil {
267
+ return nil , 0 , fmt .Errorf ("failed to query parked_pieces and parked_piece_refs for piece_ref %d: %w" , pieceRef , err )
268
+ }
269
+ if len (pdc ) > 0 {
270
+ pd = append (pd , pdc ... )
271
+ }
239
272
}
240
273
241
- if len (pieceData ) == 0 {
242
- return nil , 0 , fmt .Errorf ("failed to find piece in parked_pieces for piece_ref %d" , piece_ref )
274
+ if len (pd ) == 0 {
275
+ return nil , 0 , fmt .Errorf ("failed to find piece in parked_pieces for piece_ref %d" , pieceRef )
243
276
}
244
277
245
- pcid , err := cid .Parse (pieceData [0 ].PieceCid )
278
+ pcid , err := cid .Parse (pd [0 ].PieceCid )
246
279
if err != nil {
247
280
return nil , 0 , fmt .Errorf ("failed to parse piece cid: %w" , err )
248
281
}
249
282
250
- reader , err := cpr .pieceParkReader .ReadPiece (ctx , storiface .PieceNumber (pieceData [0 ].ID ), pieceData [0 ].PieceRawSize , pcid )
283
+ reader , err := cpr .pieceParkReader .ReadPiece (ctx , storiface .PieceNumber (pd [0 ].ID ), pd [0 ].PieceRawSize , pcid )
251
284
if err != nil {
252
285
return nil , 0 , fmt .Errorf ("failed to read piece from piece park: %w" , err )
253
286
}
254
287
255
- return reader , uint64 (pieceData [0 ].PieceRawSize ), nil
288
+ return reader , uint64 (pd [0 ].PieceRawSize ), nil
256
289
}
257
290
258
291
type SubPieceReader struct {
@@ -276,7 +309,7 @@ func (s SubPieceReader) ReadAt(p []byte, off int64) (n int, err error) {
276
309
return s .sr .ReadAt (p , off )
277
310
}
278
311
279
- func (cpr * CachedPieceReader ) getPieceReaderFromAggregate (ctx context.Context , pieceCidV2 cid.Cid ) (storiface.Reader , uint64 , error ) {
312
+ func (cpr * CachedPieceReader ) getPieceReaderFromAggregate (ctx context.Context , pieceCidV2 cid.Cid , retrieval bool ) (storiface.Reader , uint64 , error ) {
280
313
pieces , err := cpr .idxStor .FindPieceInAggregate (ctx , pieceCidV2 )
281
314
if err != nil {
282
315
return nil , 0 , fmt .Errorf ("failed to find piece in aggregate: %w" , err )
@@ -294,7 +327,7 @@ func (cpr *CachedPieceReader) getPieceReaderFromAggregate(ctx context.Context, p
294
327
var merr error
295
328
296
329
for _ , p := range pieces {
297
- reader , _ , err := cpr .getPieceReaderFromMarketPieceDeal (ctx , p .Cid )
330
+ reader , _ , err := cpr .getPieceReaderFromMarketPieceDeal (ctx , p .Cid , retrieval )
298
331
if err != nil {
299
332
merr = multierror .Append (merr , err )
300
333
continue
@@ -307,7 +340,7 @@ func (cpr *CachedPieceReader) getPieceReaderFromAggregate(ctx context.Context, p
307
340
return nil , 0 , fmt .Errorf ("failed to find piece in aggregate: %w" , merr )
308
341
}
309
342
310
- func (cpr * CachedPieceReader ) GetSharedPieceReader (ctx context.Context , pieceCidV2 cid.Cid ) (storiface.Reader , uint64 , error ) {
343
+ func (cpr * CachedPieceReader ) GetSharedPieceReader (ctx context.Context , pieceCidV2 cid.Cid , retrieval bool ) (storiface.Reader , uint64 , error ) {
311
344
// Check if this is PieceCidV1 and try to convert to v2 if possible
312
345
yes := commcidv2 .IsPieceCidV2 (pieceCidV2 )
313
346
if ! yes {
@@ -386,13 +419,13 @@ func (cpr *CachedPieceReader) GetSharedPieceReader(ctx context.Context, pieceCid
386
419
readerCtx , readerCtxCancel := context .WithCancel (context .Background ())
387
420
defer close (r .ready )
388
421
389
- reader , size , err := cpr .getPieceReaderFromAggregate (readerCtx , pieceCidV2 )
422
+ reader , size , err := cpr .getPieceReaderFromAggregate (readerCtx , pieceCidV2 , retrieval )
390
423
if err != nil {
391
424
log .Debugw ("failed to get piece reader from aggregate" , "piececid" , pieceCidV2 .String (), "err" , err )
392
425
393
426
aerr := err
394
427
395
- reader , size , err = cpr .getPieceReaderFromMarketPieceDeal (readerCtx , pieceCidV2 )
428
+ reader , size , err = cpr .getPieceReaderFromMarketPieceDeal (readerCtx , pieceCidV2 , retrieval )
396
429
if err != nil {
397
430
log .Errorw ("failed to get piece reader" , "piececid" , pieceCid , "piece size" , pieceSize , "err" , err )
398
431
finalErr := fmt .Errorf ("failed to get piece reader from aggregate, sector or piece park: %w, %w" , aerr , err )
0 commit comments