Repository: ipfs/go-bitswap
Pull request #110 (2019-04-22 20:19:41)

Control provider workers with experiment flag
We are working on removing the providing behavior from `go-bitswap` and putting it into its own module in `go-ipfs`. At first the feature will be experimental, and so this commit allows us to disable the provide announcements by setting `bitswap.ProvideEnabled` to `false` before creating bitswap. The default value is `true`.


Patch:
diff --git a/bitswap.go b/bitswap.go
index 7e63d93..9a2a128 100644
--- a/bitswap.go
+++ b/bitswap.go
@@ -51,6 +51,8 @@ const (
 )
 
 var (
+	ProvideEnabled = true
+
 	HasBlockBufferSize    = 256
 	provideKeysBufferSize = 2048
 	provideWorkerMax      = 6
@@ -258,11 +260,13 @@ func (bs *Bitswap) receiveBlockFrom(blk blocks.Block, from peer.ID) error {
 
 	bs.engine.AddBlock(blk)
 
-	select {
-	case bs.newBlocks <- blk.Cid():
-		// send block off to be reprovided
-	case <-bs.process.Closing():
-		return bs.process.Close()
+	if ProvideEnabled {
+		select {
+		case bs.newBlocks <- blk.Cid():
+			// send block off to be reprovided
+		case <-bs.process.Closing():
+			return bs.process.Close()
+		}
 	}
 	return nil
 }
diff --git a/workers.go b/workers.go
index 45f7861..6e0bf03 100644
--- a/workers.go
+++ b/workers.go
@@ -23,15 +23,17 @@ func (bs *Bitswap) startWorkers(px process.Process, ctx context.Context) {
 		})
 	}
 
-	// Start up a worker to manage sending out provides messages
-	px.Go(func(px process.Process) {
-		bs.provideCollector(ctx)
-	})
-
-	// Spawn up multiple workers to handle incoming blocks
-	// consider increasing number if providing blocks bottlenecks
-	// file transfers
-	px.Go(bs.provideWorker)
+	if ProvideEnabled {
+		// Start up a worker to manage sending out provides messages
+		px.Go(func(px process.Process) {
+			bs.provideCollector(ctx)
+		})
+
+		// Spawn up multiple workers to handle incoming blocks
+		// consider increasing number if providing blocks bottlenecks
+		// file transfers
+		px.Go(bs.provideWorker)
+	}
 }
 
 func (bs *Bitswap) taskWorker(ctx context.Context, id int) {


Test patch:
diff --git a/bitswap_test.go b/bitswap_test.go
index bbd1b34..127ac0d 100644
--- a/bitswap_test.go
+++ b/bitswap_test.go
@@ -10,6 +10,7 @@ import (
 
 	decision "github.com/ipfs/go-bitswap/decision"
 	"github.com/ipfs/go-bitswap/message"
+	bssession "github.com/ipfs/go-bitswap/session"
 	tn "github.com/ipfs/go-bitswap/testnet"
 
 	blocks "github.com/ipfs/go-block-format"
@@ -99,6 +100,42 @@ func TestGetBlockFromPeerAfterPeerAnnounces(t *testing.T) {
 	}
 }
 
+func TestDoesNotProvideWhenConfiguredNotTo(t *testing.T) {
+	ProvideEnabled = false
+	defer func() { ProvideEnabled = true }()
+
+	net := tn.VirtualNetwork(mockrouting.NewServer(), delay.Fixed(kNetworkDelay))
+	block := blocks.NewBlock([]byte("block"))
+	g := NewTestSessionGenerator(net)
+	defer g.Close()
+
+	hasBlock := g.Next()
+	defer hasBlock.Exchange.Close()
+
+	if err := hasBlock.Exchange.HasBlock(block); err != nil {
+		t.Fatal(err)
+	}
+
+	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
+	defer cancel()
+
+	wantsBlock := g.Next()
+	defer wantsBlock.Exchange.Close()
+
+	ns := wantsBlock.Exchange.NewSession(ctx).(*bssession.Session)
+	// set find providers delay to less than timeout context of this test
+	ns.SetBaseTickDelay(10 * time.Millisecond)
+
+	received, err := ns.GetBlock(ctx, block.Cid())
+	if received != nil {
+		t.Fatalf("Expected to find nothing, found %s", received)
+	}
+
+	if err != context.DeadlineExceeded {
+		t.Fatal("Expected deadline exceeded")
+	}
+}
+
 func TestUnwantedBlockNotAdded(t *testing.T) {
 
 	net := tn.VirtualNetwork(mockrouting.NewServer(), delay.Fixed(kNetworkDelay))