summaryrefslogtreecommitdiffstats
path: root/internal
diff options
context:
space:
mode:
Diffstat (limited to 'internal')
-rw-r--r--internal/app/poll/poller.go28
1 files changed, 23 insertions, 5 deletions
diff --git a/internal/app/poll/poller.go b/internal/app/poll/poller.go
index 2ee2b8a..f79e98e 100644
--- a/internal/app/poll/poller.go
+++ b/internal/app/poll/poller.go
@@ -8,6 +8,7 @@ import (
"errors"
"fmt"
"sync"
+ "sync/atomic"
runnerv1 "code.gitea.io/actions-proto-go/runner/v1"
"github.com/bufbuild/connect-go"
@@ -20,9 +21,10 @@ import (
)
type Poller struct {
- client client.Client
- runner *run.Runner
- cfg *config.Config
+ 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.
}
func New(cfg *config.Config, client client.Client, runner *run.Runner) *Poller {
@@ -77,7 +79,11 @@ func (p *Poller) fetchTask(ctx context.Context) (*runnerv1.Task, bool) {
reqCtx, cancel := context.WithTimeout(ctx, p.cfg.Runner.FetchTimeout)
defer cancel()
- resp, err := p.client.FetchTask(reqCtx, connect.NewRequest(&runnerv1.FetchTaskRequest{}))
+ // Load the version value that was in the cache when the request was sent.
+ v := p.tasksVersion.Load()
+ resp, err := p.client.FetchTask(reqCtx, connect.NewRequest(&runnerv1.FetchTaskRequest{
+ TasksVersion: v,
+ }))
if errors.Is(err, context.DeadlineExceeded) {
err = nil
}
@@ -86,8 +92,20 @@ func (p *Poller) fetchTask(ctx context.Context) (*runnerv1.Task, bool) {
return nil, false
}
- if resp == nil || resp.Msg == nil || resp.Msg.Task == nil {
+ if resp == nil || resp.Msg == nil {
return nil, false
}
+
+ if resp.Msg.TasksVersion > v {
+ p.tasksVersion.CompareAndSwap(v, resp.Msg.TasksVersion)
+ }
+
+ if resp.Msg.Task == nil {
+ return nil, false
+ }
+
+ // got a task, set `tasksVersion` to zero to focre query db in next request.
+ p.tasksVersion.CompareAndSwap(resp.Msg.TasksVersion, 0)
+
return resp.Msg.Task, true
}