Committed by
Gerrit Code Review
Added feature to count exceptions ocurred when operating distributed primitives
Change-Id: I24017e61cd2aefd1cf78aa5b241a3219e3e89b32
Showing
6 changed files
with
66 additions
and
54 deletions
... | @@ -51,34 +51,34 @@ public class DefaultAsyncAtomicCounter implements AsyncAtomicCounter { | ... | @@ -51,34 +51,34 @@ public class DefaultAsyncAtomicCounter implements AsyncAtomicCounter { |
51 | public CompletableFuture<Long> incrementAndGet() { | 51 | public CompletableFuture<Long> incrementAndGet() { |
52 | final MeteringAgent.Context timer = monitor.startTimer(INCREMENT_AND_GET); | 52 | final MeteringAgent.Context timer = monitor.startTimer(INCREMENT_AND_GET); |
53 | return addAndGet(1L) | 53 | return addAndGet(1L) |
54 | - .whenComplete((r, e) -> timer.stop()); | 54 | + .whenComplete((r, e) -> timer.stop(e)); |
55 | } | 55 | } |
56 | 56 | ||
57 | @Override | 57 | @Override |
58 | public CompletableFuture<Long> get() { | 58 | public CompletableFuture<Long> get() { |
59 | final MeteringAgent.Context timer = monitor.startTimer(GET); | 59 | final MeteringAgent.Context timer = monitor.startTimer(GET); |
60 | return database.counterGet(name) | 60 | return database.counterGet(name) |
61 | - .whenComplete((r, e) -> timer.stop()); | 61 | + .whenComplete((r, e) -> timer.stop(e)); |
62 | } | 62 | } |
63 | 63 | ||
64 | @Override | 64 | @Override |
65 | public CompletableFuture<Long> getAndIncrement() { | 65 | public CompletableFuture<Long> getAndIncrement() { |
66 | final MeteringAgent.Context timer = monitor.startTimer(GET_AND_INCREMENT); | 66 | final MeteringAgent.Context timer = monitor.startTimer(GET_AND_INCREMENT); |
67 | return getAndAdd(1L) | 67 | return getAndAdd(1L) |
68 | - .whenComplete((r, e) -> timer.stop()); | 68 | + .whenComplete((r, e) -> timer.stop(e)); |
69 | } | 69 | } |
70 | 70 | ||
71 | @Override | 71 | @Override |
72 | public CompletableFuture<Long> getAndAdd(long delta) { | 72 | public CompletableFuture<Long> getAndAdd(long delta) { |
73 | final MeteringAgent.Context timer = monitor.startTimer(GET_AND_ADD); | 73 | final MeteringAgent.Context timer = monitor.startTimer(GET_AND_ADD); |
74 | return database.counterGetAndAdd(name, delta) | 74 | return database.counterGetAndAdd(name, delta) |
75 | - .whenComplete((r, e) -> timer.stop()); | 75 | + .whenComplete((r, e) -> timer.stop(e)); |
76 | } | 76 | } |
77 | 77 | ||
78 | @Override | 78 | @Override |
79 | public CompletableFuture<Long> addAndGet(long delta) { | 79 | public CompletableFuture<Long> addAndGet(long delta) { |
80 | final MeteringAgent.Context timer = monitor.startTimer(ADD_AND_GET); | 80 | final MeteringAgent.Context timer = monitor.startTimer(ADD_AND_GET); |
81 | return database.counterAddAndGet(name, delta) | 81 | return database.counterAddAndGet(name, delta) |
82 | - .whenComplete((r, e) -> timer.stop()); | 82 | + .whenComplete((r, e) -> timer.stop(e)); |
83 | } | 83 | } |
84 | -} | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
84 | +} | ... | ... |
... | @@ -193,14 +193,14 @@ public class DefaultAsyncConsistentMap<K, V> implements AsyncConsistentMap<K, V | ... | @@ -193,14 +193,14 @@ public class DefaultAsyncConsistentMap<K, V> implements AsyncConsistentMap<K, V |
193 | public CompletableFuture<Integer> size() { | 193 | public CompletableFuture<Integer> size() { |
194 | final MeteringAgent.Context timer = monitor.startTimer(SIZE); | 194 | final MeteringAgent.Context timer = monitor.startTimer(SIZE); |
195 | return database.mapSize(name) | 195 | return database.mapSize(name) |
196 | - .whenComplete((r, e) -> timer.stop()); | 196 | + .whenComplete((r, e) -> timer.stop(e)); |
197 | } | 197 | } |
198 | 198 | ||
199 | @Override | 199 | @Override |
200 | public CompletableFuture<Boolean> isEmpty() { | 200 | public CompletableFuture<Boolean> isEmpty() { |
201 | final MeteringAgent.Context timer = monitor.startTimer(IS_EMPTY); | 201 | final MeteringAgent.Context timer = monitor.startTimer(IS_EMPTY); |
202 | return database.mapIsEmpty(name) | 202 | return database.mapIsEmpty(name) |
203 | - .whenComplete((r, e) -> timer.stop()); | 203 | + .whenComplete((r, e) -> timer.stop(e)); |
204 | } | 204 | } |
205 | 205 | ||
206 | @Override | 206 | @Override |
... | @@ -208,7 +208,7 @@ public class DefaultAsyncConsistentMap<K, V> implements AsyncConsistentMap<K, V | ... | @@ -208,7 +208,7 @@ public class DefaultAsyncConsistentMap<K, V> implements AsyncConsistentMap<K, V |
208 | checkNotNull(key, ERROR_NULL_KEY); | 208 | checkNotNull(key, ERROR_NULL_KEY); |
209 | final MeteringAgent.Context timer = monitor.startTimer(CONTAINS_KEY); | 209 | final MeteringAgent.Context timer = monitor.startTimer(CONTAINS_KEY); |
210 | return database.mapContainsKey(name, keyCache.getUnchecked(key)) | 210 | return database.mapContainsKey(name, keyCache.getUnchecked(key)) |
211 | - .whenComplete((r, e) -> timer.stop()); | 211 | + .whenComplete((r, e) -> timer.stop(e)); |
212 | } | 212 | } |
213 | 213 | ||
214 | @Override | 214 | @Override |
... | @@ -216,7 +216,7 @@ public class DefaultAsyncConsistentMap<K, V> implements AsyncConsistentMap<K, V | ... | @@ -216,7 +216,7 @@ public class DefaultAsyncConsistentMap<K, V> implements AsyncConsistentMap<K, V |
216 | checkNotNull(value, ERROR_NULL_VALUE); | 216 | checkNotNull(value, ERROR_NULL_VALUE); |
217 | final MeteringAgent.Context timer = monitor.startTimer(CONTAINS_VALUE); | 217 | final MeteringAgent.Context timer = monitor.startTimer(CONTAINS_VALUE); |
218 | return database.mapContainsValue(name, serializer.encode(value)) | 218 | return database.mapContainsValue(name, serializer.encode(value)) |
219 | - .whenComplete((r, e) -> timer.stop()); | 219 | + .whenComplete((r, e) -> timer.stop(e)); |
220 | } | 220 | } |
221 | 221 | ||
222 | @Override | 222 | @Override |
... | @@ -224,7 +224,7 @@ public class DefaultAsyncConsistentMap<K, V> implements AsyncConsistentMap<K, V | ... | @@ -224,7 +224,7 @@ public class DefaultAsyncConsistentMap<K, V> implements AsyncConsistentMap<K, V |
224 | checkNotNull(key, ERROR_NULL_KEY); | 224 | checkNotNull(key, ERROR_NULL_KEY); |
225 | final MeteringAgent.Context timer = monitor.startTimer(GET); | 225 | final MeteringAgent.Context timer = monitor.startTimer(GET); |
226 | return database.mapGet(name, keyCache.getUnchecked(key)) | 226 | return database.mapGet(name, keyCache.getUnchecked(key)) |
227 | - .whenComplete((r, e) -> timer.stop()) | 227 | + .whenComplete((r, e) -> timer.stop(e)) |
228 | .thenApply(v -> v != null ? v.map(serializer::decode) : null); | 228 | .thenApply(v -> v != null ? v.map(serializer::decode) : null); |
229 | } | 229 | } |
230 | 230 | ||
... | @@ -235,7 +235,7 @@ public class DefaultAsyncConsistentMap<K, V> implements AsyncConsistentMap<K, V | ... | @@ -235,7 +235,7 @@ public class DefaultAsyncConsistentMap<K, V> implements AsyncConsistentMap<K, V |
235 | checkNotNull(mappingFunction, "Mapping function cannot be null"); | 235 | checkNotNull(mappingFunction, "Mapping function cannot be null"); |
236 | final MeteringAgent.Context timer = monitor.startTimer(COMPUTE_IF_ABSENT); | 236 | final MeteringAgent.Context timer = monitor.startTimer(COMPUTE_IF_ABSENT); |
237 | return updateAndGet(key, Match.ifNull(), Match.any(), mappingFunction.apply(key)) | 237 | return updateAndGet(key, Match.ifNull(), Match.any(), mappingFunction.apply(key)) |
238 | - .whenComplete((r, e) -> timer.stop()) | 238 | + .whenComplete((r, e) -> timer.stop(e)) |
239 | .thenApply(v -> v.newValue()); | 239 | .thenApply(v -> v.newValue()); |
240 | } | 240 | } |
241 | 241 | ||
... | @@ -279,7 +279,7 @@ public class DefaultAsyncConsistentMap<K, V> implements AsyncConsistentMap<K, V | ... | @@ -279,7 +279,7 @@ public class DefaultAsyncConsistentMap<K, V> implements AsyncConsistentMap<K, V |
279 | Match<V> valueMatcher = r1 == null ? Match.ifNull() : Match.any(); | 279 | Match<V> valueMatcher = r1 == null ? Match.ifNull() : Match.any(); |
280 | Match<Long> versionMatcher = r1 == null ? Match.any() : Match.ifValue(r1.version()); | 280 | Match<Long> versionMatcher = r1 == null ? Match.any() : Match.ifValue(r1.version()); |
281 | return updateAndGet(key, valueMatcher, versionMatcher, computedValue.get()) | 281 | return updateAndGet(key, valueMatcher, versionMatcher, computedValue.get()) |
282 | - .whenComplete((r, e) -> timer.stop()) | 282 | + .whenComplete((r, e) -> timer.stop(e)) |
283 | .thenApply(v -> { | 283 | .thenApply(v -> { |
284 | if (v.updated()) { | 284 | if (v.updated()) { |
285 | return v.newValue(); | 285 | return v.newValue(); |
... | @@ -296,7 +296,7 @@ public class DefaultAsyncConsistentMap<K, V> implements AsyncConsistentMap<K, V | ... | @@ -296,7 +296,7 @@ public class DefaultAsyncConsistentMap<K, V> implements AsyncConsistentMap<K, V |
296 | checkNotNull(value, ERROR_NULL_VALUE); | 296 | checkNotNull(value, ERROR_NULL_VALUE); |
297 | final MeteringAgent.Context timer = monitor.startTimer(PUT); | 297 | final MeteringAgent.Context timer = monitor.startTimer(PUT); |
298 | return updateAndGet(key, Match.any(), Match.any(), value).thenApply(v -> v.oldValue()) | 298 | return updateAndGet(key, Match.any(), Match.any(), value).thenApply(v -> v.oldValue()) |
299 | - .whenComplete((r, e) -> timer.stop()); | 299 | + .whenComplete((r, e) -> timer.stop(e)); |
300 | } | 300 | } |
301 | 301 | ||
302 | @Override | 302 | @Override |
... | @@ -305,7 +305,7 @@ public class DefaultAsyncConsistentMap<K, V> implements AsyncConsistentMap<K, V | ... | @@ -305,7 +305,7 @@ public class DefaultAsyncConsistentMap<K, V> implements AsyncConsistentMap<K, V |
305 | checkNotNull(value, ERROR_NULL_VALUE); | 305 | checkNotNull(value, ERROR_NULL_VALUE); |
306 | final MeteringAgent.Context timer = monitor.startTimer(PUT_AND_GET); | 306 | final MeteringAgent.Context timer = monitor.startTimer(PUT_AND_GET); |
307 | return updateAndGet(key, Match.any(), Match.any(), value).thenApply(v -> v.newValue()) | 307 | return updateAndGet(key, Match.any(), Match.any(), value).thenApply(v -> v.newValue()) |
308 | - .whenComplete((r, e) -> timer.stop()); | 308 | + .whenComplete((r, e) -> timer.stop(e)); |
309 | } | 309 | } |
310 | 310 | ||
311 | @Override | 311 | @Override |
... | @@ -313,7 +313,7 @@ public class DefaultAsyncConsistentMap<K, V> implements AsyncConsistentMap<K, V | ... | @@ -313,7 +313,7 @@ public class DefaultAsyncConsistentMap<K, V> implements AsyncConsistentMap<K, V |
313 | checkNotNull(key, ERROR_NULL_KEY); | 313 | checkNotNull(key, ERROR_NULL_KEY); |
314 | final MeteringAgent.Context timer = monitor.startTimer(REMOVE); | 314 | final MeteringAgent.Context timer = monitor.startTimer(REMOVE); |
315 | return updateAndGet(key, Match.any(), Match.any(), null).thenApply(v -> v.oldValue()) | 315 | return updateAndGet(key, Match.any(), Match.any(), null).thenApply(v -> v.oldValue()) |
316 | - .whenComplete((r, e) -> timer.stop()); | 316 | + .whenComplete((r, e) -> timer.stop(e)); |
317 | } | 317 | } |
318 | 318 | ||
319 | @Override | 319 | @Override |
... | @@ -321,7 +321,7 @@ public class DefaultAsyncConsistentMap<K, V> implements AsyncConsistentMap<K, V | ... | @@ -321,7 +321,7 @@ public class DefaultAsyncConsistentMap<K, V> implements AsyncConsistentMap<K, V |
321 | checkIfUnmodifiable(); | 321 | checkIfUnmodifiable(); |
322 | final MeteringAgent.Context timer = monitor.startTimer(CLEAR); | 322 | final MeteringAgent.Context timer = monitor.startTimer(CLEAR); |
323 | return database.mapClear(name).thenApply(this::unwrapResult) | 323 | return database.mapClear(name).thenApply(this::unwrapResult) |
324 | - .whenComplete((r, e) -> timer.stop()); | 324 | + .whenComplete((r, e) -> timer.stop(e)); |
325 | } | 325 | } |
326 | 326 | ||
327 | @Override | 327 | @Override |
... | @@ -332,14 +332,14 @@ public class DefaultAsyncConsistentMap<K, V> implements AsyncConsistentMap<K, V | ... | @@ -332,14 +332,14 @@ public class DefaultAsyncConsistentMap<K, V> implements AsyncConsistentMap<K, V |
332 | .stream() | 332 | .stream() |
333 | .map(this::dK) | 333 | .map(this::dK) |
334 | .collect(Collectors.toSet())) | 334 | .collect(Collectors.toSet())) |
335 | - .whenComplete((r, e) -> timer.stop()); | 335 | + .whenComplete((r, e) -> timer.stop(e)); |
336 | } | 336 | } |
337 | 337 | ||
338 | @Override | 338 | @Override |
339 | public CompletableFuture<Collection<Versioned<V>>> values() { | 339 | public CompletableFuture<Collection<Versioned<V>>> values() { |
340 | final MeteringAgent.Context timer = monitor.startTimer(VALUES); | 340 | final MeteringAgent.Context timer = monitor.startTimer(VALUES); |
341 | return database.mapValues(name) | 341 | return database.mapValues(name) |
342 | - .whenComplete((r, e) -> timer.stop()) | 342 | + .whenComplete((r, e) -> timer.stop(e)) |
343 | .thenApply(c -> c | 343 | .thenApply(c -> c |
344 | .stream() | 344 | .stream() |
345 | .map(v -> v.<V>map(serializer::decode)) | 345 | .map(v -> v.<V>map(serializer::decode)) |
... | @@ -350,7 +350,7 @@ public class DefaultAsyncConsistentMap<K, V> implements AsyncConsistentMap<K, V | ... | @@ -350,7 +350,7 @@ public class DefaultAsyncConsistentMap<K, V> implements AsyncConsistentMap<K, V |
350 | public CompletableFuture<Set<Entry<K, Versioned<V>>>> entrySet() { | 350 | public CompletableFuture<Set<Entry<K, Versioned<V>>>> entrySet() { |
351 | final MeteringAgent.Context timer = monitor.startTimer(ENTRY_SET); | 351 | final MeteringAgent.Context timer = monitor.startTimer(ENTRY_SET); |
352 | return database.mapEntrySet(name) | 352 | return database.mapEntrySet(name) |
353 | - .whenComplete((r, e) -> timer.stop()) | 353 | + .whenComplete((r, e) -> timer.stop(e)) |
354 | .thenApply(s -> s | 354 | .thenApply(s -> s |
355 | .stream() | 355 | .stream() |
356 | .map(this::mapRawEntry) | 356 | .map(this::mapRawEntry) |
... | @@ -363,7 +363,7 @@ public class DefaultAsyncConsistentMap<K, V> implements AsyncConsistentMap<K, V | ... | @@ -363,7 +363,7 @@ public class DefaultAsyncConsistentMap<K, V> implements AsyncConsistentMap<K, V |
363 | checkNotNull(value, ERROR_NULL_VALUE); | 363 | checkNotNull(value, ERROR_NULL_VALUE); |
364 | final MeteringAgent.Context timer = monitor.startTimer(PUT_IF_ABSENT); | 364 | final MeteringAgent.Context timer = monitor.startTimer(PUT_IF_ABSENT); |
365 | return updateAndGet(key, Match.ifNull(), Match.any(), value) | 365 | return updateAndGet(key, Match.ifNull(), Match.any(), value) |
366 | - .whenComplete((r, e) -> timer.stop()) | 366 | + .whenComplete((r, e) -> timer.stop(e)) |
367 | .thenApply(v -> v.oldValue()); | 367 | .thenApply(v -> v.oldValue()); |
368 | } | 368 | } |
369 | 369 | ||
... | @@ -373,7 +373,7 @@ public class DefaultAsyncConsistentMap<K, V> implements AsyncConsistentMap<K, V | ... | @@ -373,7 +373,7 @@ public class DefaultAsyncConsistentMap<K, V> implements AsyncConsistentMap<K, V |
373 | checkNotNull(value, ERROR_NULL_VALUE); | 373 | checkNotNull(value, ERROR_NULL_VALUE); |
374 | final MeteringAgent.Context timer = monitor.startTimer(REMOVE); | 374 | final MeteringAgent.Context timer = monitor.startTimer(REMOVE); |
375 | return updateAndGet(key, Match.ifValue(value), Match.any(), null) | 375 | return updateAndGet(key, Match.ifValue(value), Match.any(), null) |
376 | - .whenComplete((r, e) -> timer.stop()) | 376 | + .whenComplete((r, e) -> timer.stop(e)) |
377 | .thenApply(v -> v.updated()); | 377 | .thenApply(v -> v.updated()); |
378 | } | 378 | } |
379 | 379 | ||
... | @@ -382,7 +382,7 @@ public class DefaultAsyncConsistentMap<K, V> implements AsyncConsistentMap<K, V | ... | @@ -382,7 +382,7 @@ public class DefaultAsyncConsistentMap<K, V> implements AsyncConsistentMap<K, V |
382 | checkNotNull(key, ERROR_NULL_KEY); | 382 | checkNotNull(key, ERROR_NULL_KEY); |
383 | final MeteringAgent.Context timer = monitor.startTimer(REMOVE); | 383 | final MeteringAgent.Context timer = monitor.startTimer(REMOVE); |
384 | return updateAndGet(key, Match.any(), Match.ifValue(version), null) | 384 | return updateAndGet(key, Match.any(), Match.ifValue(version), null) |
385 | - .whenComplete((r, e) -> timer.stop()) | 385 | + .whenComplete((r, e) -> timer.stop(e)) |
386 | .thenApply(v -> v.updated()); | 386 | .thenApply(v -> v.updated()); |
387 | } | 387 | } |
388 | 388 | ||
... | @@ -393,7 +393,7 @@ public class DefaultAsyncConsistentMap<K, V> implements AsyncConsistentMap<K, V | ... | @@ -393,7 +393,7 @@ public class DefaultAsyncConsistentMap<K, V> implements AsyncConsistentMap<K, V |
393 | checkNotNull(newValue, ERROR_NULL_VALUE); | 393 | checkNotNull(newValue, ERROR_NULL_VALUE); |
394 | final MeteringAgent.Context timer = monitor.startTimer(REPLACE); | 394 | final MeteringAgent.Context timer = monitor.startTimer(REPLACE); |
395 | return updateAndGet(key, Match.ifValue(oldValue), Match.any(), newValue) | 395 | return updateAndGet(key, Match.ifValue(oldValue), Match.any(), newValue) |
396 | - .whenComplete((r, e) -> timer.stop()) | 396 | + .whenComplete((r, e) -> timer.stop(e)) |
397 | .thenApply(v -> v.updated()); | 397 | .thenApply(v -> v.updated()); |
398 | } | 398 | } |
399 | 399 | ||
... | @@ -401,7 +401,7 @@ public class DefaultAsyncConsistentMap<K, V> implements AsyncConsistentMap<K, V | ... | @@ -401,7 +401,7 @@ public class DefaultAsyncConsistentMap<K, V> implements AsyncConsistentMap<K, V |
401 | public CompletableFuture<Boolean> replace(K key, long oldVersion, V newValue) { | 401 | public CompletableFuture<Boolean> replace(K key, long oldVersion, V newValue) { |
402 | final MeteringAgent.Context timer = monitor.startTimer(REPLACE); | 402 | final MeteringAgent.Context timer = monitor.startTimer(REPLACE); |
403 | return updateAndGet(key, Match.any(), Match.ifValue(oldVersion), newValue) | 403 | return updateAndGet(key, Match.any(), Match.ifValue(oldVersion), newValue) |
404 | - .whenComplete((r, e) -> timer.stop()) | 404 | + .whenComplete((r, e) -> timer.stop(e)) |
405 | .thenApply(v -> v.updated()); | 405 | .thenApply(v -> v.updated()); |
406 | } | 406 | } |
407 | 407 | ... | ... |
... | @@ -72,7 +72,7 @@ public class DefaultAtomicValue<V> implements AtomicValue<V> { | ... | @@ -72,7 +72,7 @@ public class DefaultAtomicValue<V> implements AtomicValue<V> { |
72 | return valueMap.replace(name, serializer.encode(expect), serializer.encode(update)); | 72 | return valueMap.replace(name, serializer.encode(expect), serializer.encode(update)); |
73 | } | 73 | } |
74 | } finally { | 74 | } finally { |
75 | - newTimer.stop(); | 75 | + newTimer.stop(null); |
76 | } | 76 | } |
77 | } | 77 | } |
78 | 78 | ||
... | @@ -83,7 +83,7 @@ public class DefaultAtomicValue<V> implements AtomicValue<V> { | ... | @@ -83,7 +83,7 @@ public class DefaultAtomicValue<V> implements AtomicValue<V> { |
83 | Versioned<byte[]> rawValue = valueMap.get(name); | 83 | Versioned<byte[]> rawValue = valueMap.get(name); |
84 | return rawValue == null ? null : serializer.decode(rawValue.value()); | 84 | return rawValue == null ? null : serializer.decode(rawValue.value()); |
85 | } finally { | 85 | } finally { |
86 | - newTimer.stop(); | 86 | + newTimer.stop(null); |
87 | } | 87 | } |
88 | } | 88 | } |
89 | 89 | ||
... | @@ -95,7 +95,7 @@ public class DefaultAtomicValue<V> implements AtomicValue<V> { | ... | @@ -95,7 +95,7 @@ public class DefaultAtomicValue<V> implements AtomicValue<V> { |
95 | valueMap.remove(name) : valueMap.put(name, serializer.encode(value)); | 95 | valueMap.remove(name) : valueMap.put(name, serializer.encode(value)); |
96 | return previousValue == null ? null : serializer.decode(previousValue.value()); | 96 | return previousValue == null ? null : serializer.decode(previousValue.value()); |
97 | } finally { | 97 | } finally { |
98 | - newTimer.stop(); | 98 | + newTimer.stop(null); |
99 | } | 99 | } |
100 | } | 100 | } |
101 | 101 | ... | ... |
... | @@ -73,7 +73,7 @@ public class DefaultDistributedQueue<E> implements DistributedQueue<E> { | ... | @@ -73,7 +73,7 @@ public class DefaultDistributedQueue<E> implements DistributedQueue<E> { |
73 | @Override | 73 | @Override |
74 | public long size() { | 74 | public long size() { |
75 | final MeteringAgent.Context timer = monitor.startTimer(SIZE); | 75 | final MeteringAgent.Context timer = monitor.startTimer(SIZE); |
76 | - return Futures.getUnchecked(database.queueSize(name).whenComplete((r, e) -> timer.stop())); | 76 | + return Futures.getUnchecked(database.queueSize(name).whenComplete((r, e) -> timer.stop(e))); |
77 | } | 77 | } |
78 | 78 | ||
79 | @Override | 79 | @Override |
... | @@ -81,14 +81,14 @@ public class DefaultDistributedQueue<E> implements DistributedQueue<E> { | ... | @@ -81,14 +81,14 @@ public class DefaultDistributedQueue<E> implements DistributedQueue<E> { |
81 | checkNotNull(entry, ERROR_NULL_ENTRY); | 81 | checkNotNull(entry, ERROR_NULL_ENTRY); |
82 | final MeteringAgent.Context timer = monitor.startTimer(PUSH); | 82 | final MeteringAgent.Context timer = monitor.startTimer(PUSH); |
83 | Futures.getUnchecked(database.queuePush(name, serializer.encode(entry)) | 83 | Futures.getUnchecked(database.queuePush(name, serializer.encode(entry)) |
84 | - .whenComplete((r, e) -> timer.stop())); | 84 | + .whenComplete((r, e) -> timer.stop(e))); |
85 | } | 85 | } |
86 | 86 | ||
87 | @Override | 87 | @Override |
88 | public CompletableFuture<E> pop() { | 88 | public CompletableFuture<E> pop() { |
89 | final MeteringAgent.Context timer = monitor.startTimer(POP); | 89 | final MeteringAgent.Context timer = monitor.startTimer(POP); |
90 | return database.queuePop(name) | 90 | return database.queuePop(name) |
91 | - .whenComplete((r, e) -> timer.stop()) | 91 | + .whenComplete((r, e) -> timer.stop(e)) |
92 | .thenCompose(v -> { | 92 | .thenCompose(v -> { |
93 | if (v != null) { | 93 | if (v != null) { |
94 | return CompletableFuture.completedFuture(serializer.decode(v)); | 94 | return CompletableFuture.completedFuture(serializer.decode(v)); |
... | @@ -97,6 +97,7 @@ public class DefaultDistributedQueue<E> implements DistributedQueue<E> { | ... | @@ -97,6 +97,7 @@ public class DefaultDistributedQueue<E> implements DistributedQueue<E> { |
97 | pendingFutures.add(newPendingFuture); | 97 | pendingFutures.add(newPendingFuture); |
98 | return newPendingFuture; | 98 | return newPendingFuture; |
99 | }); | 99 | }); |
100 | + | ||
100 | } | 101 | } |
101 | 102 | ||
102 | @Override | 103 | @Override |
... | @@ -104,7 +105,7 @@ public class DefaultDistributedQueue<E> implements DistributedQueue<E> { | ... | @@ -104,7 +105,7 @@ public class DefaultDistributedQueue<E> implements DistributedQueue<E> { |
104 | final MeteringAgent.Context timer = monitor.startTimer(PEEK); | 105 | final MeteringAgent.Context timer = monitor.startTimer(PEEK); |
105 | return Futures.getUnchecked(database.queuePeek(name) | 106 | return Futures.getUnchecked(database.queuePeek(name) |
106 | .thenApply(v -> v != null ? serializer.<E>decode(v) : null) | 107 | .thenApply(v -> v != null ? serializer.<E>decode(v) : null) |
107 | - .whenComplete((r, e) -> timer.stop())); | 108 | + .whenComplete((r, e) -> timer.stop(e))); |
108 | } | 109 | } |
109 | 110 | ||
110 | public String name() { | 111 | public String name() { | ... | ... |
... | @@ -67,7 +67,7 @@ public class DefaultDistributedSet<E> implements DistributedSet<E> { | ... | @@ -67,7 +67,7 @@ public class DefaultDistributedSet<E> implements DistributedSet<E> { |
67 | try { | 67 | try { |
68 | return backingMap.size(); | 68 | return backingMap.size(); |
69 | } finally { | 69 | } finally { |
70 | - timer.stop(); | 70 | + timer.stop(null); |
71 | } | 71 | } |
72 | } | 72 | } |
73 | 73 | ||
... | @@ -77,7 +77,7 @@ public class DefaultDistributedSet<E> implements DistributedSet<E> { | ... | @@ -77,7 +77,7 @@ public class DefaultDistributedSet<E> implements DistributedSet<E> { |
77 | try { | 77 | try { |
78 | return backingMap.isEmpty(); | 78 | return backingMap.isEmpty(); |
79 | } finally { | 79 | } finally { |
80 | - timer.stop(); | 80 | + timer.stop(null); |
81 | } | 81 | } |
82 | } | 82 | } |
83 | 83 | ||
... | @@ -88,7 +88,7 @@ public class DefaultDistributedSet<E> implements DistributedSet<E> { | ... | @@ -88,7 +88,7 @@ public class DefaultDistributedSet<E> implements DistributedSet<E> { |
88 | try { | 88 | try { |
89 | return backingMap.containsKey((E) o); | 89 | return backingMap.containsKey((E) o); |
90 | } finally { | 90 | } finally { |
91 | - timer.stop(); | 91 | + timer.stop(null); |
92 | } | 92 | } |
93 | } | 93 | } |
94 | 94 | ||
... | @@ -99,7 +99,7 @@ public class DefaultDistributedSet<E> implements DistributedSet<E> { | ... | @@ -99,7 +99,7 @@ public class DefaultDistributedSet<E> implements DistributedSet<E> { |
99 | try { | 99 | try { |
100 | return backingMap.keySet().iterator(); | 100 | return backingMap.keySet().iterator(); |
101 | } finally { | 101 | } finally { |
102 | - timer.stop(); | 102 | + timer.stop(null); |
103 | } | 103 | } |
104 | } | 104 | } |
105 | 105 | ||
... | @@ -109,7 +109,7 @@ public class DefaultDistributedSet<E> implements DistributedSet<E> { | ... | @@ -109,7 +109,7 @@ public class DefaultDistributedSet<E> implements DistributedSet<E> { |
109 | try { | 109 | try { |
110 | return backingMap.keySet().stream().toArray(); | 110 | return backingMap.keySet().stream().toArray(); |
111 | } finally { | 111 | } finally { |
112 | - timer.stop(); | 112 | + timer.stop(null); |
113 | } | 113 | } |
114 | } | 114 | } |
115 | 115 | ||
... | @@ -119,7 +119,7 @@ public class DefaultDistributedSet<E> implements DistributedSet<E> { | ... | @@ -119,7 +119,7 @@ public class DefaultDistributedSet<E> implements DistributedSet<E> { |
119 | try { | 119 | try { |
120 | return backingMap.keySet().stream().toArray(size -> a); | 120 | return backingMap.keySet().stream().toArray(size -> a); |
121 | } finally { | 121 | } finally { |
122 | - timer.stop(); | 122 | + timer.stop(null); |
123 | } | 123 | } |
124 | } | 124 | } |
125 | 125 | ||
... | @@ -129,7 +129,7 @@ public class DefaultDistributedSet<E> implements DistributedSet<E> { | ... | @@ -129,7 +129,7 @@ public class DefaultDistributedSet<E> implements DistributedSet<E> { |
129 | try { | 129 | try { |
130 | return backingMap.putIfAbsent(e, true) == null; | 130 | return backingMap.putIfAbsent(e, true) == null; |
131 | } finally { | 131 | } finally { |
132 | - timer.stop(); | 132 | + timer.stop(null); |
133 | } | 133 | } |
134 | } | 134 | } |
135 | 135 | ||
... | @@ -140,7 +140,7 @@ public class DefaultDistributedSet<E> implements DistributedSet<E> { | ... | @@ -140,7 +140,7 @@ public class DefaultDistributedSet<E> implements DistributedSet<E> { |
140 | try { | 140 | try { |
141 | return backingMap.remove((E) o) != null; | 141 | return backingMap.remove((E) o) != null; |
142 | } finally { | 142 | } finally { |
143 | - timer.stop(); | 143 | + timer.stop(null); |
144 | } | 144 | } |
145 | } | 145 | } |
146 | 146 | ||
... | @@ -151,7 +151,7 @@ public class DefaultDistributedSet<E> implements DistributedSet<E> { | ... | @@ -151,7 +151,7 @@ public class DefaultDistributedSet<E> implements DistributedSet<E> { |
151 | return c.stream() | 151 | return c.stream() |
152 | .allMatch(this::contains); | 152 | .allMatch(this::contains); |
153 | } finally { | 153 | } finally { |
154 | - timer.stop(); | 154 | + timer.stop(null); |
155 | } | 155 | } |
156 | } | 156 | } |
157 | 157 | ||
... | @@ -164,7 +164,7 @@ public class DefaultDistributedSet<E> implements DistributedSet<E> { | ... | @@ -164,7 +164,7 @@ public class DefaultDistributedSet<E> implements DistributedSet<E> { |
164 | .reduce(Boolean::logicalOr) | 164 | .reduce(Boolean::logicalOr) |
165 | .orElse(false); | 165 | .orElse(false); |
166 | } finally { | 166 | } finally { |
167 | - timer.stop(); | 167 | + timer.stop(null); |
168 | } | 168 | } |
169 | } | 169 | } |
170 | 170 | ||
... | @@ -180,7 +180,7 @@ public class DefaultDistributedSet<E> implements DistributedSet<E> { | ... | @@ -180,7 +180,7 @@ public class DefaultDistributedSet<E> implements DistributedSet<E> { |
180 | .reduce(Boolean::logicalOr) | 180 | .reduce(Boolean::logicalOr) |
181 | .orElse(false); | 181 | .orElse(false); |
182 | } finally { | 182 | } finally { |
183 | - timer.stop(); | 183 | + timer.stop(null); |
184 | } | 184 | } |
185 | } | 185 | } |
186 | 186 | ||
... | @@ -196,7 +196,7 @@ public class DefaultDistributedSet<E> implements DistributedSet<E> { | ... | @@ -196,7 +196,7 @@ public class DefaultDistributedSet<E> implements DistributedSet<E> { |
196 | .reduce(Boolean::logicalOr) | 196 | .reduce(Boolean::logicalOr) |
197 | .orElse(false); | 197 | .orElse(false); |
198 | } finally { | 198 | } finally { |
199 | - timer.stop(); | 199 | + timer.stop(null); |
200 | } | 200 | } |
201 | } | 201 | } |
202 | 202 | ||
... | @@ -206,7 +206,7 @@ public class DefaultDistributedSet<E> implements DistributedSet<E> { | ... | @@ -206,7 +206,7 @@ public class DefaultDistributedSet<E> implements DistributedSet<E> { |
206 | try { | 206 | try { |
207 | backingMap.clear(); | 207 | backingMap.clear(); |
208 | } finally { | 208 | } finally { |
209 | - timer.stop(); | 209 | + timer.stop(null); |
210 | } | 210 | } |
211 | } | 211 | } |
212 | 212 | ... | ... |
... | @@ -15,6 +15,7 @@ | ... | @@ -15,6 +15,7 @@ |
15 | */ | 15 | */ |
16 | package org.onosproject.store.consistent.impl; | 16 | package org.onosproject.store.consistent.impl; |
17 | 17 | ||
18 | +import com.codahale.metrics.Counter; | ||
18 | import com.codahale.metrics.Timer; | 19 | import com.codahale.metrics.Timer; |
19 | import com.google.common.collect.Maps; | 20 | import com.google.common.collect.Maps; |
20 | import org.onlab.metrics.MetricsComponent; | 21 | import org.onlab.metrics.MetricsComponent; |
... | @@ -32,6 +33,8 @@ import static com.google.common.base.Preconditions.checkNotNull; | ... | @@ -32,6 +33,8 @@ import static com.google.common.base.Preconditions.checkNotNull; |
32 | */ | 33 | */ |
33 | public class MeteringAgent { | 34 | public class MeteringAgent { |
34 | 35 | ||
36 | + private Counter exceptionCounter; | ||
37 | + private Counter perObjExceptionCounter; | ||
35 | private MetricsService metricsService; | 38 | private MetricsService metricsService; |
36 | private MetricsComponent metricsComponent; | 39 | private MetricsComponent metricsComponent; |
37 | private MetricsFeature metricsFeature; | 40 | private MetricsFeature metricsFeature; |
... | @@ -63,6 +66,8 @@ public class MeteringAgent { | ... | @@ -63,6 +66,8 @@ public class MeteringAgent { |
63 | this.wildcard = metricsComponent.registerFeature("*"); | 66 | this.wildcard = metricsComponent.registerFeature("*"); |
64 | this.perObjTimer = metricsService.createTimer(metricsComponent, metricsFeature, "*"); | 67 | this.perObjTimer = metricsService.createTimer(metricsComponent, metricsFeature, "*"); |
65 | this.perPrimitiveTimer = metricsService.createTimer(metricsComponent, wildcard, "*"); | 68 | this.perPrimitiveTimer = metricsService.createTimer(metricsComponent, wildcard, "*"); |
69 | + this.perObjExceptionCounter = metricsService.createCounter(metricsComponent, metricsFeature, "exceptions"); | ||
70 | + this.exceptionCounter = metricsService.createCounter(metricsComponent, wildcard, "exceptions"); | ||
66 | } | 71 | } |
67 | } | 72 | } |
68 | 73 | ||
... | @@ -103,19 +108,25 @@ public class MeteringAgent { | ... | @@ -103,19 +108,25 @@ public class MeteringAgent { |
103 | 108 | ||
104 | /** | 109 | /** |
105 | * Stops timer given a specific context and updates all related metrics. | 110 | * Stops timer given a specific context and updates all related metrics. |
111 | + * @param e | ||
106 | */ | 112 | */ |
107 | - public void stop() { | 113 | + public void stop(Throwable e) { |
108 | if (!activated) { | 114 | if (!activated) { |
109 | return; | 115 | return; |
110 | } | 116 | } |
111 | - //Stop and updates timer with specific measurements per map, per operation | 117 | + if (e == null) { |
112 | - final long time = context.stop(); | 118 | + //Stop and updates timer with specific measurements per map, per operation |
113 | - //updates timer with aggregated measurements per map | 119 | + final long time = context.stop(); |
114 | - perOpTimers.get(operation).update(time, TimeUnit.NANOSECONDS); | 120 | + //updates timer with aggregated measurements per map |
115 | - //updates timer with aggregated measurements per map | 121 | + perOpTimers.get(operation).update(time, TimeUnit.NANOSECONDS); |
116 | - perObjTimer.update(time, TimeUnit.NANOSECONDS); | 122 | + //updates timer with aggregated measurements per map |
117 | - //updates timer with aggregated measurements per all Consistent Maps | 123 | + perObjTimer.update(time, TimeUnit.NANOSECONDS); |
118 | - perPrimitiveTimer.update(time, TimeUnit.NANOSECONDS); | 124 | + //updates timer with aggregated measurements per all Consistent Maps |
125 | + perPrimitiveTimer.update(time, TimeUnit.NANOSECONDS); | ||
126 | + } else { | ||
127 | + exceptionCounter.inc(); | ||
128 | + perObjExceptionCounter.inc(); | ||
129 | + } | ||
119 | } | 130 | } |
120 | } | 131 | } |
121 | 132 | ... | ... |
-
Please register or login to post a comment