]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Fix some corner case chunk prefix handling
authorMatt Joiner <anacrolix@gmail.com>
Wed, 7 May 2025 11:57:32 +0000 (21:57 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Wed, 7 May 2025 11:57:32 +0000 (21:57 +1000)
storage/piece-resource.go
storage/possum/possum-provider.go
storage/wrappers.go

index 8e73b82933a647abd2fee3cfaff14743f440e7fd..81837fbbe18a6fd8b4dd5e223e50f07a861a7a44 100644 (file)
@@ -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 {
index d75adb7fc9ee2c496d1aa73d6f93c7e6e2c5f1e5..1e58dcd1bef4978190841a6e5384d0a2b3d39fcf 100644 (file)
@@ -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()
index 5406da6378834b7ce14b5999cf9b86963035bafc..640b53a2d394e296fabb387fff3d7707758ad952 100644 (file)
@@ -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
 }