From: Matt Joiner Date: Wed, 7 May 2025 11:57:32 +0000 (+1000) Subject: Fix some corner case chunk prefix handling X-Git-Tag: v1.59.0~164 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=5180780f7755221d955399e3f84d16e4adfa30a4;p=btrtrc.git Fix some corner case chunk prefix handling --- diff --git a/storage/piece-resource.go b/storage/piece-resource.go index 8e73b829..81837fbb 100644 --- a/storage/piece-resource.go +++ b/storage/piece-resource.go @@ -90,7 +90,7 @@ type ConsecutiveChunkReader interface { } type ChunksReaderer interface { - ChunksReader(prefix string) (PieceReader, error) + ChunksReader(dir string) (PieceReader, error) } type PrefixDeleter interface { @@ -384,11 +384,12 @@ func (me piecePerResourcePiece) hasMovePrefix() bool { return ok } -func (s piecePerResourcePiece) getChunksReader(prefix string) (PieceReader, error) { +// Chunks are in dirs, we add the prefix ourselves. +func (s piecePerResourcePiece) getChunksReader(dir string) (PieceReader, error) { if opt, ok := s.rp.(ChunksReaderer); ok { - return opt.ChunksReader(prefix) + return opt.ChunksReader(dir) } - return chunkPieceReader{s.getChunks(prefix)}, nil + return chunkPieceReader{s.getChunks(dir)}, nil } func (s piecePerResourcePiece) NewReader() (PieceReader, error) { @@ -396,11 +397,11 @@ func (s piecePerResourcePiece) NewReader() (PieceReader, error) { defer s.mu.RUnlock() if s.mustIsComplete() { if s.hasMovePrefix() { - return s.getChunksReader(s.completedDirPath() + "/") + return s.getChunksReader(s.completedDirPath()) } return instancePieceReader{s.completedInstance()}, nil } - return s.getChunksReader(s.incompleteDirPath() + "/") + return s.getChunksReader(s.incompleteDirPath()) } type instancePieceReader struct { diff --git a/storage/possum/possum-provider.go b/storage/possum/possum-provider.go index d75adb7f..1e58dcd1 100644 --- a/storage/possum/possum-provider.go +++ b/storage/possum/possum-provider.go @@ -56,7 +56,8 @@ type ChunkReader interface { // TODO: Should the parent ReadConsecutiveChunks method take the expected number of bytes to avoid // trying to read discontinuous or incomplete sequences of chunks? -func (p Provider) ChunksReader(prefix string) (ret storage.PieceReader, err error) { +func (p Provider) ChunksReader(dir string) (ret storage.PieceReader, err error) { + prefix := dir + "/" p.Logger.Levelf(log.Critical, "ChunkReader(%q)", prefix) //debug.PrintStack() pr, err := p.Handle.NewReader() diff --git a/storage/wrappers.go b/storage/wrappers.go index 5406da63..640b53a2 100644 --- a/storage/wrappers.go +++ b/storage/wrappers.go @@ -47,12 +47,11 @@ func (t *Torrent) PieceWithHash(p metainfo.Piece, pieceHash g.Option[[]byte]) Pi } else { pieceImpl = t.TorrentImpl.Piece(p) } - return Piece{pieceImpl, t, p} + return Piece{pieceImpl, p} } type Piece struct { PieceImpl - t *Torrent mip metainfo.Piece }