Make torrent.Reader reads fail when the torrent is closed instead of stalling
This commit is contained in:
parent
d01c6221e6
commit
bc5d79e1d3
@ -536,6 +536,48 @@ func TestResponsive(t *testing.T) {
|
|||||||
assert.EqualValues(t, "d\n", string(b))
|
assert.EqualValues(t, "d\n", string(b))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestTorrentDroppedDuringResponsiveRead(t *testing.T) {
|
||||||
|
seederDataDir, mi := testutil.GreetingTestTorrent()
|
||||||
|
defer os.RemoveAll(seederDataDir)
|
||||||
|
cfg := TestingConfig
|
||||||
|
cfg.Seed = true
|
||||||
|
cfg.DataDir = seederDataDir
|
||||||
|
seeder, err := NewClient(&cfg)
|
||||||
|
require.Nil(t, err)
|
||||||
|
defer seeder.Close()
|
||||||
|
seeder.AddTorrentSpec(TorrentSpecFromMetaInfo(mi))
|
||||||
|
leecherDataDir, err := ioutil.TempDir("", "")
|
||||||
|
require.Nil(t, err)
|
||||||
|
defer os.RemoveAll(leecherDataDir)
|
||||||
|
cfg = TestingConfig
|
||||||
|
cfg.DataDir = leecherDataDir
|
||||||
|
leecher, err := NewClient(&cfg)
|
||||||
|
require.Nil(t, err)
|
||||||
|
defer leecher.Close()
|
||||||
|
leecherTorrent, _, _ := leecher.AddTorrentSpec(func() (ret *TorrentSpec) {
|
||||||
|
ret = TorrentSpecFromMetaInfo(mi)
|
||||||
|
ret.ChunkSize = 2
|
||||||
|
return
|
||||||
|
}())
|
||||||
|
leecherTorrent.AddPeers([]Peer{
|
||||||
|
Peer{
|
||||||
|
IP: missinggo.AddrIP(seeder.ListenAddr()),
|
||||||
|
Port: missinggo.AddrPort(seeder.ListenAddr()),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
reader := leecherTorrent.NewReader()
|
||||||
|
reader.SetReadahead(0)
|
||||||
|
reader.SetResponsive()
|
||||||
|
b := make([]byte, 2)
|
||||||
|
_, err = reader.ReadAt(b, 3)
|
||||||
|
assert.Nil(t, err)
|
||||||
|
assert.EqualValues(t, "lo", string(b))
|
||||||
|
go leecherTorrent.Drop()
|
||||||
|
n, err := reader.ReadAt(b, 11)
|
||||||
|
assert.EqualError(t, err, "torrent closed")
|
||||||
|
assert.EqualValues(t, 0, n)
|
||||||
|
}
|
||||||
|
|
||||||
func TestDHTInheritBlocklist(t *testing.T) {
|
func TestDHTInheritBlocklist(t *testing.T) {
|
||||||
ipl := iplist.New(nil)
|
ipl := iplist.New(nil)
|
||||||
require.NotNil(t, ipl)
|
require.NotNil(t, ipl)
|
||||||
|
@ -42,6 +42,9 @@ func (r *Reader) readable(off int64) (ret bool) {
|
|||||||
// defer func() {
|
// defer func() {
|
||||||
// log.Println("readable", ret)
|
// log.Println("readable", ret)
|
||||||
// }()
|
// }()
|
||||||
|
if r.t.isClosed() {
|
||||||
|
return true
|
||||||
|
}
|
||||||
req, ok := r.t.offsetRequest(off)
|
req, ok := r.t.offsetRequest(off)
|
||||||
if !ok {
|
if !ok {
|
||||||
panic(off)
|
panic(off)
|
||||||
@ -138,6 +141,12 @@ again:
|
|||||||
err = nil
|
err = nil
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if r.t.isClosed() {
|
||||||
|
if err == nil {
|
||||||
|
err = errors.New("torrent closed")
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
if err == io.ErrUnexpectedEOF {
|
if err == io.ErrUnexpectedEOF {
|
||||||
goto again
|
goto again
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user