diff --git a/service/src/main/resources/lua/repair_queue_metadata.lua b/service/src/main/resources/lua/repair_queue_metadata.lua index 0c3b914d0..2b3a7e6ae 100644 --- a/service/src/main/resources/lua/repair_queue_metadata.lua +++ b/service/src/main/resources/lua/repair_queue_metadata.lua @@ -1,13 +1,10 @@ -local queueKey = KEYS[1] -local queueMetadataKey = KEYS[2] +local queueKey = KEYS[1] +local queueMetadataKey = KEYS[2] -local firstMessageWithScore = redis.call("ZRANGE", queueKey, 0, 0, "WITHSCORES") -local lastMessageWithScore = redis.call("ZRANGE", queueKey, -1, -1, "WITHSCORES") - -if firstMessageWithScore ~= nil and lastMessageWithScore ~= nil then - local firstMessageId = tonumber(firstMessageWithScore[2]) - local lastMessageId = tonumber(lastMessageWithScore[2]) +local firstMessageId = tonumber(redis.call("ZRANGE", queueKey, 0, 0, "WITHSCORES")[2]) +local lastMessageId = tonumber(redis.call("ZRANGE", queueKey, -1, -1, "WITHSCORES")[2]) +if firstMessageId and lastMessageId then for messageId = firstMessageId,lastMessageId do if redis.call("ZRANGEBYSCORE", queueKey, messageId, messageId) then -- This message actually exists, and its GUID may be pointing to the wrong ID diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/storage/MessagesCacheTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/storage/MessagesCacheTest.java index db5b80156..c8c21647b 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/storage/MessagesCacheTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/storage/MessagesCacheTest.java @@ -120,6 +120,12 @@ public class MessagesCacheTest extends AbstractRedisClusterTest { assertTrue(messagesCache.getMessagesToPersist(DESTINATION_UUID, DESTINATION_DEVICE_ID, 100).isEmpty()); } + @Test + public void testRepairEmptyQueueMetadata() { + // We're happy as long as this doesn't throw an exception + messagesCache.repairMetadata(DESTINATION_UUID, DESTINATION_DEVICE_ID); + } + @Test @Parameters({"true", "false"}) public void testRemoveById(final boolean sealedSender) {