failMissingTarget failed the delivery as the batch had read it, so a delivery a worker sent and let go between the batch read and the ownership check could end failed after a successful attempt. It now reads the row once it owns the delivery and fails it only if the status is still the one the batch read, as processNewTask does. A row that cannot be read is left alone. TestSweepPending_TargetDeleted now checks that the first sweep already queues the healthy delivery and the second does not queue it again. Model: opus-5-5
This commit is contained in:
@@ -1270,6 +1270,30 @@ func (e *Engine) failMissingTarget(
|
||||
|
||||
defer e.inflight.release(d.ID)
|
||||
|
||||
// The batch was read before ownership was taken, and a worker may
|
||||
// have settled the delivery and let it go in between. Only a row
|
||||
// still in the status the batch read is failed.
|
||||
row, err := e.loadDelivery(webhookDB, d.ID)
|
||||
if err != nil {
|
||||
e.log.Error(
|
||||
"failed to load delivery",
|
||||
"delivery_id", d.ID,
|
||||
"error", err,
|
||||
)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
if row.Status != d.Status {
|
||||
e.log.Debug(
|
||||
"delivery already handled, not failed",
|
||||
"delivery_id", d.ID,
|
||||
"status", row.Status,
|
||||
)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
targetType, reason := e.missingTargetReason(d.TargetID)
|
||||
|
||||
e.log.Warn(
|
||||
|
||||
Reference in New Issue
Block a user