]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Expose ClientConfig.Extensions
authorMatt Joiner <anacrolix@gmail.com>
Thu, 23 Apr 2020 03:03:35 +0000 (13:03 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Thu, 23 Apr 2020 03:03:40 +0000 (13:03 +1000)
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.

client.go
config.go
peer_protocol/handshake.go
peerconn.go
test/issue377_test.go
torrent_test.go

index 4c2d58a7dfc89c31613c254ddb374eee7655e950..5ca405a58e7c01fc67fe62408d90ed55c50dc2d1 100644 (file)
--- a/client.go
+++ b/client.go
@@ -64,8 +64,6 @@ type Client struct {
        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
@@ -122,6 +120,7 @@ func (cl *Client) WriteStatus(_w io.Writer) {
        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) {
@@ -186,7 +185,6 @@ func NewClient(cfg *ClientConfig) (cl *Client, err error) {
                }
                cl.Close()
        }()
-       cl.extensionBytes = defaultPeerExtensionBytes()
        cl.event.L = cl.locker()
        storageImpl := cfg.DefaultStorage
        if storageImpl == nil {
@@ -847,7 +845,7 @@ func (cl *Client) receiveHandshakes(c *PeerConn) (t *Torrent, err error) {
 }
 
 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
        }
@@ -927,7 +925,7 @@ func (cl *Client) runHandshookConn(c *PeerConn, t *Torrent) error {
 
 // 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,
@@ -968,7 +966,7 @@ func (cl *Client) sendInitialMessages(conn *PeerConn, torrent *Torrent) {
                }
                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(),
index 1c9be6ef40b6278012eb7049c705b07853bc3472..105e8674bfca7775a3e039ddf0165f81e0d45e20 100644 (file)
--- a/config.go
+++ b/config.go
@@ -128,6 +128,8 @@ type ClientConfig struct {
        DHTOnQuery func(query *krpc.Msg, source net.Addr) (propagate bool)
 
        DefaultRequestStrategy RequestStrategyMaker
+
+       Extensions PeerExtensionBits
 }
 
 func (cfg *ClientConfig) SetListenAddr(addr string) *ClientConfig {
@@ -169,6 +171,8 @@ func NewDefaultClientConfig() *ClientConfig {
                Logger:         log.Default,
 
                DefaultRequestStrategy: RequestStrategyDuplicateRequestTimeout(5 * time.Second),
+
+               Extensions: defaultPeerExtensionBytes(),
        }
        //cc.ConnTracker.SetNoMaxEntries()
        //cc.ConnTracker.Timeout = func(conntrack.Entry) time.Duration { return 0 }
index 09d9343e9be32b85ff01aa242b209486ede7f76d..e23f8b623978e940fe6a4cd4d851b84d8075e478 100644 (file)
@@ -41,7 +41,7 @@ func (me PeerExtensionBits) String() string {
 
 func NewPeerExtensionBytes(bits ...ExtensionBit) (ret PeerExtensionBits) {
        for _, b := range bits {
-               ret.SetBit(b)
+               ret.SetBit(b, true)
        }
        return
 }
@@ -58,8 +58,12 @@ func (pex PeerExtensionBits) SupportsFast() bool {
        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 {
index 9bb51facd0b38eeacb6e4488100f0a3229ccc2a5..0e267a78a31bff77dbfeb25e42728cba831a406f 100644 (file)
@@ -934,7 +934,7 @@ func (c *PeerConn) lastHelpful() (ret time.Time) {
 }
 
 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) {
index b6f761787d57f1e00cb75f1bcb30eea774b249ef..c723e51a7228ada4e19c3db28d6e6b4077482e38 100644 (file)
@@ -7,6 +7,7 @@ import (
        "testing"
 
        "github.com/anacrolix/log"
+       pp "github.com/anacrolix/torrent/peer_protocol"
 
        "github.com/stretchr/testify/assert"
        "github.com/stretchr/testify/require"
@@ -22,7 +23,15 @@ func justOneNetwork(cc *torrent.ClientConfig) {
        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()
@@ -33,6 +42,7 @@ func TestReceiveChunkStorageFailure(t *testing.T) {
        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()
@@ -64,6 +74,8 @@ func TestReceiveChunkStorageFailure(t *testing.T) {
        seederTorrent.AddClientPeer(leecherClient)
        <-leecherTorrent.GotInfo()
        assertReadAllGreeting(t, leecherTorrent.NewReader())
+       // TODO: Check that PeerConns fastEnabled matches seederFast?
+       //select {}
 }
 
 type pieceState struct {
index 5ecd93b4378b52f6e5a4b9e521f7cdffcb49b5c4..6c47a80cfbd7ffffef5bdc4b35d4aa3bef570fb4 100644 (file)
@@ -183,7 +183,7 @@ func TestTorrentMetainfoIncompleteMetadata(t *testing.T) {
        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))