From e5fdaadbd202b0b39a1788444ed8e3ce720e0640 Mon Sep 17 00:00:00 2001 From: GitCaddy Date: Sun, 11 Jan 2026 15:29:21 +0000 Subject: [PATCH] feat: handle bandwidth test requests from server MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Update to actions-proto-go v0.5.7 with RequestBandwidthTest field - Add SetBandwidthManager method to Poller - Check FetchTaskResponse for bandwidth test request - Include bandwidth in capabilities sent to server 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- go.mod | 2 +- go.sum | 4 ++-- internal/app/cmd/daemon.go | 1 + internal/app/poll/poller.go | 32 ++++++++++++++++++++++++++++---- 4 files changed, 32 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index bcda02c..f3925c9 100644 --- a/go.mod +++ b/go.mod @@ -111,4 +111,4 @@ replace github.com/go-git/go-git/v5 => github.com/go-git/go-git/v5 v5.16.2 replace github.com/distribution/reference v0.6.0 => github.com/distribution/reference v0.5.0 // Use GitCaddy fork with capability support -replace code.gitea.io/actions-proto-go => git.marketally.com/gitcaddy/actions-proto-go v0.5.6 +replace code.gitea.io/actions-proto-go => git.marketally.com/gitcaddy/actions-proto-go v0.5.7 diff --git a/go.sum b/go.sum index 352ad75..147e945 100644 --- a/go.sum +++ b/go.sum @@ -6,8 +6,8 @@ cyphar.com/go-pathrs v0.2.1 h1:9nx1vOgwVvX1mNBWDu93+vaceedpbsDqo+XuBGL40b8= cyphar.com/go-pathrs v0.2.1/go.mod h1:y8f1EMG7r+hCuFf/rXsKqMJrJAUoADZGNh5/vZPKcGc= dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= -git.marketally.com/gitcaddy/actions-proto-go v0.5.6 h1:G7T0vpx8HyCFWd0YMJ9sp8rCsWtzFrCJK4BMdOFJa1A= -git.marketally.com/gitcaddy/actions-proto-go v0.5.6/go.mod h1:RPu21UoRD3zSAujoZR6LJwuVNa2uFRBveadslczCRfQ= +git.marketally.com/gitcaddy/actions-proto-go v0.5.7 h1:RUbafr3Vkw2l4WfSwa+oF+Ihakbm05W0FlAmXuQrDJc= +git.marketally.com/gitcaddy/actions-proto-go v0.5.7/go.mod h1:RPu21UoRD3zSAujoZR6LJwuVNa2uFRBveadslczCRfQ= gitea.com/gitea/act v0.261.7-0.20251202193638-5417d3ac6742 h1:ulcquQluJbmNASkh6ina70LvcHEa9eWYfQ+DeAZ0VEE= gitea.com/gitea/act v0.261.7-0.20251202193638-5417d3ac6742/go.mod h1:Pg5C9kQY1CEA3QjthjhlrqOC/QOT5NyWNjOjRHw23Ok= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= diff --git a/internal/app/cmd/daemon.go b/internal/app/cmd/daemon.go index cdf7cdb..3f4812f 100644 --- a/internal/app/cmd/daemon.go +++ b/internal/app/cmd/daemon.go @@ -189,6 +189,7 @@ func runDaemon(ctx context.Context, daemArgs *daemonArgs, configFile *string) fu go periodicCapabilitiesUpdate(ctx, runner, ls.Names(), dockerHost) poller := poll.New(cfg, cli, runner) + poller.SetBandwidthManager(bandwidthManager) if daemArgs.Once || reg.Ephemeral { done := make(chan struct{}) diff --git a/internal/app/poll/poller.go b/internal/app/poll/poller.go index ea7c177..734e1da 100644 --- a/internal/app/poll/poller.go +++ b/internal/app/poll/poller.go @@ -22,10 +22,11 @@ import ( ) type Poller struct { - client client.Client - runner *run.Runner - cfg *config.Config - tasksVersion atomic.Int64 // tasksVersion used to store the version of the last task fetched from the Gitea. + client client.Client + runner *run.Runner + cfg *config.Config + tasksVersion atomic.Int64 // tasksVersion used to store the version of the last task fetched from the Gitea. + bandwidthManager *envcheck.BandwidthManager pollingCtx context.Context shutdownPolling context.CancelFunc @@ -58,6 +59,11 @@ func New(cfg *config.Config, client client.Client, runner *run.Runner) *Poller { } } +// SetBandwidthManager sets the bandwidth manager for on-demand testing +func (p *Poller) SetBandwidthManager(bm *envcheck.BandwidthManager) { + p.bandwidthManager = bm +} + func (p *Poller) Poll() { limiter := rate.NewLimiter(rate.Every(p.cfg.Runner.FetchInterval), 1) wg := &sync.WaitGroup{} @@ -160,6 +166,12 @@ func (p *Poller) fetchTask(ctx context.Context) (*runnerv1.Task, bool) { // Detect capabilities including current disk space caps := envcheck.DetectCapabilities(ctx, p.cfg.Container.DockerHost) + + // Include latest bandwidth result if available + if p.bandwidthManager != nil { + caps.Bandwidth = p.bandwidthManager.GetLastResult() + } + capsJson := caps.ToJSON() // Load the version value that was in the cache when the request was sent. @@ -181,6 +193,18 @@ func (p *Poller) fetchTask(ctx context.Context) (*runnerv1.Task, bool) { return nil, false } + // Check if server requested a bandwidth test + if resp.Msg.RequestBandwidthTest && p.bandwidthManager != nil { + log.Info("Server requested bandwidth test, running now...") + go func() { + result := p.bandwidthManager.RunTest(ctx) + if result != nil { + log.Infof("Bandwidth test completed: %.1f Mbps download, %.0f ms latency", + result.DownloadMbps, result.Latency) + } + }() + } + if resp.Msg.TasksVersion > v { p.tasksVersion.CompareAndSwap(v, resp.Msg.TasksVersion) }