| 746 | } |
| 747 | |
| 748 | func (s *LiveStore) cutOneInstanceToWal(ctx context.Context, inst *instance, immediate bool) { |
| 749 | ctx, span := tracer.Start(ctx, "LiveStore.cutOneInstanceToWal", |
| 750 | oteltrace.WithAttributes( |
| 751 | attribute.String("tenant", inst.tenantID), |
| 752 | attribute.Bool("immediate", immediate), |
| 753 | )) |
| 754 | defer span.End() |
| 755 | |
| 756 | var liveTracesDrained bool |
| 757 | var err error |
| 758 | for !liveTracesDrained { |
| 759 | // Regular trace cuts (live traces -> head block) |
| 760 | liveTracesDrained, err = inst.cutIdleTraces(ctx, immediate) |
| 761 | if err != nil { |
| 762 | level.Error(s.logger).Log("msg", "failed to cut idle traces", "tenant", inst.tenantID, "err", err) |
| 763 | span.SetStatus(codes.Error, err.Error()) |
| 764 | span.RecordError(err) |
| 765 | break |
| 766 | } |
| 767 | id, err := inst.cutBlocks(ctx, immediate) |
| 768 | if err != nil { |
| 769 | level.Error(s.logger).Log("msg", "failed to cut blocks", "tenant", inst.tenantID, "err", err) |
| 770 | span.SetStatus(codes.Error, err.Error()) |
| 771 | span.RecordError(err) |
| 772 | break |
| 773 | } |
| 774 | if id != uuid.Nil { |
| 775 | span.AddEvent("block enqueued for completion", |
| 776 | oteltrace.WithAttributes(attribute.String("blockID", id.String()))) |
| 777 | if err := s.enqueueCompleteOp(inst.tenantID, id, false); err != nil { |
| 778 | level.Error(s.logger).Log("msg", "failed to enqueue complete operation", "tenant", inst.tenantID, "err", err) |
| 779 | span.RecordError(err) |
| 780 | } |
| 781 | } |
| 782 | } |
| 783 | } |
| 784 | |
| 785 | // CheckReady returns nil if the live-store is ready to serve queries |
| 786 | func (s *LiveStore) CheckReady(_ context.Context) error { |