2
0
mirror of synced 2025-02-23 14:18:13 +00:00

Don't verify data at startup, add Torrent.Piece.VerifyData and Torrent.VerifyData for this purpose

This has the side effect of deflaking a lot of tests that race to verify data when a torrent is added.
This commit is contained in:
Matt Joiner 2017-09-15 19:22:32 +10:00
parent b39df82fbc
commit 2aa20b3e22
4 changed files with 53 additions and 21 deletions

View File

@ -381,10 +381,8 @@ func testClientTransfer(t *testing.T, ps testClientTransferParams) {
if ps.ExportClientStatus {
testutil.ExportStatusWriter(seeder, "s")
}
// seederTorrent, new, err := seeder.AddTorrentSpec(TorrentSpecFromMetaInfo(mi))
_, new, err := seeder.AddTorrentSpec(TorrentSpecFromMetaInfo(mi))
require.NoError(t, err)
assert.True(t, new)
seederTorrent, _, _ := seeder.AddTorrentSpec(TorrentSpecFromMetaInfo(mi))
seederTorrent.VerifyData()
// Create leecher and a Torrent.
leecherDataDir, err := ioutil.TempDir("", "")
require.NoError(t, err)
@ -454,7 +452,8 @@ func TestSeedAfterDownloading(t *testing.T) {
require.NoError(t, err)
defer seeder.Close()
testutil.ExportStatusWriter(seeder, "s")
seeder.AddTorrentSpec(TorrentSpecFromMetaInfo(mi))
seederTorrent, _, _ := seeder.AddTorrentSpec(TorrentSpecFromMetaInfo(mi))
seederTorrent.VerifyData()
cfg.DataDir, err = ioutil.TempDir("", "")
require.NoError(t, err)
defer os.RemoveAll(cfg.DataDir)
@ -619,7 +618,8 @@ func TestResponsive(t *testing.T) {
seeder, err := NewClient(cfg)
require.Nil(t, err)
defer seeder.Close()
seeder.AddTorrentSpec(TorrentSpecFromMetaInfo(mi))
seederTorrent, _, _ := seeder.AddTorrentSpec(TorrentSpecFromMetaInfo(mi))
seederTorrent.VerifyData()
leecherDataDir, err := ioutil.TempDir("", "")
require.Nil(t, err)
defer os.RemoveAll(leecherDataDir)
@ -661,7 +661,8 @@ func TestTorrentDroppedDuringResponsiveRead(t *testing.T) {
seeder, err := NewClient(cfg)
require.Nil(t, err)
defer seeder.Close()
seeder.AddTorrentSpec(TorrentSpecFromMetaInfo(mi))
seederTorrent, _, _ := seeder.AddTorrentSpec(TorrentSpecFromMetaInfo(mi))
seederTorrent.VerifyData()
leecherDataDir, err := ioutil.TempDir("", "")
require.Nil(t, err)
defer os.RemoveAll(leecherDataDir)
@ -759,6 +760,7 @@ func testAddTorrentPriorPieceCompletion(t *testing.T, alreadyCompleted bool, csf
greetingDataTempDir, greetingMetainfo := testutil.GreetingTestTorrent()
defer os.RemoveAll(greetingDataTempDir)
filePieceStore := csf(fileCache)
defer filePieceStore.Close()
info, err := greetingMetainfo.UnmarshalInfo()
require.NoError(t, err)
ih := greetingMetainfo.HashInfoBytes()
@ -770,8 +772,7 @@ func testAddTorrentPriorPieceCompletion(t *testing.T, alreadyCompleted bool, csf
for i := 0; i < info.NumPieces(); i++ {
p := info.Piece(i)
if alreadyCompleted {
err := greetingData.Piece(p).MarkComplete()
assert.NoError(t, err)
require.NoError(t, greetingData.Piece(p).MarkComplete())
}
}
cfg := TestingConfig()
@ -844,7 +845,8 @@ func testDownloadCancel(t *testing.T, ps testDownloadCancelParams) {
if ps.ExportClientStatus {
testutil.ExportStatusWriter(seeder, "s")
}
seeder.AddTorrentSpec(TorrentSpecFromMetaInfo(mi))
seederTorrent, _, _ := seeder.AddTorrentSpec(TorrentSpecFromMetaInfo(mi))
seederTorrent.VerifyData()
leecherDataDir, err := ioutil.TempDir("", "")
require.NoError(t, err)
defer os.RemoveAll(leecherDataDir)
@ -1064,7 +1066,8 @@ func makeMagnet(t *testing.T, cl *Client, dir string, name string) string {
magnet := mi.Magnet(name, mi.HashInfoBytes()).String()
tr, err := cl.AddTorrent(&mi)
require.NoError(t, err)
assert.True(t, tr.Seeding())
require.True(t, tr.Seeding())
tr.VerifyData()
return magnet
}

View File

@ -36,10 +36,13 @@ type piece struct {
index int
// Chunks we've written to since the last check. The chunk offset and
// length can be determined by the request chunkSize in use.
DirtyChunks bitmap.Bitmap
Hashing bool
QueuedForHash bool
EverHashed bool
DirtyChunks bitmap.Bitmap
Hashing bool
QueuedForHash bool
EverHashed bool
numVerifies int64
PublicPieceState PieceState
priority piecePriority
@ -157,3 +160,16 @@ func (p *piece) bytesLeft() (ret pp.Integer) {
}
return p.length() - p.numDirtyBytes()
}
func (p *piece) VerifyData() {
p.t.cl.mu.Lock()
defer p.t.cl.mu.Unlock()
target := p.numVerifies + 1
if p.Hashing {
target++
}
p.t.queuePieceCheck(p.index)
for p.numVerifies < target {
p.t.cl.event.Wait()
}
}

6
t.go
View File

@ -209,3 +209,9 @@ func (t *Torrent) AddTrackers(announceList [][]string) {
defer t.cl.mu.Unlock()
t.addTrackers(announceList)
}
func (t *Torrent) Piece(i int) *piece {
t.cl.mu.Lock()
defer t.cl.mu.Unlock()
return &t.pieces[i]
}

View File

@ -284,13 +284,13 @@ func (t *Torrent) setInfoBytes(b []byte) error {
}
for i := range t.pieces {
t.updatePieceCompletion(i)
t.pieces[i].QueuedForHash = true
// t.pieces[i].QueuedForHash = true
}
go func() {
for i := range t.pieces {
t.verifyPiece(i)
}
}()
// go func() {
// for i := range t.pieces {
// t.verifyPiece(i)
// }
// }()
return nil
}
@ -1485,6 +1485,7 @@ func (t *Torrent) verifyPiece(piece int) {
cl.mu.Unlock()
sum := t.hashPiece(piece)
cl.mu.Lock()
p.numVerifies++
p.Hashing = false
t.pieceHashed(piece, sum == p.Hash)
}
@ -1518,3 +1519,9 @@ func (t *Torrent) queuePieceCheck(pieceIndex int) {
t.publishPieceChange(pieceIndex)
go t.verifyPiece(pieceIndex)
}
func (t *Torrent) VerifyData() {
for i := range iter.N(t.NumPieces()) {
t.Piece(i).VerifyData()
}
}