--- /dev/null
+package torrent
+
+import (
+ "io/ioutil"
+ "os"
+ "testing"
+
+ "github.com/stretchr/testify/require"
+
+ "github.com/anacrolix/torrent/internal/testutil"
+ "github.com/anacrolix/torrent/storage"
+)
+
+func TestHashPieceAfterStorageClosed(t *testing.T) {
+ td, err := ioutil.TempDir("", "")
+ require.NoError(t, err)
+ defer os.RemoveAll(td)
+ cs := storage.NewFile(td)
+ tt := &Torrent{}
+ tt.info = &testutil.GreetingMetaInfo().Info
+ tt.makePieces()
+ tt.storage, err = cs.OpenTorrent(tt.info)
+ require.NoError(t, err)
+ require.NoError(t, tt.storage.Close())
+ tt.hashPiece(0)
+}
return
}
+func (t *Torrent) makePieces() {
+ hashes := infoPieceHashes(&t.info.Info)
+ t.pieces = make([]piece, len(hashes))
+ for i, hash := range hashes {
+ piece := &t.pieces[i]
+ piece.t = t
+ piece.index = i
+ piece.noPendingWrites.L = &piece.pendingWritesMutex
+ missinggo.CopyExact(piece.Hash[:], hash)
+ }
+}
+
// Called when metadata for a torrent becomes available.
func (t *Torrent) setInfoBytes(b []byte) error {
if t.haveInfo() {
}
t.metadataBytes = b
t.metadataCompletedChunks = nil
- hashes := infoPieceHashes(&t.info.Info)
- t.pieces = make([]piece, len(hashes))
- for i, hash := range hashes {
- piece := &t.pieces[i]
- piece.t = t
- piece.index = i
- piece.noPendingWrites.L = &piece.pendingWritesMutex
- missinggo.CopyExact(piece.Hash[:], hash)
- }
+ t.makePieces()
for _, conn := range t.conns {
if err := conn.setNumPieces(t.numPieces()); err != nil {
log.Printf("closing connection: %s", err)