@@ -80,7 +80,7 @@ func New(
80
80
// Queue to manage tasks
81
81
queueMetrics := queue .NewMetrics (r , metricsNamespace , metricsSubsystem )
82
82
queueLimits := NewQueueLimits (limits )
83
- tasksQueue , err := queue .NewQueue (logger , cfg .Queue , queueLimits , queueMetrics )
83
+ tasksQueue , err := queue .NewQueue (logger , cfg .Queue , queueLimits , queueMetrics , storageMetrics )
84
84
if err != nil {
85
85
return nil , fmt .Errorf ("error creating tasks queue: %w" , err )
86
86
}
@@ -280,7 +280,8 @@ func (p *Planner) runOne(ctx context.Context) error {
280
280
281
281
now := time .Now ()
282
282
for _ , task := range tasks {
283
- queueTask := NewQueueTask (ctx , now , task , resultsCh )
283
+ protoTask := task .ToProtoTask ()
284
+ queueTask := NewQueueTask (ctx , now , protoTask , resultsCh )
284
285
if err := p .enqueueTask (queueTask ); err != nil {
285
286
level .Error (logger ).Log ("msg" , "error enqueuing task" , "err" , err )
286
287
continue
@@ -703,7 +704,7 @@ func (p *Planner) tenants(ctx context.Context, table config.DayTable) (*iter.Sli
703
704
}
704
705
705
706
func (p * Planner ) enqueueTask (task * QueueTask ) error {
706
- return p .tasksQueue .Enqueue (task .Tenant () , task , func () {
707
+ return p .tasksQueue .Enqueue (task .ProtoTask , task . TaskMeta , func () {
707
708
task .timesEnqueued .Add (1 )
708
709
})
709
710
}
@@ -738,7 +739,7 @@ func (p *Planner) BuilderLoop(builder protos.PlannerForBuilder_BuilderLoopServer
738
739
739
740
lastIndex := queue .StartIndex
740
741
for p .isRunningOrStopping () {
741
- item , idx , err := p .tasksQueue .Dequeue (builder .Context (), lastIndex , builderID )
742
+ protoTask , meta , idx , err := p .tasksQueue .Dequeue (builder .Context (), lastIndex , builderID )
742
743
if err != nil {
743
744
if errors .Is (err , queue .ErrStopped ) {
744
745
// Planner is stopping, break the loop and return
@@ -748,36 +749,40 @@ func (p *Planner) BuilderLoop(builder protos.PlannerForBuilder_BuilderLoopServer
748
749
}
749
750
lastIndex = idx
750
751
751
- if item == nil {
752
+ if protoTask == nil {
752
753
return fmt .Errorf ("dequeue() call resulted in nil response. builder: %s" , builderID )
753
754
}
754
755
755
- task := item .(* QueueTask )
756
- logger := log .With (logger , "task" , task .ID ())
756
+ task := & QueueTask {
757
+ ProtoTask : protoTask ,
758
+ TaskMeta : meta .(* TaskMeta ),
759
+ }
760
+
761
+ logger := log .With (logger , "task" , task .Id )
757
762
758
763
queueTime := time .Since (task .queueTime )
759
764
p .metrics .queueDuration .Observe (queueTime .Seconds ())
760
765
761
766
if task .ctx .Err () != nil {
762
767
level .Warn (logger ).Log ("msg" , "task context done after dequeue" , "err" , task .ctx .Err ())
763
768
lastIndex = lastIndex .ReuseLastIndex ()
764
- p .tasksQueue .Release (task )
769
+ p .tasksQueue .Release (task . ProtoTask )
765
770
continue
766
771
}
767
772
768
773
result , err := p .forwardTaskToBuilder (builder , builderID , task )
769
774
if err != nil {
770
- maxRetries := p .limits .BloomTaskMaxRetries (task .Tenant () )
775
+ maxRetries := p .limits .BloomTaskMaxRetries (task .Tenant )
771
776
if maxRetries > 0 && int (task .timesEnqueued .Load ()) >= maxRetries {
772
- p .tasksQueue .Release (task )
777
+ p .tasksQueue .Release (task . ProtoTask )
773
778
level .Error (logger ).Log (
774
779
"msg" , "task failed after max retries" ,
775
780
"retries" , task .timesEnqueued .Load (),
776
781
"maxRetries" , maxRetries ,
777
782
"err" , err ,
778
783
)
779
784
task .resultsChannel <- & protos.TaskResult {
780
- TaskID : task .ID () ,
785
+ TaskID : task .Id ,
781
786
Error : fmt .Errorf ("task failed after max retries (%d): %w" , maxRetries , err ),
782
787
}
783
788
continue
@@ -786,10 +791,10 @@ func (p *Planner) BuilderLoop(builder protos.PlannerForBuilder_BuilderLoopServer
786
791
// Re-queue the task if the builder is failing to process the tasks
787
792
if err := p .enqueueTask (task ); err != nil {
788
793
p .metrics .taskLost .Inc ()
789
- p .tasksQueue .Release (task )
794
+ p .tasksQueue .Release (task . ProtoTask )
790
795
level .Error (logger ).Log ("msg" , "error re-enqueuing task. this task will be lost" , "err" , err )
791
796
task .resultsChannel <- & protos.TaskResult {
792
- TaskID : task .ID () ,
797
+ TaskID : task .Id ,
793
798
Error : fmt .Errorf ("error re-enqueuing task: %w" , err ),
794
799
}
795
800
continue
@@ -809,7 +814,7 @@ func (p *Planner) BuilderLoop(builder protos.PlannerForBuilder_BuilderLoopServer
809
814
"duration" , time .Since (task .queueTime ).Seconds (),
810
815
"retries" , task .timesEnqueued .Load ()- 1 , // -1 because the first enqueue is not a retry
811
816
)
812
- p .tasksQueue .Release (task )
817
+ p .tasksQueue .Release (task . ProtoTask )
813
818
814
819
// Send the result back to the task. The channel is buffered, so this should not block.
815
820
task .resultsChannel <- result
@@ -824,7 +829,7 @@ func (p *Planner) forwardTaskToBuilder(
824
829
task * QueueTask ,
825
830
) (* protos.TaskResult , error ) {
826
831
msg := & protos.PlannerToBuilder {
827
- Task : task .ToProtoTask () ,
832
+ Task : task .ProtoTask ,
828
833
}
829
834
830
835
if err := builder .Send (msg ); err != nil {
@@ -846,7 +851,7 @@ func (p *Planner) forwardTaskToBuilder(
846
851
}()
847
852
848
853
timeout := make (<- chan time.Time )
849
- taskTimeout := p .limits .BuilderResponseTimeout (task .Tenant () )
854
+ taskTimeout := p .limits .BuilderResponseTimeout (task .Tenant )
850
855
if taskTimeout != 0 {
851
856
// If the timeout is not 0 (disabled), configure it
852
857
timeout = time .After (taskTimeout )
@@ -886,8 +891,8 @@ func (p *Planner) receiveResultFromBuilder(
886
891
if err != nil {
887
892
return nil , fmt .Errorf ("error processing task result in builder (%s): %w" , builderID , err )
888
893
}
889
- if result .TaskID != task .ID () {
890
- return nil , fmt .Errorf ("unexpected task ID (%s) in response from builder (%s). Expected task ID is %s" , result .TaskID , builderID , task .ID () )
894
+ if result .TaskID != task .Id {
895
+ return nil , fmt .Errorf ("unexpected task ID (%s) in response from builder (%s). Expected task ID is %s" , result .TaskID , builderID , task .Id )
891
896
}
892
897
893
898
return result , nil
0 commit comments