fix: Mark dataset as failed for PostGIS errors
This commit is contained in:
@@ -79,12 +79,16 @@ type DatasetProcessor interface {
|
||||
ExtractProperties(ctx context.Context, datasetID uuid.UUID) error
|
||||
Extract(ctx context.Context, datasetID uuid.UUID) error
|
||||
ConvertToCOG(ctx context.Context, datasetID uuid.UUID) error
|
||||
// MarkFailed records a terminal processing failure on the dataset so it does
|
||||
// not remain stuck in an in-progress status.
|
||||
MarkFailed(ctx context.Context, datasetID uuid.UUID, reason string) error
|
||||
}
|
||||
|
||||
// jobHandler dispatches a dataset job to one processor function.
|
||||
type jobHandler struct {
|
||||
name string
|
||||
fn func(ctx context.Context, id uuid.UUID) error
|
||||
proc DatasetProcessor
|
||||
log *slog.Logger
|
||||
}
|
||||
|
||||
@@ -94,25 +98,37 @@ func (h jobHandler) Handle(ctx context.Context, d amqp.Delivery) error {
|
||||
return fmt.Errorf("decode %s job: %w", h.name, err)
|
||||
}
|
||||
h.log.Info("processing dataset "+h.name, "dataset_id", job.DatasetID)
|
||||
return h.fn(ctx, job.DatasetID)
|
||||
|
||||
err := h.fn(ctx, job.DatasetID)
|
||||
if err != nil {
|
||||
// The delivery is nacked without requeue (see Consumer.dispatch), so the
|
||||
// job will not be retried. Record the failure on the dataset itself;
|
||||
// otherwise it stays stuck in an in-progress status forever (e.g. when a
|
||||
// PostGIS insert returns an error mid-job). Best-effort: log if marking
|
||||
// fails, but still return the original error so the delivery is nacked.
|
||||
if markErr := h.proc.MarkFailed(ctx, job.DatasetID, err.Error()); markErr != nil {
|
||||
h.log.Error("mark dataset failed", "dataset_id", job.DatasetID, "job", h.name, "error", markErr)
|
||||
}
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
// NewParseHandler returns a handler that parses datasets.
|
||||
func NewParseHandler(p DatasetProcessor, log *slog.Logger) Handler {
|
||||
return jobHandler{name: "parse", fn: p.Parse, log: log}
|
||||
return jobHandler{name: "parse", fn: p.Parse, proc: p, log: log}
|
||||
}
|
||||
|
||||
// NewPropertiesHandler returns a handler that extracts a plain vector's table.
|
||||
func NewPropertiesHandler(p DatasetProcessor, log *slog.Logger) Handler {
|
||||
return jobHandler{name: "properties", fn: p.ExtractProperties, log: log}
|
||||
return jobHandler{name: "properties", fn: p.ExtractProperties, proc: p, log: log}
|
||||
}
|
||||
|
||||
// NewExtractHandler returns a handler that extracts (unpivots) datasets.
|
||||
func NewExtractHandler(p DatasetProcessor, log *slog.Logger) Handler {
|
||||
return jobHandler{name: "extract", fn: p.Extract, log: log}
|
||||
return jobHandler{name: "extract", fn: p.Extract, proc: p, log: log}
|
||||
}
|
||||
|
||||
// NewConvertHandler returns a handler that converts rasters to COGs.
|
||||
func NewConvertHandler(p DatasetProcessor, log *slog.Logger) Handler {
|
||||
return jobHandler{name: "convert", fn: p.ConvertToCOG, log: log}
|
||||
return jobHandler{name: "convert", fn: p.ConvertToCOG, proc: p, log: log}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user