From bb087caddc8148efa3db0c5ff38c099eeb4419b9 Mon Sep 17 00:00:00 2001 From: Jon Chambers Date: Sun, 4 Oct 2020 16:02:10 -0400 Subject: [PATCH] Don't panic if a queue exists, but is empty when repairing metadata. --- .../main/resources/lua/repair_queue_metadata.lua | 13 +++++-------- .../textsecuregcm/storage/MessagesCacheTest.java | 6 ++++++ 2 files changed, 11 insertions(+), 8 deletions(-) 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) {