From 02b7fb8b1a58c5bc84b19b2c1d7ae0bc0e8b526c Mon Sep 17 00:00:00 2001 From: Madan Jampani Date: Fri, 1 May 2015 13:01:20 -0700 Subject: [PATCH] Support for building a immutable ConsistentMap and DistributedSet Change-Id: Ic34684551f5c7d1f4fdc4cd3fc1a7bfabc5681f5 --- .../store/service/ConsistentMapBuilder.java | 9 +++++++++ .../onosproject/store/service/SetBuilder.java | 9 +++++++++ .../impl/DefaultAsyncConsistentMap.java | 19 ++++++++++++++++++- .../consistent/impl/DefaultConsistentMap.java | 5 +++-- .../impl/DefaultConsistentMapBuilder.java | 13 +++++++++++-- .../impl/DefaultDistributedSet.java | 4 ++-- .../consistent/impl/DefaultSetBuilder.java | 9 ++++++++- .../impl/DefaultTransactionContext.java | 4 ++-- .../consistent/impl/TransactionManager.java | 4 ++-- 9 files changed, 64 insertions(+), 12 deletions(-) diff --git a/core/api/src/main/java/org/onosproject/store/service/ConsistentMapBuilder.java b/core/api/src/main/java/org/onosproject/store/service/ConsistentMapBuilder.java index 6a02f34ba2..6e3fba4380 100644 --- a/core/api/src/main/java/org/onosproject/store/service/ConsistentMapBuilder.java +++ b/core/api/src/main/java/org/onosproject/store/service/ConsistentMapBuilder.java @@ -55,6 +55,15 @@ public interface ConsistentMapBuilder { */ public ConsistentMapBuilder withPartitionsDisabled(); + /** + * Disables map updates. + *

+ * Attempt to update the built map will throw {@code UnsupportedOperationException}. + * + * @return this ConsistentMapBuilder + */ + public ConsistentMapBuilder withUpdatesDisabled(); + /** * Builds an consistent map based on the configuration options * supplied to this builder. diff --git a/core/api/src/main/java/org/onosproject/store/service/SetBuilder.java b/core/api/src/main/java/org/onosproject/store/service/SetBuilder.java index cd2e060aa3..3ea7aaf536 100644 --- a/core/api/src/main/java/org/onosproject/store/service/SetBuilder.java +++ b/core/api/src/main/java/org/onosproject/store/service/SetBuilder.java @@ -52,6 +52,15 @@ public interface SetBuilder { */ public SetBuilder withSerializer(Serializer serializer); + /** + * Disables set updates. + *

+ * Attempt to update the built set will throw {@code UnsupportedOperationException}. + * + * @return this SetBuilder + */ + SetBuilder withUpdatesDisabled(); + /** * Builds an set based on the configuration options * supplied to this builder. diff --git a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultAsyncConsistentMap.java b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultAsyncConsistentMap.java index 09f612e04c..dd80db612d 100644 --- a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultAsyncConsistentMap.java +++ b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultAsyncConsistentMap.java @@ -48,6 +48,7 @@ public class DefaultAsyncConsistentMap implements AsyncConsistentMap private final String name; private final Database database; private final Serializer serializer; + private final boolean readOnly; private static final String ERROR_NULL_KEY = "Key cannot be null"; private static final String ERROR_NULL_VALUE = "Null values are not allowed"; @@ -68,10 +69,12 @@ public class DefaultAsyncConsistentMap implements AsyncConsistentMap public DefaultAsyncConsistentMap(String name, Database database, - Serializer serializer) { + Serializer serializer, + boolean readOnly) { this.name = checkNotNull(name, "map name cannot be null"); this.database = checkNotNull(database, "database cannot be null"); this.serializer = checkNotNull(serializer, "serializer cannot be null"); + this.readOnly = readOnly; } @Override @@ -108,6 +111,7 @@ public class DefaultAsyncConsistentMap implements AsyncConsistentMap public CompletableFuture> put(K key, V value) { checkNotNull(key, ERROR_NULL_KEY); checkNotNull(value, ERROR_NULL_VALUE); + checkIfUnmodifiable(); return database.put(name, keyCache.getUnchecked(key), serializer.encode(value)) .thenApply(this::unwrapResult) .thenApply(v -> v != null @@ -117,6 +121,7 @@ public class DefaultAsyncConsistentMap implements AsyncConsistentMap @Override public CompletableFuture> remove(K key) { checkNotNull(key, ERROR_NULL_KEY); + checkIfUnmodifiable(); return database.remove(name, keyCache.getUnchecked(key)) .thenApply(this::unwrapResult) .thenApply(v -> v != null @@ -125,6 +130,7 @@ public class DefaultAsyncConsistentMap implements AsyncConsistentMap @Override public CompletableFuture clear() { + checkIfUnmodifiable(); return database.clear(name).thenApply(this::unwrapResult); } @@ -157,6 +163,7 @@ public class DefaultAsyncConsistentMap implements AsyncConsistentMap public CompletableFuture> putIfAbsent(K key, V value) { checkNotNull(key, ERROR_NULL_KEY); checkNotNull(value, ERROR_NULL_VALUE); + checkIfUnmodifiable(); return database.putIfAbsent(name, keyCache.getUnchecked(key), serializer.encode(value)) @@ -169,6 +176,7 @@ public class DefaultAsyncConsistentMap implements AsyncConsistentMap public CompletableFuture remove(K key, V value) { checkNotNull(key, ERROR_NULL_KEY); checkNotNull(value, ERROR_NULL_VALUE); + checkIfUnmodifiable(); return database.remove(name, keyCache.getUnchecked(key), serializer.encode(value)) .thenApply(this::unwrapResult); } @@ -176,6 +184,7 @@ public class DefaultAsyncConsistentMap implements AsyncConsistentMap @Override public CompletableFuture remove(K key, long version) { checkNotNull(key, ERROR_NULL_KEY); + checkIfUnmodifiable(); return database.remove(name, keyCache.getUnchecked(key), version) .thenApply(this::unwrapResult); @@ -185,6 +194,7 @@ public class DefaultAsyncConsistentMap implements AsyncConsistentMap public CompletableFuture replace(K key, V oldValue, V newValue) { checkNotNull(key, ERROR_NULL_KEY); checkNotNull(newValue, ERROR_NULL_VALUE); + checkIfUnmodifiable(); byte[] existing = oldValue != null ? serializer.encode(oldValue) : null; return database.replace(name, keyCache.getUnchecked(key), existing, serializer.encode(newValue)) .thenApply(this::unwrapResult); @@ -194,6 +204,7 @@ public class DefaultAsyncConsistentMap implements AsyncConsistentMap public CompletableFuture replace(K key, long oldVersion, V newValue) { checkNotNull(key, ERROR_NULL_KEY); checkNotNull(newValue, ERROR_NULL_VALUE); + checkIfUnmodifiable(); return database.replace(name, keyCache.getUnchecked(key), oldVersion, serializer.encode(newValue)) .thenApply(this::unwrapResult); } @@ -216,4 +227,10 @@ public class DefaultAsyncConsistentMap implements AsyncConsistentMap throw new IllegalStateException("Must not be here"); } } + + private void checkIfUnmodifiable() { + if (readOnly) { + throw new UnsupportedOperationException(); + } + } } \ No newline at end of file diff --git a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultConsistentMap.java b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultConsistentMap.java index 046aafb6e0..7b0ad10615 100644 --- a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultConsistentMap.java +++ b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultConsistentMap.java @@ -45,8 +45,9 @@ public class DefaultConsistentMap implements ConsistentMap { public DefaultConsistentMap(String name, Database database, - Serializer serializer) { - asyncMap = new DefaultAsyncConsistentMap<>(name, database, serializer); + Serializer serializer, + boolean readOnly) { + asyncMap = new DefaultAsyncConsistentMap<>(name, database, serializer, readOnly); } @Override 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 ba56e591d4..534b59f9c9 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 @@ -19,6 +19,7 @@ public class DefaultConsistentMapBuilder implements ConsistentMapBuilder implements ConsistentMapBuilder withUpdatesDisabled() { + readOnly = true; + return this; + } + private boolean validInputs() { return name != null && serializer != null; } @@ -57,7 +64,8 @@ public class DefaultConsistentMapBuilder implements ConsistentMapBuilder( name, partitionsEnabled ? partitionedDatabase : inMemoryDatabase, - serializer); + serializer, + readOnly); } @Override @@ -66,6 +74,7 @@ public class DefaultConsistentMapBuilder implements ConsistentMapBuilder( name, partitionsEnabled ? partitionedDatabase : inMemoryDatabase, - serializer); + serializer, + readOnly); } } \ No newline at end of file diff --git a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultDistributedSet.java b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultDistributedSet.java index 97d5ef3783..adc9dcd041 100644 --- a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultDistributedSet.java +++ b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultDistributedSet.java @@ -33,8 +33,8 @@ public class DefaultDistributedSet implements Set { private final ConsistentMap backingMap; - public DefaultDistributedSet(String name, Database database, Serializer serializer) { - backingMap = new DefaultConsistentMap<>(name, database, serializer); + public DefaultDistributedSet(String name, Database database, Serializer serializer, boolean readOnly) { + backingMap = new DefaultConsistentMap<>(name, database, serializer, readOnly); } @Override diff --git a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultSetBuilder.java b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultSetBuilder.java index dfc9c400e5..566953f024 100644 --- a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultSetBuilder.java +++ b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultSetBuilder.java @@ -34,6 +34,7 @@ public class DefaultSetBuilder implements SetBuilder { private Serializer serializer; private String name; private final Database database; + private boolean readOnly; public DefaultSetBuilder(Database database) { this.database = checkNotNull(database); @@ -53,6 +54,12 @@ public class DefaultSetBuilder implements SetBuilder { return this; } + @Override + public SetBuilder withUpdatesDisabled() { + readOnly = true; + return this; + } + private boolean validInputs() { return name != null && serializer != null; } @@ -60,6 +67,6 @@ public class DefaultSetBuilder implements SetBuilder { @Override public Set build() { checkState(validInputs()); - return new DefaultDistributedSet<>(name, database, serializer); + return new DefaultDistributedSet<>(name, database, serializer, readOnly); } } diff --git a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultTransactionContext.java b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultTransactionContext.java index 10b7cfd629..5570e30d23 100644 --- a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultTransactionContext.java +++ b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultTransactionContext.java @@ -72,7 +72,7 @@ public class DefaultTransactionContext implements TransactionContext { checkNotNull(serializer); return txMaps.computeIfAbsent(mapName, name -> new DefaultTransactionalMap<>( name, - new DefaultConsistentMap<>(name, database, serializer), + new DefaultConsistentMap<>(name, database, serializer, false), this, serializer)); } @@ -99,4 +99,4 @@ public class DefaultTransactionContext implements TransactionContext { checkState(isOpen, TX_NOT_OPEN_ERROR); txMaps.values().forEach(m -> m.rollback()); } -} \ No newline at end of file +} diff --git a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/TransactionManager.java b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/TransactionManager.java index 45b590a334..d8e9930582 100644 --- a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/TransactionManager.java +++ b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/TransactionManager.java @@ -60,7 +60,7 @@ public class TransactionManager { */ public TransactionManager(Database database) { this.database = checkNotNull(database, "database cannot be null"); - this.transactions = new DefaultAsyncConsistentMap<>("onos-transactions", this.database, serializer); + this.transactions = new DefaultAsyncConsistentMap<>("onos-transactions", this.database, serializer, false); } /** @@ -121,4 +121,4 @@ public class TransactionManager { transaction.transition(Transaction.State.ROLLEDBACK))) .thenApply(v -> true); } -} \ No newline at end of file +}