in lib/torrent/scheduler/dispatch/dispatcher.go [111:151]
func newDispatcher(
config Config,
stats tally.Scope,
clk clock.Clock,
netevents networkevent.Producer,
events Events,
peerID core.PeerID,
t storage.Torrent,
logger *zap.SugaredLogger,
tlog *torrentlog.Logger) (*Dispatcher, error) {
config = config.applyDefaults()
stats = stats.Tagged(map[string]string{
"module": "dispatch",
})
pieceRequestTimeout := config.calcPieceRequestTimeout(t.MaxPieceLength())
pieceRequestManager, err := piecerequest.NewManager(
clk, pieceRequestTimeout, config.PieceRequestPolicy, config.PipelineLimit)
if err != nil {
return nil, fmt.Errorf("piece request manager: %s", err)
}
return &Dispatcher{
config: config,
stats: stats,
clk: clk,
createdAt: clk.Now(),
localPeerID: peerID,
torrent: newTorrentAccessWatcher(t, clk),
numPeersByPiece: syncutil.NewCounters(t.NumPieces()),
netevents: netevents,
pieceRequestTimeout: pieceRequestTimeout,
pieceRequestManager: pieceRequestManager,
pendingPiecesDone: make(chan struct{}),
events: events,
logger: logger,
torrentlog: tlog,
}, nil
}