Files
tasks/service/worker/scanner/taskqueue/db.go
zeekay 5a601d081b rebrand: go.temporal.io/server -> github.com/hanzoai/tasks
Full module path rebrand from Temporal to Hanzo Tasks:
- go.mod module: github.com/hanzoai/tasks
- All internal Go imports updated (1906 files)
- cmd/server renamed to cmd/tasksd
- Binary name: tasksd (was temporal-server)
- Docker images: hanzoai/tasks (was temporalio/server)
- README rewritten with Hanzo Tasks branding
- LLM.md created with integration notes
- Makefile, goreleaser, CI workflows updated
- go.temporal.io/sdk and go.temporal.io/api imports preserved (separate repos)

Fork of Temporal.io (MIT license).
2026-03-19 10:36:40 -07:00

106 lines
2.5 KiB
Go

package taskqueue
import (
"context"
"math"
"time"
"go.temporal.io/api/serviceerror"
"github.com/hanzoai/tasks/common/backoff"
p "github.com/hanzoai/tasks/common/persistence"
)
var (
retryForeverPolicy = backoff.NewExponentialRetryPolicy(250 * time.Millisecond).
WithExpirationInterval(backoff.NoInterval).
WithMaximumInterval(30 * time.Second)
)
func (s *Scavenger) completeTasks(
ctx context.Context,
key *p.TaskQueueKey,
exclusiveMaxTaskID int64,
limit int,
) (int, error) {
var n int
var err error
err = s.retryForever(func() error {
n, err = s.db.CompleteTasksLessThan(ctx, &p.CompleteTasksLessThanRequest{
NamespaceID: key.NamespaceID,
TaskQueueName: key.TaskQueueName,
TaskType: key.TaskQueueType,
ExclusiveMaxTaskID: exclusiveMaxTaskID,
Limit: limit,
})
return err
})
return n, err
}
func (s *Scavenger) getTasks(
ctx context.Context,
key *p.TaskQueueKey,
batchSize int,
) (*p.GetTasksResponse, error) {
var err error
var resp *p.GetTasksResponse
err = s.retryForever(func() error {
resp, err = s.db.GetTasks(ctx, &p.GetTasksRequest{
NamespaceID: key.NamespaceID,
TaskQueue: key.TaskQueueName,
TaskType: key.TaskQueueType,
InclusiveMinTaskID: 0, // get the first N tasks sorted by taskID
ExclusiveMaxTaskID: math.MaxInt64,
PageSize: batchSize,
})
return err
})
return resp, err
}
func (s *Scavenger) listTaskQueue(
ctx context.Context,
pageSize int,
pageToken []byte,
) (*p.ListTaskQueueResponse, error) {
var err error
var resp *p.ListTaskQueueResponse
err = s.retryForever(func() error {
resp, err = s.db.ListTaskQueue(ctx, &p.ListTaskQueueRequest{
PageSize: pageSize,
PageToken: pageToken,
})
return err
})
return resp, err
}
func (s *Scavenger) deleteTaskQueue(
ctx context.Context,
key *p.TaskQueueKey,
rangeID int64,
) error {
// retry only on service busy errors
return backoff.ThrottleRetry(func() error {
return s.db.DeleteTaskQueue(ctx, &p.DeleteTaskQueueRequest{
TaskQueue: &p.TaskQueueKey{
NamespaceID: key.NamespaceID,
TaskQueueName: key.TaskQueueName,
TaskQueueType: key.TaskQueueType,
},
RangeID: rangeID,
})
}, retryForeverPolicy, func(err error) bool {
_, ok := err.(*serviceerror.ResourceExhausted)
return ok
})
}
func (s *Scavenger) retryForever(op func() error) error {
return backoff.ThrottleRetry(op, retryForeverPolicy, s.isRetryable)
}
func (s *Scavenger) isRetryable(err error) bool {
return s.Alive()
}