Also run the storage failure test with fast disabled for the seeder. This probably would have tickled some issues in the past, so it seems like a good place to try it out.
listeners []Listener
dhtServers []DhtServer
ipBlockList iplist.Ranger
- // Our BitTorrent protocol extension bytes, sent in our BT handshakes.
- extensionBytes pp.PeerExtensionBits
// Set of addresses that have our client ID. This intentionally will
// include ourselves if we end up trying to connect to our own address
defer w.Flush()
fmt.Fprintf(w, "Listen port: %d\n", cl.LocalPort())
fmt.Fprintf(w, "Peer ID: %+q\n", cl.PeerID())
+ fmt.Fprintf(w, "Extension bits: %v\n", cl.config.Extensions)
fmt.Fprintf(w, "Announce key: %x\n", cl.announceKey())
fmt.Fprintf(w, "Banned IPs: %d\n", len(cl.badPeerIPsLocked()))
cl.eachDhtServer(func(s DhtServer) {
}
cl.Close()
}()
- cl.extensionBytes = defaultPeerExtensionBytes()
cl.event.L = cl.locker()
storageImpl := cfg.DefaultStorage
if storageImpl == nil {
}
func (cl *Client) connBtHandshake(c *PeerConn, ih *metainfo.Hash) (ret metainfo.Hash, err error) {
- res, err := pp.Handshake(c.rw(), ih, cl.peerID, cl.extensionBytes)
+ res, err := pp.Handshake(c.rw(), ih, cl.peerID, cl.config.Extensions)
if err != nil {
return
}
// See the order given in Transmission's tr_peerMsgsNew.
func (cl *Client) sendInitialMessages(conn *PeerConn, torrent *Torrent) {
- if conn.PeerExtensionBytes.SupportsExtended() && cl.extensionBytes.SupportsExtended() {
+ if conn.PeerExtensionBytes.SupportsExtended() && cl.config.Extensions.SupportsExtended() {
conn.post(pp.Message{
Type: pp.Extended,
ExtendedID: pp.HandshakeExtendedID,
}
conn.postBitfield()
}()
- if conn.PeerExtensionBytes.SupportsDHT() && cl.extensionBytes.SupportsDHT() && cl.haveDhtServer() {
+ if conn.PeerExtensionBytes.SupportsDHT() && cl.config.Extensions.SupportsDHT() && cl.haveDhtServer() {
conn.post(pp.Message{
Type: pp.Port,
Port: cl.dhtPort(),
DHTOnQuery func(query *krpc.Msg, source net.Addr) (propagate bool)
DefaultRequestStrategy RequestStrategyMaker
+
+ Extensions PeerExtensionBits
}
func (cfg *ClientConfig) SetListenAddr(addr string) *ClientConfig {
Logger: log.Default,
DefaultRequestStrategy: RequestStrategyDuplicateRequestTimeout(5 * time.Second),
+
+ Extensions: defaultPeerExtensionBytes(),
}
//cc.ConnTracker.SetNoMaxEntries()
//cc.ConnTracker.Timeout = func(conntrack.Entry) time.Duration { return 0 }
func NewPeerExtensionBytes(bits ...ExtensionBit) (ret PeerExtensionBits) {
for _, b := range bits {
- ret.SetBit(b)
+ ret.SetBit(b, true)
}
return
}
return pex.GetBit(ExtensionBitFast)
}
-func (pex *PeerExtensionBits) SetBit(bit ExtensionBit) {
- pex[7-bit/8] |= 1 << (bit % 8)
+func (pex *PeerExtensionBits) SetBit(bit ExtensionBit, on bool) {
+ if on {
+ pex[7-bit/8] |= 1 << (bit % 8)
+ } else {
+ pex[7-bit/8] &^= 1 << (bit % 8)
+ }
}
func (pex PeerExtensionBits) GetBit(bit ExtensionBit) bool {
}
func (c *PeerConn) fastEnabled() bool {
- return c.PeerExtensionBytes.SupportsFast() && c.t.cl.extensionBytes.SupportsFast()
+ return c.PeerExtensionBytes.SupportsFast() && c.t.cl.config.Extensions.SupportsFast()
}
func (c *PeerConn) reject(r request) {
"testing"
"github.com/anacrolix/log"
+ pp "github.com/anacrolix/torrent/peer_protocol"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
cc.DisableIPv4 = true
}
+func TestReceiveChunkStorageFailureSeederFastExtensionDisabled(t *testing.T) {
+ testReceiveChunkStorageFailure(t, false)
+}
+
func TestReceiveChunkStorageFailure(t *testing.T) {
+ testReceiveChunkStorageFailure(t, true)
+}
+
+func testReceiveChunkStorageFailure(t *testing.T, seederFast bool) {
seederDataDir, metainfo := testutil.GreetingTestTorrent()
defer os.RemoveAll(seederDataDir)
seederClientConfig := torrent.TestingConfig()
seederClientConfig.DefaultStorage = seederClientStorage
seederClientConfig.Seed = true
seederClientConfig.Debug = true
+ seederClientConfig.Extensions.SetBit(pp.ExtensionBitFast, seederFast)
seederClient, err := torrent.NewClient(seederClientConfig)
require.NoError(t, err)
defer seederClient.Close()
seederTorrent.AddClientPeer(leecherClient)
<-leecherTorrent.GotInfo()
assertReadAllGreeting(t, leecherTorrent.NewReader())
+ // TODO: Check that PeerConns fastEnabled matches seederFast?
+ //select {}
}
type pieceState struct {
defer nc.Close()
var pex PeerExtensionBits
- pex.SetBit(pp.ExtensionBitExtended)
+ pex.SetBit(pp.ExtensionBitExtended, true)
hr, err := pp.Handshake(nc, &ih, [20]byte{}, pex)
require.NoError(t, err)
assert.True(t, hr.PeerExtensionBits.GetBit(pp.ExtensionBitExtended))