Committed by
Gerrit Code Review
Adding retry to id block store.
Change-Id: I274a928a13d2999ccfeb79fc45caf292dbb81f5b
Showing
1 changed file
with
21 additions
and
6 deletions
... | @@ -13,6 +13,7 @@ import org.apache.felix.scr.annotations.Service; | ... | @@ -13,6 +13,7 @@ import org.apache.felix.scr.annotations.Service; |
13 | import org.onosproject.core.IdBlock; | 13 | import org.onosproject.core.IdBlock; |
14 | import org.onosproject.core.IdBlockStore; | 14 | import org.onosproject.core.IdBlockStore; |
15 | import org.onosproject.store.service.AtomicCounter; | 15 | import org.onosproject.store.service.AtomicCounter; |
16 | +import org.onosproject.store.service.StorageException; | ||
16 | import org.onosproject.store.service.StorageService; | 17 | import org.onosproject.store.service.StorageService; |
17 | import org.slf4j.Logger; | 18 | import org.slf4j.Logger; |
18 | 19 | ||
... | @@ -25,6 +26,8 @@ import com.google.common.collect.Maps; | ... | @@ -25,6 +26,8 @@ import com.google.common.collect.Maps; |
25 | @Service | 26 | @Service |
26 | public class ConsistentIdBlockStore implements IdBlockStore { | 27 | public class ConsistentIdBlockStore implements IdBlockStore { |
27 | 28 | ||
29 | + private static final int MAX_TRIES = 3; | ||
30 | + | ||
28 | private final Logger log = getLogger(getClass()); | 31 | private final Logger log = getLogger(getClass()); |
29 | private final Map<String, AtomicCounter> topicCounters = Maps.newConcurrentMap(); | 32 | private final Map<String, AtomicCounter> topicCounters = Maps.newConcurrentMap(); |
30 | 33 | ||
... | @@ -45,11 +48,23 @@ public class ConsistentIdBlockStore implements IdBlockStore { | ... | @@ -45,11 +48,23 @@ public class ConsistentIdBlockStore implements IdBlockStore { |
45 | 48 | ||
46 | @Override | 49 | @Override |
47 | public IdBlock getIdBlock(String topic) { | 50 | public IdBlock getIdBlock(String topic) { |
48 | - AtomicCounter counter = topicCounters.computeIfAbsent(topic, | 51 | + AtomicCounter counter = topicCounters |
49 | - name -> storageService.atomicCounterBuilder() | 52 | + .computeIfAbsent(topic, |
50 | - .withName(name) | 53 | + name -> storageService.atomicCounterBuilder() |
51 | - .build()); | 54 | + .withName(name) |
52 | - Long blockBase = counter.getAndAdd(DEFAULT_BLOCK_SIZE); | 55 | + .build()); |
53 | - return new IdBlock(blockBase, DEFAULT_BLOCK_SIZE); | 56 | + Throwable exc = null; |
57 | + for (int i = 0; i < MAX_TRIES; i++) { | ||
58 | + try { | ||
59 | + Long blockBase = counter.getAndAdd(DEFAULT_BLOCK_SIZE); | ||
60 | + return new IdBlock(blockBase, DEFAULT_BLOCK_SIZE); | ||
61 | + } catch (StorageException e) { | ||
62 | + log.warn("Unable to allocate ID block due to {}; retrying...", | ||
63 | + e.getMessage()); | ||
64 | + exc = e; | ||
65 | + } | ||
66 | + } | ||
67 | + throw new IllegalStateException("Unable to allocate ID block", exc); | ||
54 | } | 68 | } |
69 | + | ||
55 | } | 70 | } | ... | ... |
-
Please register or login to post a comment