diff --git a/backend/postgres/postgres.go b/backend/postgres/postgres.go index a2c23325..7de78900 100644 --- a/backend/postgres/postgres.go +++ b/backend/postgres/postgres.go @@ -778,7 +778,9 @@ func (be *postgresBackend) GetOrchestrationWorkItem(ctx context.Context) (*backe SELECT 1 FROM NewEvents E WHERE E.InstanceID = I.InstanceID AND (E.VisibleTime IS NULL OR E.VisibleTime < $4) ) + ORDER BY I.SequenceNumber ASC LIMIT 1 + FOR UPDATE SKIP LOCKED ) RETURNING InstanceID`, be.workerName, // LockedBy for Instances table newLockExpiration, // Updated LockExpiration for Instances table @@ -864,7 +866,9 @@ func (be *postgresBackend) GetActivityWorkItem(ctx context.Context) (*backend.Ac WHERE SequenceNumber = ( SELECT SequenceNumber FROM NewTasks T WHERE T.LockExpiration IS NULL OR T.LockExpiration < $3 + ORDER BY T.SequenceNumber ASC LIMIT 1 + FOR UPDATE SKIP LOCKED ) RETURNING SequenceNumber, InstanceID, EventPayload`, be.workerName, newLockExpiration, diff --git a/backend/postgres/schema.sql b/backend/postgres/schema.sql index 153a5ff6..435fc3ab 100644 --- a/backend/postgres/schema.sql +++ b/backend/postgres/schema.sql @@ -18,6 +18,9 @@ CREATE TABLE IF NOT EXISTS Instances ( ParentInstanceID TEXT NULL ); +-- This index is used to improve queries with ORDER BY Instances.SequenceNumber +CREATE INDEX IF NOT EXISTS IX_Instances_SequenceNumber ON Instances(SequenceNumber); + -- This index is used by LockNext and Purge logic CREATE INDEX IF NOT EXISTS IX_Instances_RuntimeStatus ON Instances(RuntimeStatus); diff --git a/backend/sqlite/sqlite.go b/backend/sqlite/sqlite.go index 83433422..c39b14f3 100644 --- a/backend/sqlite/sqlite.go +++ b/backend/sqlite/sqlite.go @@ -852,6 +852,7 @@ func (be *sqliteBackend) GetActivityWorkItem(ctx context.Context) (*backend.Acti WHERE [SequenceNumber] = ( SELECT [SequenceNumber] FROM NewTasks T WHERE T.[LockExpiration] IS NULL OR T.[LockExpiration] < ? + ORDER BY T.[SequenceNumber] ASC LIMIT 1 ) RETURNING [SequenceNumber], [InstanceID], [EventPayload]`, be.workerName,