@@ -215,15 +215,42 @@ func (c *IngestController) ensureRequest(ctx context.Context, id, queue, uri str
215215 return request , nil
216216}
217217
218+ // ensureQueue returns the queue row for name, creating it if it does not yet exist.
219+ // A concurrent creator (ErrAlreadyExists) is resolved by re-reading the canonical row.
220+ func (c * IngestController ) ensureQueue (ctx context.Context , name string ) (entity.Queue , error ) {
221+ queueStore := c .store .GetQueueStore ()
222+
223+ got , err := queueStore .Get (ctx , name )
224+ if err == nil {
225+ return got , nil
226+ }
227+ if ! errors .Is (err , storage .ErrNotFound ) {
228+ return entity.Queue {}, fmt .Errorf ("IngestController failed to load queue %s: %w" , name , err )
229+ }
230+
231+ queue := entity.Queue {
232+ Name : name ,
233+ Version : 1 ,
234+ }
235+ if err := queueStore .Create (ctx , queue ); err != nil {
236+ if ! errors .Is (err , storage .ErrAlreadyExists ) {
237+ return entity.Queue {}, fmt .Errorf ("IngestController failed to persist queue %s: %w" , name , err )
238+ }
239+ // Raced with a concurrent creator; read the canonical row.
240+ return queueStore .Get (ctx , name )
241+ }
242+ return queue , nil
243+ }
244+
218245// advanceQueueLatestRequestID CAS-updates queue.latest_request_id to id when id is newer.
219246// Retries on optimistic-lock conflicts so concurrent ingests converge.
220247func (c * IngestController ) advanceQueueLatestRequestID (ctx context.Context , queue , id string ) error {
221248 queueStore := c .store .GetQueueStore ()
222249
223250 for {
224- queueRow , err := queueStore . GetOrCreate (ctx , queue , entity. Queue { Version : 1 } )
251+ queueRow , err := c . ensureQueue (ctx , queue )
225252 if err != nil {
226- return fmt . Errorf ( "IngestController failed to load queue %s: %w" , queue , err )
253+ return err
227254 }
228255 if queueRow .LatestRequestID != "" {
229256 cmp , err := entity .CompareRequestID (queue , id , queueRow .LatestRequestID )
0 commit comments