diff --git a/keiko-sql/src/main/kotlin/com/netflix/spinnaker/q/sql/SqlQueue.kt b/keiko-sql/src/main/kotlin/com/netflix/spinnaker/q/sql/SqlQueue.kt index b8aa7512e0a..d4af10659ea 100644 --- a/keiko-sql/src/main/kotlin/com/netflix/spinnaker/q/sql/SqlQueue.kt +++ b/keiko-sql/src/main/kotlin/com/netflix/spinnaker/q/sql/SqlQueue.kt @@ -281,22 +281,13 @@ class SqlQueue( return } - candidates.shuffle() - - var position = 0 - var passes = 0 - while (changed < maxMessages && position < candidates.size && passes < 3) { - passes++ - val sliceNext = min(maxMessages - 1 - changed, candidates.size - 1 - position) - val ids = candidates.slice(IntRange(position, position + sliceNext)) - when (sliceNext) { - 0 -> position++ - else -> position += sliceNext - } + var chunkedCandidates = candidates.sorted().chunked(maxMessages) + chunkedCandidates = if (chunkedCandidates.size > 3) chunkedCandidates.subList(0, 3) else chunkedCandidates + chunkedCandidates.forEach { changed += jooq.update(queueTable) .set(lockedField, "$lockId:$now") - .where(idField.`in`(*ids.toTypedArray()), lockedField.eq("0")) + .where(idField.`in`(*it.toTypedArray()), lockedField.eq("0")) .execute() }