[ONOS-6859] Cache Raft sessions for transactions
Change-Id: I96ec3dc4dee237483a56694e3f1c3075bb1161f7
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/TransactionManager.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/TransactionManager.java
index 5c246de..223cfec 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/TransactionManager.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/TransactionManager.java
@@ -49,7 +49,7 @@
private final List<PartitionId> sortedPartitions;
private final AsyncConsistentMap<TransactionId, Transaction.State> transactions;
private final int cacheSize;
- private final Map<PartitionId, Cache<String, AsyncConsistentMap>> partitionCache = Maps.newConcurrentMap();
+ private final Map<PartitionId, Cache<String, CachedMap>> partitionCache = Maps.newConcurrentMap();
public TransactionManager(StorageService storageService, PartitionService partitionService) {
this(storageService, partitionService, DEFAULT_CACHE_SIZE);
@@ -113,18 +113,17 @@
PartitionId partitionId,
Serializer serializer,
TransactionCoordinator transactionCoordinator) {
- Cache<String, AsyncConsistentMap> mapCache = partitionCache.computeIfAbsent(partitionId, p ->
+ Cache<String, CachedMap> mapCache = partitionCache.computeIfAbsent(partitionId, p ->
CacheBuilder.newBuilder().maximumSize(cacheSize / partitionService.getNumberOfPartitions()).build());
try {
- AsyncConsistentMap<K, V> baseMap = partitionService.getDistributedPrimitiveCreator(partitionId)
- .newAsyncConsistentMap(mapName, serializer);
- AsyncConsistentMap<K, V> asyncMap = mapCache.get(mapName, () ->
- DistributedPrimitives.newCachingMap(baseMap));
+ CachedMap<K, V> cachedMap = mapCache.get(mapName,
+ () -> new CachedMap<>(partitionService.getDistributedPrimitiveCreator(partitionId)
+ .newAsyncConsistentMap(mapName, serializer)));
Transaction<MapUpdate<K, V>> transaction = new Transaction<>(
transactionCoordinator.transactionId,
- baseMap);
- return new DefaultTransactionalMapParticipant<>(asyncMap.asConsistentMap(), transaction);
+ cachedMap.baseMap);
+ return new DefaultTransactionalMapParticipant<>(cachedMap.cachedMap.asConsistentMap(), transaction);
} catch (ExecutionException e) {
throw new TransactionException(e);
}
@@ -150,4 +149,14 @@
CompletableFuture<Void> remove(TransactionId transactionId) {
return transactions.remove(transactionId).thenApply(v -> null);
}
+
+ private static class CachedMap<K, V> {
+ private final AsyncConsistentMap<K, V> baseMap;
+ private final AsyncConsistentMap<K, V> cachedMap;
+
+ public CachedMap(AsyncConsistentMap<K, V> baseMap) {
+ this.baseMap = baseMap;
+ this.cachedMap = DistributedPrimitives.newCachingMap(baseMap);
+ }
+ }
}
\ No newline at end of file