@@ -3,7 +3,9 @@ package cachedreader
33import (
44 "context"
55 "errors"
6+ "fmt"
67 "io"
8+ "net/http"
79 "sync"
810 "time"
911
@@ -23,6 +25,7 @@ import (
2325)
2426
2527var ErrNoDeal = errors .New ("no deals found" )
28+ var ErrNotFound = errors .New ("piece not found" )
2629
2730var log = logging .Logger ("cached-reader" )
2831
@@ -222,7 +225,7 @@ func (cpr *CachedPieceReader) getPieceReaderFromPiecePark(ctx context.Context, p
222225 }
223226
224227 if len (pieceData ) == 0 {
225- return nil , 0 , xerrors .Errorf ("failed to find piece in parked_pieces for piece cid %s" , pieceCid .String ())
228+ return nil , 0 , xerrors .Errorf ("failed to find piece in parked_pieces for piece cid %s: %w " , pieceCid .String (), ErrNoDeal )
226229 }
227230
228231 reader , err := cpr .pieceParkReader .ReadPiece (ctx , storiface .PieceNumber (pieceData [0 ].ID ), pieceData [0 ].PieceRawSize , pieceCid )
@@ -283,18 +286,37 @@ func (cpr *CachedPieceReader) GetSharedPieceReader(ctx context.Context, pieceCid
283286 readerCtx , readerCtxCancel := context .WithCancel (context .Background ())
284287 defer close (r .ready )
285288
289+ retCode := http .StatusNotFound
290+
286291 reader , size , err := cpr .getPieceReaderFromSector (readerCtx , pieceCid )
287292 if err != nil {
288293 log .Infow ("failed to get piece reader from sector" , "piececid" , pieceCid , "err" , err )
289294
295+ if ! errors .Is (err , ErrNoDeal ) {
296+ retCode = http .StatusInternalServerError
297+ }
298+
290299 serr := err
291300
292301 // Try getPieceReaderFromPiecePark
293302 reader , size , err = cpr .getPieceReaderFromPiecePark (readerCtx , pieceCid )
294303 if err != nil {
295304 log .Errorw ("failed to get piece reader from piece park" , "piececid" , pieceCid , "err" , err )
296305
297- finalErr := xerrors .Errorf ("failed to get piece reader from sector or piece park: %w, %w" , err , serr )
306+ // If we already hit any error except ErrNoDeal then we should surface that one even if here we get a 404.
307+ // If previous error was 404 but here it is anything but 404 then we should surface that
308+ // 404 should only be surfaced if we have 404 from both errors
309+ if retCode == http .StatusNotFound && ! errors .Is (err , ErrNoDeal ) {
310+ retCode = http .StatusInternalServerError
311+ }
312+
313+ var finalErr error
314+
315+ if retCode == http .StatusNotFound {
316+ finalErr = fmt .Errorf ("failed to get piece reader from sector or piece park: %w, %w, %w" , err , serr , ErrNotFound )
317+ } else {
318+ finalErr = fmt .Errorf ("failed to get piece reader from sector or piece park: %w, %w" , err , serr )
319+ }
298320
299321 // Record error metric
300322 _ = stats .RecordWithTags (context .Background (), []tag.Mutator {
0 commit comments