Skip to content

Commit adc6960

Browse files
committed
feat: increase routing limits
1 parent 4737f6f commit adc6960

File tree

3 files changed

+85
-18
lines changed

3 files changed

+85
-18
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ require (
99
github.com/felixge/httpsnoop v1.0.4
1010
github.com/ipfs-shipyard/nopfs v0.0.12
1111
github.com/ipfs-shipyard/nopfs/ipfs v0.13.2-0.20231024163508-120e0c51ee3a
12-
github.com/ipfs/boxo v0.21.0
12+
github.com/ipfs/boxo v0.21.1-0.20240726111146-e95eeb2ae5f1
1313
github.com/ipfs/go-block-format v0.2.0
1414
github.com/ipfs/go-cid v0.4.1
1515
github.com/ipfs/go-datastore v0.6.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -237,8 +237,8 @@ github.com/ipfs-shipyard/nopfs/ipfs v0.13.2-0.20231024163508-120e0c51ee3a h1:MKG
237237
github.com/ipfs-shipyard/nopfs/ipfs v0.13.2-0.20231024163508-120e0c51ee3a/go.mod h1:6EekK/jo+TynwSE/ZOiOJd4eEvRXoavEC3vquKtv4yI=
238238
github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs=
239239
github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0=
240-
github.com/ipfs/boxo v0.21.0 h1:XpGXb+TQQ0IUdYaeAxGzWjSs6ow/Lce148A/2IbRDVE=
241-
github.com/ipfs/boxo v0.21.0/go.mod h1:NmweAYeY1USOaJJxouy7DLr/Y5M8UBSsCI2KRivO+TY=
240+
github.com/ipfs/boxo v0.21.1-0.20240726111146-e95eeb2ae5f1 h1:wsetxKWIhOhGi8exgTrZfhxiky76YSwdTcm1ZdcIqAU=
241+
github.com/ipfs/boxo v0.21.1-0.20240726111146-e95eeb2ae5f1/go.mod h1:NmweAYeY1USOaJJxouy7DLr/Y5M8UBSsCI2KRivO+TY=
242242
github.com/ipfs/go-bitfield v1.1.0 h1:fh7FIo8bSwaJEh6DdTWbCeZ1eqOaOkKFI74SCnsWbGA=
243243
github.com/ipfs/go-bitfield v1.1.0/go.mod h1:paqf1wjq/D2BBmzfTVFlJQ9IlFOZpg422HL0HqsGWHU=
244244
github.com/ipfs/go-bitswap v0.11.0 h1:j1WVvhDX1yhG32NTC9xfxnqycqYIlhzEzLXG/cU1HyQ=

setup_bitswap.go

Lines changed: 82 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package main
22

33
import (
44
"context"
5+
"github.com/ipfs/boxo/routing/providerquerymanager"
6+
"github.com/libp2p/go-libp2p/core/peerstore"
57
"time"
68

79
"github.com/ipfs/boxo/bitswap"
@@ -23,6 +25,12 @@ import (
2325

2426
func setupBitswapExchange(ctx context.Context, cfg Config, h host.Host, cr routing.ContentRouting, bstore blockstore.Blockstore) exchange.Interface {
2527
bsctx := metri.CtxScope(ctx, "ipfs_bitswap")
28+
n := &providerQueryNetwork{cr, h}
29+
pqm, err := providerquerymanager.New(ctx, n, providerquerymanager.WithMaxInProcessRequests(100))
30+
if err != nil {
31+
panic(err)
32+
}
33+
cr = &wrapProv{pqm: pqm}
2634
bn := bsnet.NewFromIpfsHost(h, cr)
2735

2836
// --- Client Options
@@ -33,6 +41,14 @@ func setupBitswapExchange(ctx context.Context, cfg Config, h host.Host, cr routi
3341
// bitswap.ProviderSearchDelay: default is 1 second.
3442
providerSearchDelay := 1 * time.Second
3543

44+
// --- Bitswap Client Options
45+
clientOpts := []bsclient.Option{
46+
bsclient.RebroadcastDelay(rebroadcastDelay),
47+
bsclient.ProviderSearchDelay(providerSearchDelay),
48+
bsclient.WithoutDuplicatedBlockStats(),
49+
bsclient.WithDefaultLookupManagement(false),
50+
}
51+
3652
// If peering and shared cache are both enabled, we initialize both a
3753
// Client and a Server with custom request filter and custom options.
3854
// client+server is more expensive but necessary when deployment requires
@@ -50,37 +66,88 @@ func setupBitswapExchange(ctx context.Context, cfg Config, h host.Host, cr routi
5066
return ok
5167
}
5268

53-
// Initialize client+server
54-
bswap := bitswap.New(bsctx, bn, bstore,
55-
// --- Client Options
56-
bitswap.RebroadcastDelay(rebroadcastDelay),
57-
bitswap.ProviderSearchDelay(providerSearchDelay),
58-
bitswap.WithoutDuplicatedBlockStats(),
69+
// turn bitswap clients option into bitswap options
70+
var opts []bitswap.Option
71+
for _, o := range clientOpts {
72+
opts = append(opts, bitswap.WithClientOption(o))
73+
}
5974

60-
// ---- Server Options
75+
// ---- Server Options
76+
opts = append(opts,
6177
bitswap.WithPeerBlockRequestFilter(peerBlockRequestFilter),
6278
bitswap.ProvideEnabled(false),
6379
// Do not keep track of other peer's wantlists, we only want to reply if we
6480
// have a block. If we get it later, it's no longer relevant.
6581
bitswap.WithPeerLedger(&noopPeerLedger{}),
6682
// When we don't have a block, don't reply. This reduces processment.
67-
bitswap.SetSendDontHaves(false),
68-
)
83+
bitswap.SetSendDontHaves(false))
84+
85+
// Initialize client+server
86+
bswap := bitswap.New(bsctx, bn, bstore, opts...)
6987
bn.Start(bswap)
7088
return &noNotifyExchange{bswap}
7189
}
7290

7391
// By default, rainbow runs with bitswap client alone
74-
bswap := bsclient.New(bsctx, bn, bstore,
75-
// --- Client Options
76-
bsclient.RebroadcastDelay(rebroadcastDelay),
77-
bsclient.ProviderSearchDelay(providerSearchDelay),
78-
bsclient.WithoutDuplicatedBlockStats(),
79-
)
92+
bswap := bsclient.New(bsctx, bn, bstore, clientOpts...)
8093
bn.Start(bswap)
8194
return bswap
8295
}
8396

97+
type providerQueryNetwork struct {
98+
routing.ContentRouting
99+
host.Host
100+
}
101+
102+
func (p *providerQueryNetwork) ConnectTo(ctx context.Context, id peer.ID) error {
103+
return p.Host.Connect(ctx, peer.AddrInfo{ID: id})
104+
}
105+
106+
func (p *providerQueryNetwork) FindProvidersAsync(ctx context.Context, c cid.Cid, i int) <-chan peer.ID {
107+
out := make(chan peer.ID, i)
108+
go func() {
109+
defer close(out)
110+
providers := p.ContentRouting.FindProvidersAsync(ctx, c, i)
111+
for info := range providers {
112+
if info.ID == p.Host.ID() {
113+
continue // ignore self as provider
114+
}
115+
p.Host.Peerstore().AddAddrs(info.ID, info.Addrs, peerstore.TempAddrTTL)
116+
select {
117+
case <-ctx.Done():
118+
return
119+
case out <- info.ID:
120+
}
121+
}
122+
}()
123+
return out
124+
}
125+
126+
type wrapProv struct {
127+
pqm *providerquerymanager.ProviderQueryManager
128+
}
129+
130+
var _ routing.ContentRouting = (*wrapProv)(nil)
131+
132+
func (r *wrapProv) Provide(ctx context.Context, c cid.Cid, b bool) error {
133+
return routing.ErrNotSupported
134+
}
135+
136+
func (r *wrapProv) FindProvidersAsync(ctx context.Context, c cid.Cid, _ int) <-chan peer.AddrInfo {
137+
retCh := make(chan peer.AddrInfo)
138+
go func() {
139+
defer close(retCh)
140+
provsCh := r.pqm.FindProvidersAsync(ctx, c)
141+
for p := range provsCh {
142+
select {
143+
case retCh <- peer.AddrInfo{ID: p}:
144+
case <-ctx.Done():
145+
}
146+
}
147+
}()
148+
return retCh
149+
}
150+
84151
type noopPeerLedger struct{}
85152

86153
func (*noopPeerLedger) Wants(p peer.ID, e wl.Entry) {}

0 commit comments

Comments
 (0)