Skip to content

Commit 6814fed

Browse files
LexLuthrKubuxu
andauthored
return 404 for piece retrievals correctly (#799)
* return 404 for piece retrievals correctly * fix multiple wrapped errors with xerrors.Errorf Signed-off-by: Jakub Sztandera <[email protected]> --------- Signed-off-by: Jakub Sztandera <[email protected]> Co-authored-by: Jakub Sztandera <[email protected]>
1 parent 50ab42c commit 6814fed

File tree

2 files changed

+25
-3
lines changed

2 files changed

+25
-3
lines changed

lib/cachedreader/cachedreader.go

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ package cachedreader
33
import (
44
"context"
55
"errors"
6+
"fmt"
67
"io"
8+
"net/http"
79
"sync"
810
"time"
911

@@ -23,6 +25,7 @@ import (
2325
)
2426

2527
var ErrNoDeal = errors.New("no deals found")
28+
var ErrNotFound = errors.New("piece not found")
2629

2730
var 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{

market/retrieval/piecehandler.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ func (rp *Provider) handleByPieceCid(w http.ResponseWriter, r *http.Request) {
6161
reader, size, err := rp.cpr.GetSharedPieceReader(ctx, pieceCid)
6262
if err != nil {
6363
log.Errorf("server error getting content for piece CID %s: %s", pieceCid, err)
64-
if errors.Is(err, cachedreader.ErrNoDeal) {
64+
if errors.Is(err, cachedreader.ErrNotFound) {
6565
w.WriteHeader(http.StatusNotFound)
6666
stats.Record(ctx, remoteblockstore.HttpPieceByCid404ResponseCount.M(1))
6767
return

0 commit comments

Comments
 (0)