[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