feat(provider): info log AcceleratedDHTClient crawl (#11143)
* feat(provider): log fullrt crawl * fix(provider): improve AcceleratedDHTClient log messages use config option name instead of internal "fullrt" jargon, align terminology with daemon startup message, add time estimate --------- Co-authored-by: Marcin Rataj <lidel@lidel.org>
Guillaume Michel committed
Jan 15, 2026 at 17:11 UTC
698354342edd396bebd99e067de732d14aca07fe
1 file changed
+34
-3
core/node/provider.go
+34
-3
@@ -16,6 +16,7 @@ import (
16
"github.com/ipfs/go-datastore"
17
"github.com/ipfs/go-datastore/namespace"
18
"github.com/ipfs/go-datastore/query"
19
+ log "github.com/ipfs/go-log/v2"
20
"github.com/ipfs/kubo/config"
21
"github.com/ipfs/kubo/repo"
22
irouting "github.com/ipfs/kubo/routing"
@@ -53,6 +54,8 @@ const (
54
keystoreDatastorePath = "keystore"
55
)
56
57
+var errAcceleratedDHTNotReady = errors.New("AcceleratedDHTClient: routing table not ready")
58
+
59
// Interval between reprovide queue monitoring checks for slow reprovide alerts.
60
// Used when Provide.DHT.SweepEnabled=true
61
const reprovideAlertPollInterval = 15 * time.Minute
@@ -325,13 +328,34 @@ type dhtImpl interface {
328
329
type fullrtRouter struct {
330
*fullrt.FullRT
331
+ ready bool
332
+ logger *log.ZapEventLogger
333
+}
334
+
335
+func newFullRTRouter(fr *fullrt.FullRT, loggerName string) *fullrtRouter {
336
+ return &fullrtRouter{
337
+ FullRT: fr,
338
+ ready: true,
339
+ logger: log.Logger(loggerName),
340
+ }
341
}
342
343
// GetClosestPeers overrides fullrt.FullRT's GetClosestPeers and returns an
344
// error if the fullrt's initial network crawl isn't complete yet.
345
func (fr *fullrtRouter) GetClosestPeers(ctx context.Context, key string) ([]peer.ID, error) {
333
- if !fr.Ready() {
334
- return nil, errors.New("fullrt: initial network crawl still running")
346
+ if fr.ready {
347
+ if !fr.Ready() {
348
+ fr.ready = false
349
+ fr.logger.Info("AcceleratedDHTClient: waiting for routing table initialization (5-10 min, depends on DHT size and network) to complete before providing")
350
+ return nil, errAcceleratedDHTNotReady
351
+ }
352
+ } else {
353
+ if fr.Ready() {
354
+ fr.ready = true
355
+ fr.logger.Info("AcceleratedDHTClient: routing table ready, providing can begin")
356
+ } else {
357
+ return nil, errAcceleratedDHTNotReady
358
+ }
359
}
360
return fr.FullRT.GetClosestPeers(ctx, key)
361
}
@@ -382,6 +406,9 @@ func SweepingProviderOpt(cfg *config.Config) fx.Option {
406
// provides happen as fast as possible via a dedicated worker that continuously
407
// processes the queue regardless of this timing.
408
bufferedIdleWriteTime = time.Minute
409
+
410
+ // loggerName is the name of the go-log logger used by the provider.
411
+ loggerName = dhtprovider.DefaultLoggerName
412
)
413
414
bufferedProviderOpts := []buffered.Option{
@@ -411,6 +438,8 @@ func SweepingProviderOpt(cfg *config.Config) fx.Option {
438
ddhtprovider.WithDedicatedPeriodicWorkers(int(cfg.Provide.DHT.DedicatedPeriodicWorkers.WithDefault(config.DefaultProvideDHTDedicatedPeriodicWorkers))),
439
ddhtprovider.WithDedicatedBurstWorkers(int(cfg.Provide.DHT.DedicatedBurstWorkers.WithDefault(config.DefaultProvideDHTDedicatedBurstWorkers))),
440
ddhtprovider.WithMaxProvideConnsPerWorker(int(cfg.Provide.DHT.MaxProvideConnsPerWorker.WithDefault(config.DefaultProvideDHTMaxProvideConnsPerWorker))),
441
+
442
+ ddhtprovider.WithLoggerName(loggerName),
443
)
444
if err != nil {
445
return nil, nil, err
@@ -419,7 +448,7 @@ func SweepingProviderOpt(cfg *config.Config) fx.Option {
448
}
449
case *fullrt.FullRT:
450
if inDht != nil {
422
- impl = &fullrtRouter{inDht}
451
+ impl = newFullRTRouter(inDht, loggerName)
452
}
453
}
454
if impl == nil {
@@ -454,6 +483,8 @@ func SweepingProviderOpt(cfg *config.Config) fx.Option {
483
dhtprovider.WithDedicatedPeriodicWorkers(int(cfg.Provide.DHT.DedicatedPeriodicWorkers.WithDefault(config.DefaultProvideDHTDedicatedPeriodicWorkers))),
484
dhtprovider.WithDedicatedBurstWorkers(int(cfg.Provide.DHT.DedicatedBurstWorkers.WithDefault(config.DefaultProvideDHTDedicatedBurstWorkers))),
485
dhtprovider.WithMaxProvideConnsPerWorker(int(cfg.Provide.DHT.MaxProvideConnsPerWorker.WithDefault(config.DefaultProvideDHTMaxProvideConnsPerWorker))),
486
+
487
+ dhtprovider.WithLoggerName(loggerName),
488
}
489
490
prov, err := dhtprovider.New(opts...)