This is very likely going to be a breaking change, but the alternative is a nightmare of backwards compatibility.
package torrent
import (
+ "context"
"errors"
"math/rand"
"strings"
var _ storage.ClientImpl = badStorage{}
-func (bs badStorage) OpenTorrent(*metainfo.Info, metainfo.Hash) (storage.TorrentImpl, error) {
+func (bs badStorage) OpenTorrent(
+ context.Context,
+ *metainfo.Info,
+ metainfo.Hash,
+) (storage.TorrentImpl, error) {
return storage.TorrentImpl{
Piece: bs.Piece,
}, nil
package torrent
import (
+ "context"
"encoding/binary"
"fmt"
"io"
info, err := greetingMetainfo.UnmarshalInfo()
require.NoError(t, err)
ih := greetingMetainfo.HashInfoBytes()
- greetingData, err := storage.NewClient(filePieceStore).OpenTorrent(&info, ih)
+ greetingData, err := storage.NewClient(filePieceStore).OpenTorrent(context.Background(), &info, ih)
require.NoError(t, err)
writeTorrentData(greetingData, info, []byte(testutil.GreetingFileContents))
// require.Equal(t, len(testutil.GreetingFileContents), written)
package torrent
import (
+ "context"
"io"
"runtime"
"testing"
}
func (s *storageClient) OpenTorrent(
+ _ context.Context,
info *metainfo.Info,
infoHash metainfo.Hash,
) (storage.TorrentImpl, error) {
package storage
import (
+ "context"
"encoding/binary"
"path/filepath"
"time"
return me.db.Close()
}
-func (me *boltClient) OpenTorrent(_ *metainfo.Info, infoHash metainfo.Hash) (TorrentImpl, error) {
+func (me *boltClient) OpenTorrent(
+ _ context.Context,
+ _ *metainfo.Info,
+ infoHash metainfo.Hash,
+) (TorrentImpl, error) {
t := &boltTorrent{me, infoHash}
return TorrentImpl{
Piece: t.Piece,
package storage
import (
+ "context"
"fmt"
"io"
+ "log/slog"
"os"
"path/filepath"
+ "github.com/anacrolix/log"
"github.com/anacrolix/missinggo/v2"
"github.com/anacrolix/torrent/common"
return me.opts.PieceCompletion.Close()
}
-func (fs fileClientImpl) OpenTorrent(info *metainfo.Info, infoHash metainfo.Hash) (_ TorrentImpl, err error) {
+func (fs fileClientImpl) OpenTorrent(
+ ctx context.Context,
+ info *metainfo.Info,
+ infoHash metainfo.Hash,
+) (_ TorrentImpl, err error) {
dir := fs.opts.TorrentDirMaker(fs.opts.ClientBaseDir, info, infoHash)
+ logger := log.ContextLogger(ctx).Slogger()
+ logger.DebugContext(ctx, "opened file torrent storage", slog.String("dir", dir))
upvertedFiles := info.UpvertedFiles()
files := make([]file, 0, len(upvertedFiles))
for i, fileInfo := range upvertedFiles {
import (
"bytes"
+ "context"
"io"
"os"
"path/filepath"
PieceLength: missinggo.MiB,
Pieces: make([]byte, 20),
}
- ts, err := s.OpenTorrent(info, metainfo.Hash{})
+ ts, err := s.OpenTorrent(context.Background(), info, metainfo.Hash{})
assert.NoError(t, err)
f, err := os.Create(filepath.Join(td, "a"))
require.NoError(t, err)
package storage
import (
+ "context"
"io"
g "github.com/anacrolix/generics"
// Represents data storage for an unspecified torrent.
type ClientImpl interface {
- OpenTorrent(info *metainfo.Info, infoHash metainfo.Hash) (TorrentImpl, error)
+ OpenTorrent(ctx context.Context, info *metainfo.Info, infoHash metainfo.Hash) (TorrentImpl, error)
}
type TorrentCapacity *func() (cap int64, capped bool)
package storage
import (
+ "context"
"testing"
"github.com/anacrolix/missinggo/v2/resource"
PieceLength: 1,
}
c := NewClient(ci)
- t1, err := c.OpenTorrent(&info, metainfo.HashBytes([]byte("a")))
+ t1, err := c.OpenTorrent(context.Background(), &info, metainfo.HashBytes([]byte("a")))
require.NoError(t, err)
defer t1.Close()
- t2, err := c.OpenTorrent(&info, metainfo.HashBytes([]byte("b")))
+ t2, err := c.OpenTorrent(context.Background(), &info, metainfo.HashBytes([]byte("b")))
require.NoError(t, err)
defer t2.Close()
t2p := t2.Piece(info.Piece(0))
package storage
import (
+ "context"
"testing"
g "github.com/anacrolix/generics"
Files: []metainfo.FileInfo{{Path: []string{"a"}, Length: 1}},
Pieces: make([]byte, 20),
}
- ts, err := cs.OpenTorrent(info, metainfo.Hash{})
+ ts, err := cs.OpenTorrent(context.Background(), info, metainfo.Hash{})
require.NoError(t, err)
p := ts.PieceWithHash(info.Piece(0), g.None[[]byte]())
require.NoError(t, p.MarkComplete())
package storage
import (
+ "context"
"errors"
"fmt"
"io"
}
}
-func (s *mmapClientImpl) OpenTorrent(info *metainfo.Info, infoHash metainfo.Hash) (_ TorrentImpl, err error) {
+func (s *mmapClientImpl) OpenTorrent(
+ _ context.Context,
+ info *metainfo.Info,
+ infoHash metainfo.Hash,
+) (_ TorrentImpl, err error) {
span, err := mMapTorrent(info, s.baseDir)
t := &mmapTorrentStorage{
infoHash: infoHash,
package storage
import (
+ "context"
"testing"
qt "github.com/frankban/quicktest"
}()
info, err := mi.UnmarshalInfo()
c.Assert(err, qt.IsNil)
- ts, err := cs.OpenTorrent(&info, mi.HashInfoBytes())
+ ts, err := cs.OpenTorrent(context.Background(), &info, mi.HashInfoBytes())
c.Assert(err, qt.IsNil)
defer func() {
c.Check(ts.Close(), qt.IsNil)
import (
"bytes"
+ "context"
"encoding/hex"
"fmt"
"io"
return nil
}
-func (s piecePerResource) OpenTorrent(info *metainfo.Info, infoHash metainfo.Hash) (TorrentImpl, error) {
+func (s piecePerResource) OpenTorrent(
+ ctx context.Context,
+ info *metainfo.Info,
+ infoHash metainfo.Hash,
+) (TorrentImpl, error) {
t := piecePerResourceTorrentImpl{
s,
make([]sync.RWMutex, info.NumPieces()),
package storage
import (
+ "context"
"fmt"
"log"
"path/filepath"
ClientBaseDir: t.TempDir(),
})
defer func() { c.Check(client.Close(), qt.IsNil) }()
- torImpl, err := client.OpenTorrent(&info, metainfo.Hash{})
+ torImpl, err := client.OpenTorrent(context.Background(), &info, metainfo.Hash{})
if _case.expectErr {
c.Check(err, qt.Not(qt.IsNil))
} else {
package sqliteStorage
import (
+ "context"
"encoding/hex"
"io"
"sync"
return
}
-func (c *client) OpenTorrent(*metainfo.Info, metainfo.Hash) (storage.TorrentImpl, error) {
+func (c *client) OpenTorrent(
+ context.Context,
+ *metainfo.Info,
+ metainfo.Hash,
+) (storage.TorrentImpl, error) {
t := torrent{c.cache}
capFunc := c.capacity
return storage.TorrentImpl{PieceWithHash: t.Piece, Close: t.Close, Capacity: &capFunc}, nil
import (
"bytes"
+ "context"
"math/rand"
"sync"
"testing"
Length: pieceSize * int64(numPieces),
Name: "TorrentName",
}
- ti, err := ci.OpenTorrent(info, metainfo.Hash{})
+ ti, err := ci.OpenTorrent(context.Background(), info, metainfo.Hash{})
c.Assert(err, qt.IsNil)
tw := storage.Torrent{ti}
defer tw.Close()
package storage
import (
+ "context"
"io"
"os"
return &Client{cl}
}
-func (cl Client) OpenTorrent(info *metainfo.Info, infoHash metainfo.Hash) (*Torrent, error) {
- t, err := cl.ci.OpenTorrent(info, infoHash)
+func (cl Client) OpenTorrent(
+ ctx context.Context,
+ info *metainfo.Info,
+ infoHash metainfo.Hash,
+) (*Torrent, error) {
+ t, err := cl.ci.OpenTorrent(ctx, info, infoHash)
if err != nil {
return nil, err
}
package test
import (
+ "context"
"errors"
"io"
"os"
return nil
}
-func (d *diskFullStorage) OpenTorrent(info *metainfo.Info, infoHash metainfo.Hash) (storage.TorrentImpl, error) {
+func (d *diskFullStorage) OpenTorrent(
+ _ context.Context,
+ info *metainfo.Info,
+ infoHash metainfo.Hash,
+) (storage.TorrentImpl, error) {
return storage.TorrentImpl{Piece: d.Piece, Close: d.Close}, nil
}
"fmt"
app "github.com/anacrolix/gostdapp"
+
"github.com/anacrolix/torrent"
)
}
if t.storageOpener != nil {
var err error
- t.storage, err = t.storageOpener.OpenTorrent(info, *t.canonicalShortInfohash())
+ ctx := log.ContextWithLogger(context.Background(), t.logger)
+ t.storage, err = t.storageOpener.OpenTorrent(ctx, info, *t.canonicalShortInfohash())
if err != nil {
return fmt.Errorf("error opening torrent storage: %s", err)
}