ONOS-2429: Support for a relaxed read consistency mode in ConsistentMap

Change-Id: I7866d8d15de369fd23e482d66cc1c918c033f169
diff --git a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultConsistentMapBuilder.java b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultConsistentMapBuilder.java
index 965791d..0e11794 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultConsistentMapBuilder.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultConsistentMapBuilder.java
@@ -39,6 +39,7 @@
     private boolean partitionsEnabled = true;
     private boolean readOnly = false;
     private boolean metering = true;
+    private boolean relaxedReadConsistency = false;
     private final DatabaseManager manager;
 
     public DefaultConsistentMapBuilder(DatabaseManager manager) {
@@ -90,6 +91,12 @@
         return this;
     }
 
+    @Override
+    public ConsistentMapBuilder<K, V> withRelaxedReadConsistency() {
+        relaxedReadConsistency = true;
+        return this;
+    }
+
     private void validateInputs() {
         checkState(name != null, "name must be specified");
         checkState(serializer != null, "serializer must be specified");
@@ -110,14 +117,25 @@
 
     private DefaultAsyncConsistentMap<K, V> buildAndRegisterMap() {
         validateInputs();
-        DefaultAsyncConsistentMap<K, V> asyncMap = new DefaultAsyncConsistentMap<>(
-                name,
-                applicationId,
-                partitionsEnabled ? manager.partitionedDatabase : manager.inMemoryDatabase,
-                serializer,
-                readOnly,
-                purgeOnUninstall,
-                metering);
-        return manager.registerMap(asyncMap);
+        Database database = partitionsEnabled ? manager.partitionedDatabase : manager.inMemoryDatabase;
+        if (relaxedReadConsistency) {
+            return manager.registerMap(
+                    new AsyncCachingConsistentMap<>(name,
+                        applicationId,
+                        database,
+                        serializer,
+                        readOnly,
+                        purgeOnUninstall,
+                        metering));
+        } else {
+            return manager.registerMap(
+                    new DefaultAsyncConsistentMap<>(name,
+                        applicationId,
+                        database,
+                        serializer,
+                        readOnly,
+                        purgeOnUninstall,
+                        metering));
+        }
     }
 }
\ No newline at end of file