Skip to content

Commit cb30592

Browse files
author
Rustam Aliyev
committed
Never return negative label counters, intead return 0. Closes elasticinbox#19.
1 parent ec66dc2 commit cb30592

File tree

1 file changed

+27
-15
lines changed

1 file changed

+27
-15
lines changed

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

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,11 @@ public final class LabelCounterPersistence
6262
public final static String CN_TYPE_LABEL = "l";
6363

6464
/** Label counter subtype for total bytes */
65-
public final static String CN_SUBTYPE_BYTES = "b";
65+
public final static char CN_SUBTYPE_BYTES = 'b';
6666
/** Label counter subtype for total messages */
67-
public final static String CN_SUBTYPE_MESSAGES = "m";
67+
public final static char CN_SUBTYPE_MESSAGES = 'm';
6868
/** Label counter subtype for unread messages */
69-
public final static String CN_SUBTYPE_UNREAD = "u";
69+
public final static char CN_SUBTYPE_UNREAD = 'u';
7070

7171
private final static Keyspace keyspace = CassandraDAOFactory.getKeyspace();
7272
private final static StringSerializer strSe = StringSerializer.get();
@@ -96,7 +96,7 @@ public static Map<Integer, LabelCounters> getAll(final String mailbox)
9696

9797
QueryResult<CounterSlice<Composite>> r = sliceQuery.execute();
9898

99-
return compositeColumnsToCounters(r.get().getColumns());
99+
return compositeColumnsToCounters(mailbox, r.get().getColumns());
100100
}
101101

102102
/**
@@ -124,7 +124,7 @@ public static LabelCounters get(final String mailbox, final Integer labelId)
124124

125125
QueryResult<CounterSlice<Composite>> r = sliceQuery.execute();
126126

127-
Map<Integer, LabelCounters> counters = compositeColumnsToCounters(r.get().getColumns());
127+
Map<Integer, LabelCounters> counters = compositeColumnsToCounters(mailbox, r.get().getColumns());
128128
LabelCounters labelCounters = counters.containsKey(labelId) ? counters.get(labelId) : new LabelCounters();
129129

130130
logger.debug("Fetched counters for single label {} with {}", labelId, labelCounters);
@@ -256,12 +256,12 @@ public static void deleteAll(Mutator<String> mutator, final String mailbox)
256256
* @return
257257
*/
258258
private static HCounterColumn<Composite> countersToCompositeColumn(
259-
final Integer labelId, final String subtype, final Long count)
259+
final Integer labelId, final char subtype, final Long count)
260260
{
261261
Composite composite = new Composite();
262262
composite.addComponent(CN_TYPE_LABEL, strSe);
263263
composite.addComponent(labelId.toString(), strSe);
264-
composite.addComponent(subtype, strSe);
264+
composite.addComponent(Character.toString(subtype), strSe);
265265
return createCounterColumn(composite, count, new CompositeSerializer());
266266
}
267267

@@ -272,7 +272,7 @@ private static HCounterColumn<Composite> countersToCompositeColumn(
272272
* @return
273273
*/
274274
private static Map<Integer, LabelCounters> compositeColumnsToCounters(
275-
final List<HCounterColumn<Composite>> columnList)
275+
final String mailbox, final List<HCounterColumn<Composite>> columnList)
276276
{
277277
Map<Integer, LabelCounters> result =
278278
new HashMap<Integer, LabelCounters>(LabelConstants.MAX_RESERVED_LABEL_ID);
@@ -283,6 +283,7 @@ private static Map<Integer, LabelCounters> compositeColumnsToCounters(
283283
for (HCounterColumn<Composite> c : columnList)
284284
{
285285
int labelId = Integer.parseInt(c.getName().get(1, strSe));
286+
char subtype = c.getName().get(2, strSe).charAt(0);
286287

287288
// since columns are ordered by labels, we can
288289
// flush label counters to result map as we traverse
@@ -293,14 +294,25 @@ private static Map<Integer, LabelCounters> compositeColumnsToCounters(
293294
prevLabelId = labelId;
294295
}
295296

296-
String subtype = c.getName().get(2, strSe);
297+
long cValue = 0;
298+
299+
// never return negative counter value
300+
if (c.getValue() >= 0) {
301+
cValue = c.getValue();
302+
} else {
303+
logger.warn("Negative counter value found {}/{}: ", labelId);
304+
}
297305

298-
if (subtype.equals(CN_SUBTYPE_BYTES)) {
299-
labelCounters.setTotalBytes(c.getValue());
300-
} else if (subtype.equals(CN_SUBTYPE_MESSAGES)) {
301-
labelCounters.setTotalMessages(c.getValue());
302-
} else if (subtype.equals(CN_SUBTYPE_UNREAD)) {
303-
labelCounters.setUnreadMessages(c.getValue());
306+
switch (subtype) {
307+
case CN_SUBTYPE_BYTES:
308+
labelCounters.setTotalBytes(cValue);
309+
break;
310+
case CN_SUBTYPE_MESSAGES:
311+
labelCounters.setTotalMessages(cValue);
312+
break;
313+
case CN_SUBTYPE_UNREAD:
314+
labelCounters.setUnreadMessages(cValue);
315+
break;
304316
}
305317
}
306318

0 commit comments

Comments
 (0)