client.go | 12 ++++++++++++ peerconn.go | 1 - test/transfer_test.go | 36 +++++++++++++++++++++++++++--------- diff --git a/client.go b/client.go index 7d2523f97fb431a4994eb79ed725aa8cec23c698..b0f4b2a3728a497a5e0061379f6def8f136fce33 100644 --- a/client.go +++ b/client.go @@ -808,6 +808,12 @@ if err == nil { torrent.Add("initiated conn with preferred header obfuscation", 1) return } + c.logger.Levelf( + log.Debug, + "error doing protocol handshake with header obfuscation %v", + obfuscatedHeaderFirst, + ) + firstDialResult.Conn.Close() // We should have just tried with the preferred header obfuscation. If it was required, there's nothing else to try. if headerObfuscationPolicy.RequirePreferred { return @@ -832,6 +838,12 @@ if err == nil { torrent.Add("initiated conn with fallback header obfuscation", 1) return } + c.logger.Levelf( + log.Debug, + "error doing protocol handshake with header obfuscation %v", + !obfuscatedHeaderFirst, + ) + secondDialResult.Conn.Close() return } diff --git a/peerconn.go b/peerconn.go index a9b835ac584ac9b11de2adff7cf21e0af597caee..68da20f1b1db29e54085fb31d7a7b97ab3d12134 100644 --- a/peerconn.go +++ b/peerconn.go @@ -95,7 +95,6 @@ return from.String() }), ","), cn.pex.numPending(), ) - } } diff --git a/test/transfer_test.go b/test/transfer_test.go index a008d26f4a9424599d48cd6ab493c23c10e9a4dd..a719fcc73f7c4de4d0b946b8f432054881ce8079 100644 --- a/test/transfer_test.go +++ b/test/transfer_test.go @@ -9,6 +9,7 @@ "testing" "testing/iotest" "time" + "github.com/anacrolix/log" "github.com/anacrolix/missinggo/v2/filecache" qt "github.com/frankban/quicktest" "github.com/stretchr/testify/assert" @@ -132,7 +133,7 @@ } // Check that after completing leeching, a leecher transitions to a seeding // correctly. Connected in a chain like so: Seeder <-> Leecher <-> LeecherLeecher. -func TestSeedAfterDownloading(t *testing.T) { +func testSeedAfterDownloading(t *testing.T, disableUtp bool) { greetingTempDir, mi := testutil.GreetingTestTorrent() defer os.RemoveAll(greetingTempDir) @@ -140,6 +141,7 @@ cfg := torrent.TestingConfig(t) cfg.Seed = true cfg.MaxAllocPeerRequestDataPerConn = 4 cfg.DataDir = greetingTempDir + cfg.DisableUTP = disableUtp seeder, err := torrent.NewClient(cfg) require.NoError(t, err) defer seeder.Close() @@ -152,15 +154,21 @@ cfg = torrent.TestingConfig(t) cfg.Seed = true cfg.DataDir = t.TempDir() + cfg.DisableUTP = disableUtp + //cfg.Debug = true + cfg.Logger = log.Default.WithContextText("leecher") leecher, err := torrent.NewClient(cfg) require.NoError(t, err) defer leecher.Close() defer testutil.ExportStatusWriter(leecher, "l", t)() cfg = torrent.TestingConfig(t) + cfg.DisableUTP = disableUtp cfg.Seed = false cfg.DataDir = t.TempDir() cfg.MaxAllocPeerRequestDataPerConn = 4 + cfg.Logger = log.Default.WithContextText("leecher-leecher") + cfg.Debug = true leecherLeecher, _ := torrent.NewClient(cfg) require.NoError(t, err) defer leecherLeecher.Close() @@ -183,15 +191,17 @@ // Simultaneously DownloadAll in Leecher, and read the contents // consecutively in LeecherLeecher. This non-deterministically triggered a // case where the leecher wouldn't unchoke the LeecherLeecher. var wg sync.WaitGroup - wg.Add(1) - go func() { - defer wg.Done() + { + // Prioritize a region, and ensure it's been hashed, so we want connections. r := llg.NewReader() - defer r.Close() - qt.Check(t, iotest.TestReader(r, []byte(testutil.GreetingFileContents)), qt.IsNil) - }() - done := make(chan struct{}) - defer close(done) + llg.VerifyData() + wg.Add(1) + go func() { + defer wg.Done() + defer r.Close() + qt.Check(t, iotest.TestReader(r, []byte(testutil.GreetingFileContents)), qt.IsNil) + }() + } go leecherGreeting.AddClientPeer(seeder) go leecherGreeting.AddClientPeer(leecherLeecher) wg.Add(1) @@ -202,3 +212,11 @@ leecher.WaitAll() }() wg.Wait() } + +func TestSeedAfterDownloadingDisableUtp(t *testing.T) { + testSeedAfterDownloading(t, true) +} + +func TestSeedAfterDownloadingAllowUtp(t *testing.T) { + testSeedAfterDownloading(t, false) +}