feat(seeding): wire seed ratio/time lifecycle into the torrent daemon
SeedRatio/SeedTime were declared on TorrentConfig but never consumed, and SeedEnabled was hardcoded false in both constructors — the daemon never seeded, and if forced it seeded forever. - config: [downloads] seed_enabled/seed_ratio/seed_time (opt-in, off by default) - daemon: parse seed_time + wire all three; startup log per target shape - engine: seedTargetReached() (pure) + seedAndDrop() background monitor on a downloader-scoped seedCtx (not the task ctx, which dies when Download returns); drops the torrent on ratio (uploaded/size) OR time, whichever first; no target = seed until shutdown. Configurable check interval (tests lower it). - fix: cleanup() now always drops — previously leaked the handle on error paths when seeding was enabled. - refactor: dropTracked() helper shared by cleanup + post-seeding drop. Tests: TestSeedTargetReached (9 cases) + ctx/no-target branches + loopback swarm smoke (-tags smoke). Roadmap hueco closed.
This commit is contained in:
parent
665ec0a34f
commit
132c88b3f0
8 changed files with 459 additions and 34 deletions
|
|
@ -204,6 +204,9 @@ func runDaemonStart() error {
|
|||
metaTimeout, _ := time.ParseDuration(cfg.Download.MetadataTimeout)
|
||||
stallTimeout, _ := time.ParseDuration(cfg.Download.StallTimeout)
|
||||
|
||||
// Parse the seeding time target (0/"" = no time target — ratio-only or forever)
|
||||
seedTime, _ := time.ParseDuration(cfg.Download.SeedTime)
|
||||
|
||||
// Create progress reporter — only used for stream tasks (handleStreamTask)
|
||||
// The sync goroutine handles all regular progress reporting.
|
||||
statusInterval, _ := time.ParseDuration(cfg.Daemon.StatusInterval)
|
||||
|
|
@ -273,7 +276,9 @@ func runDaemonStart() error {
|
|||
MaxDownloadRate: maxDl,
|
||||
MaxUploadRate: maxUl,
|
||||
ListenPort: cfg.Download.ListenPort,
|
||||
SeedEnabled: false,
|
||||
SeedEnabled: cfg.Download.SeedEnabled,
|
||||
SeedRatio: cfg.Download.SeedRatio,
|
||||
SeedTime: seedTime,
|
||||
VPNTunnel: vpnTunnel,
|
||||
})
|
||||
if err != nil {
|
||||
|
|
@ -291,6 +296,19 @@ func runDaemonStart() error {
|
|||
log.Printf("Speed limits: download=%s upload=%s", dlStr, ulStr)
|
||||
}
|
||||
|
||||
if cfg.Download.SeedEnabled {
|
||||
switch {
|
||||
case cfg.Download.SeedRatio > 0 && seedTime > 0:
|
||||
log.Printf("[torrent] seeding enabled (stop at ratio %.2f or %s, whichever first)", cfg.Download.SeedRatio, seedTime)
|
||||
case cfg.Download.SeedRatio > 0:
|
||||
log.Printf("[torrent] seeding enabled (stop at ratio %.2f)", cfg.Download.SeedRatio)
|
||||
case seedTime > 0:
|
||||
log.Printf("[torrent] seeding enabled (stop after %s)", seedTime)
|
||||
default:
|
||||
log.Printf("[torrent] seeding enabled (no ratio/time target — seeds until shutdown)")
|
||||
}
|
||||
}
|
||||
|
||||
// Create debrid downloader
|
||||
debridDl := engine.NewDebridDownloader()
|
||||
usenetDl := engine.NewUsenetDownloader(agentClient)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue