Skip to content

Commit 6468bfb

Browse files
author
Rustam Aliyev
committed
Fix bug in counter recalculation causing infinite loop
1 parent 0badd58 commit 6468bfb

File tree

3 files changed

+32
-11
lines changed

3 files changed

+32
-11
lines changed

modules/core/src/main/java/com/elasticinbox/core/cassandra/CassandraMessageDAO.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import java.util.UUID;
4242

4343
import me.prettyprint.cassandra.serializers.StringSerializer;
44+
import me.prettyprint.cassandra.utils.TimeUUIDUtils;
4445
import me.prettyprint.hector.api.Keyspace;
4546
import me.prettyprint.hector.api.mutation.Mutator;
4647

@@ -63,6 +64,7 @@
6364
import com.elasticinbox.core.model.Marker;
6465
import com.elasticinbox.core.model.Message;
6566
import com.elasticinbox.core.model.ReservedLabels;
67+
import com.google.common.collect.Iterables;
6668

6769
public final class CassandraMessageDAO extends AbstractMessageDAO implements MessageDAO
6870
{
@@ -402,24 +404,29 @@ public void purge(final Mailbox mailbox, final Date age)
402404
public Labels calculateCounters(final Mailbox mailbox)
403405
{
404406
Labels labels = new Labels();
405-
UUID lastMessage = null;
406407
Map<UUID, Message> messages;
407408
Map<UUID, UUID> purgeIndex;
408409
Set<UUID> deletedMessages = new HashSet<UUID>();
409-
410+
411+
logger.debug("Recalculating counters for {}", mailbox);
412+
410413
// get deleted message IDs from purge queue
411414
// deleted messages should be excluded during calculation
415+
UUID start = TimeUUIDUtils.getUniqueTimeUUIDinMillis();
412416
do {
413417
purgeIndex = PurgeIndexPersistence.get(
414-
mailbox.getId(), new Date(), BatchConstants.BATCH_READS);
418+
mailbox.getId(), start, BatchConstants.BATCH_READS);
419+
415420
deletedMessages.addAll(purgeIndex.values());
421+
start = Iterables.getLast(purgeIndex.keySet());
416422
}
417423
while (purgeIndex.size() >= BatchConstants.BATCH_READS);
418424

419-
// read messages and calculate label counters
425+
// reset start, read messages and calculate label counters
426+
start = TimeUUIDUtils.getUniqueTimeUUIDinMillis();
420427
do {
421428
messages = MessagePersistence.getRange(
422-
mailbox.getId(), lastMessage, BatchConstants.BATCH_READS);
429+
mailbox.getId(), start, BatchConstants.BATCH_READS);
423430

424431
for (UUID messageId : messages.keySet())
425432
{
@@ -432,7 +439,7 @@ public Labels calculateCounters(final Mailbox mailbox)
432439
labels.incrementCounters(labelId, message.getLabelCounters());
433440
}
434441

435-
lastMessage = messageId;
442+
start = messageId;
436443
}
437444
}
438445
while (messages.size() >= BatchConstants.BATCH_READS);

modules/core/src/main/java/com/elasticinbox/core/cassandra/persistence/MessagePersistence.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ public static Map<UUID, Message> getRange(final String mailbox,
165165
// set keys, cf, range
166166
q.setColumnFamily(CF_METADATA);
167167
q.setKey(mailbox);
168-
q.setRange(start, null, false, count);
168+
q.setRange(start, null, true, count);
169169

170170
// execute
171171
QueryResult<SuperSlice<UUID, String, byte[]>> r = q.execute();

modules/core/src/main/java/com/elasticinbox/core/cassandra/persistence/PurgeIndexPersistence.java

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434

3535
import java.util.Collection;
3636
import java.util.Date;
37-
import java.util.HashMap;
37+
import java.util.LinkedHashMap;
3838
import java.util.List;
3939
import java.util.Map;
4040
import java.util.UUID;
@@ -101,10 +101,22 @@ public static void add(Mutator<String> mutator, final String mailbox,
101101
public static Map<UUID, UUID> get(final String mailbox, final Date age,
102102
final int count)
103103
{
104-
Map<UUID, UUID> messageIds = new HashMap<UUID, UUID>(count);
105-
106104
UUID start = TimeUUIDUtils.getTimeUUID(age.getTime());
107-
105+
return get(mailbox, start, count);
106+
}
107+
108+
/**
109+
* Get all message IDs deleted before given UUID
110+
*
111+
* @param mailbox
112+
* @param age
113+
* @return
114+
*/
115+
public static Map<UUID, UUID> get(final String mailbox, final UUID start,
116+
final int count)
117+
{
118+
Map<UUID, UUID> messageIds = new LinkedHashMap<UUID, UUID>(count);
119+
108120
String key = new StringBuilder(mailbox)
109121
.append(LabelIndexPersistence.COMPOSITE_KEY_DELIMITER)
110122
.append(PURGE_LABEL_ID).toString();
@@ -130,6 +142,8 @@ public static Map<UUID, UUID> get(final String mailbox, final Date age,
130142

131143
return messageIds;
132144
}
145+
146+
133147

134148
/**
135149
* Remove all message IDs from purge index deleted before given date

0 commit comments

Comments
 (0)