8913742dae122f481bd43a55b8175a0688d14446
[onosfw.git] /
1 package org.onosproject.store.core.impl;
2
3 import com.google.common.collect.Maps;
4
5 import org.apache.felix.scr.annotations.Activate;
6 import org.apache.felix.scr.annotations.Component;
7 import org.apache.felix.scr.annotations.Deactivate;
8 import org.apache.felix.scr.annotations.Reference;
9 import org.apache.felix.scr.annotations.ReferenceCardinality;
10 import org.apache.felix.scr.annotations.Service;
11 import org.onlab.util.Tools;
12 import org.onosproject.core.IdBlock;
13 import org.onosproject.core.IdBlockStore;
14 import org.onosproject.store.service.AtomicCounter;
15 import org.onosproject.store.service.StorageException;
16 import org.onosproject.store.service.StorageService;
17 import org.slf4j.Logger;
18
19 import java.util.Map;
20
21 import static org.slf4j.LoggerFactory.getLogger;
22
23 /**
24  * Implementation of {@code IdBlockStore} using {@code AtomicCounter}.
25  */
26 @Component(immediate = true, enabled = true)
27 @Service
28 public class ConsistentIdBlockStore implements IdBlockStore {
29
30     private static final int MAX_TRIES = 5;
31     private static final int RETRY_DELAY_MS = 2_000;
32
33     private final Logger log = getLogger(getClass());
34     private final Map<String, AtomicCounter> topicCounters = Maps.newConcurrentMap();
35
36     private static final long DEFAULT_BLOCK_SIZE = 0x100000L;
37
38     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
39     protected StorageService storageService;
40
41     @Activate
42     public void activate() {
43         log.info("Started");
44     }
45
46     @Deactivate
47     public void deactivate() {
48         log.info("Stopped");
49     }
50
51     @Override
52     public IdBlock getIdBlock(String topic) {
53         AtomicCounter counter = topicCounters
54                 .computeIfAbsent(topic,
55                                  name -> storageService.atomicCounterBuilder()
56                                          .withName(name)
57                                          .build());
58         Long blockBase = Tools.retryable(counter::getAndAdd,
59                 StorageException.class,
60                 MAX_TRIES,
61                 RETRY_DELAY_MS).apply(DEFAULT_BLOCK_SIZE);
62         return new IdBlock(blockBase, DEFAULT_BLOCK_SIZE);
63     }
64 }