Skip to content

Commit

Permalink
fix: unexpected EOF when parsing segments for PODSI deals (#1874)
Browse files Browse the repository at this point in the history
* Fixes POSDI error (#1873)

POSDI index error fix for spade deals

* refactor the io.seek

---------

Co-authored-by: CryptoWhizzard <[email protected]>
  • Loading branch information
LexLuthr and cryptowhizzard authored Jan 25, 2024
1 parent 031b40e commit 8f6f6ff
Showing 1 changed file with 18 additions and 3 deletions.
21 changes: 18 additions & 3 deletions piecedirectory/piecedirectory.go
Original file line number Diff line number Diff line change
Expand Up @@ -406,7 +406,6 @@ func (cr *countingReader) Read(p []byte) (n int, err error) {
}

func parsePieceWithDataSegmentIndex(pieceCid cid.Cid, unpaddedSize int64, r types.SectionReader) ([]model.Record, error) {

concurrency := runtime.NumCPU()
if concurrency < PodsiMinConcurrency {
concurrency = PodsiMinConcurrency
Expand All @@ -420,7 +419,18 @@ func parsePieceWithDataSegmentIndex(pieceCid cid.Cid, unpaddedSize int64, r type

ps := abi.UnpaddedPieceSize(unpaddedSize).Padded()
dsis := datasegment.DataSegmentIndexStartOffset(ps)

// We seek to end of reader to avoid EOF encountered when parsing the segments
// This should be fixed on Miner side permanently before removing this chunk of code
_, err := r.Seek(0, io.SeekEnd)
if err != nil {
log.Debugw("Failed to seek to the end of the piece reader")
return nil, fmt.Errorf("could not seek to end of piece reader: %w", err)
}

// Wind back the seeker
if _, err := r.Seek(int64(dsis), io.SeekStart); err != nil {
log.Debugw("Failed to seek to data segment index", "error", err)
return nil, fmt.Errorf("could not seek to data segment index: %w", err)
}

Expand All @@ -432,15 +442,18 @@ func parsePieceWithDataSegmentIndex(pieceCid cid.Cid, unpaddedSize int64, r type
panicked := false
indexData, err := parseDataSegmentIndex(pieceCid, bufio.NewReaderSize(cr, PodsiBuffesrSize), &panicked)
if err != nil {
log.Debugw("Failed to parse data segment index", "error", err)
return nil, fmt.Errorf("could not parse data segment index: %w", err)
}
if panicked {
log.Debugw("Internal panic while parsing data segment index")
return nil, fmt.Errorf("could not parse data segment index because of an internal panic")
}

log.Debugw("podsi: parsed data segment index", "segments", len(indexData.Entries), "reads", readsCnt, "time", time.Since(start).String())

if len(indexData.Entries) == 0 {
log.Debugw("No data segments found")
return nil, fmt.Errorf("no data segments found")
}

Expand Down Expand Up @@ -475,6 +488,7 @@ func parsePieceWithDataSegmentIndex(pieceCid cid.Cid, unpaddedSize int64, r type
}

if err := eg.Wait(); err != nil {
log.Debugw("Failed to calculate valid entries", "error", err)
return nil, fmt.Errorf("could not calculate valid entries: %w", err)
}

Expand All @@ -484,7 +498,8 @@ func parsePieceWithDataSegmentIndex(pieceCid cid.Cid, unpaddedSize int64, r type
}

if len(validSegments) == 0 {
return nil, fmt.Errorf("no data segments found")
log.Debugw("No valid data segments found")
return nil, fmt.Errorf("no valid data segments found")
}

log.Debugw("podsi: validated data segment index", "validSegments", len(validSegments), "time", time.Since(start).String())
Expand All @@ -505,7 +520,7 @@ func parsePieceWithDataSegmentIndex(pieceCid cid.Cid, unpaddedSize int64, r type

subRecs, err := parseRecordsFromCar(bufio.NewReaderSize(cr, PodsiBuffesrSize))
if err != nil {
// revisit when non-car files supported: one corrupt segment shouldn't translate into an error in other segments.
log.Debugw("Failed to parse data segment", "error", err)
return nil, fmt.Errorf("could not parse data segment #%d at offset %d: %w", len(recs), segOffset, err)
}
for i := range subRecs {
Expand Down

0 comments on commit 8f6f6ff

Please sign in to comment.