Madan Jampani
Committed by Gerrit Code Review

Dropping DatabaseManager and related code. Goodbye!

Change-Id: I5d90d62678402234462dad8be455903de481da21
Showing 34 changed files with 3 additions and 2787 deletions
1 -/*
2 - * Copyright 2015 Open Networking Laboratory
3 - *
4 - * Licensed under the Apache License, Version 2.0 (the "License");
5 - * you may not use this file except in compliance with the License.
6 - * You may obtain a copy of the License at
7 - *
8 - * http://www.apache.org/licenses/LICENSE-2.0
9 - *
10 - * Unless required by applicable law or agreed to in writing, software
11 - * distributed under the License is distributed on an "AS IS" BASIS,
12 - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 - * See the License for the specific language governing permissions and
14 - * limitations under the License.
15 - */
16 -package org.onosproject.store.primitives.impl;
17 -
18 -import java.util.concurrent.CompletableFuture;
19 -
20 -import org.onosproject.core.ApplicationId;
21 -import org.onosproject.store.service.Serializer;
22 -import org.onosproject.store.service.Versioned;
23 -
24 -import com.google.common.cache.CacheBuilder;
25 -import com.google.common.cache.CacheLoader;
26 -import com.google.common.cache.LoadingCache;
27 -
28 -/**
29 - * Extension of {@link DefaultAsyncConsistentMap} that provides a weaker read consistency
30 - * guarantee in return for better read performance.
31 - * <p>
32 - * For read/write operations that are local to a node this map implementation provides
33 - * guarantees similar to a ConsistentMap. However for read/write operations executed
34 - * across multiple nodes this implementation only provides eventual consistency.
35 - *
36 - * @param <K> key type
37 - * @param <V> value type
38 - */
39 -public class AsyncCachingConsistentMap<K, V> extends DefaultAsyncConsistentMap<K, V> {
40 -
41 - private final LoadingCache<K, CompletableFuture<Versioned<V>>> cache =
42 - CacheBuilder.newBuilder()
43 - .maximumSize(10000) // TODO: make configurable
44 - .build(new CacheLoader<K, CompletableFuture<Versioned<V>>>() {
45 - @Override
46 - public CompletableFuture<Versioned<V>> load(K key)
47 - throws Exception {
48 - return AsyncCachingConsistentMap.super.get(key);
49 - }
50 - });
51 -
52 - public AsyncCachingConsistentMap(String name,
53 - ApplicationId applicationId,
54 - Database database,
55 - Serializer serializer,
56 - boolean readOnly,
57 - boolean purgeOnUninstall,
58 - boolean meteringEnabled) {
59 - super(name, applicationId, database, serializer, readOnly, purgeOnUninstall, meteringEnabled);
60 - addListener(event -> cache.invalidate(event.key()));
61 - }
62 -
63 - @Override
64 - public CompletableFuture<Versioned<V>> get(K key) {
65 - CompletableFuture<Versioned<V>> cachedValue = cache.getIfPresent(key);
66 - if (cachedValue != null) {
67 - if (cachedValue.isCompletedExceptionally()) {
68 - cache.invalidate(key);
69 - } else {
70 - return cachedValue;
71 - }
72 - }
73 - return cache.getUnchecked(key);
74 - }
75 -
76 - @Override
77 - protected void beforeUpdate(K key) {
78 - super.beforeUpdate(key);
79 - cache.invalidate(key);
80 - }
81 -}
...\ No newline at end of file ...\ No newline at end of file
1 -/*
2 - * Copyright 2015 Open Networking Laboratory
3 - *
4 - * Licensed under the Apache License, Version 2.0 (the "License");
5 - * you may not use this file except in compliance with the License.
6 - * You may obtain a copy of the License at
7 - *
8 - * http://www.apache.org/licenses/LICENSE-2.0
9 - *
10 - * Unless required by applicable law or agreed to in writing, software
11 - * distributed under the License is distributed on an "AS IS" BASIS,
12 - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 - * See the License for the specific language governing permissions and
14 - * limitations under the License.
15 - */
16 -package org.onosproject.store.primitives.impl;
17 -
18 -import static com.google.common.base.MoreObjects.toStringHelper;
19 -
20 -import java.util.Collections;
21 -import java.util.List;
22 -
23 -import com.google.common.collect.ImmutableList;
24 -
25 -/**
26 - * Result of a Transaction commit operation.
27 - */
28 -public final class CommitResponse {
29 -
30 - private boolean success;
31 - private List<UpdateResult<String, byte[]>> updates;
32 -
33 - public static CommitResponse success(List<UpdateResult<String, byte[]>> updates) {
34 - return new CommitResponse(true, updates);
35 - }
36 -
37 - public static CommitResponse failure() {
38 - return new CommitResponse(false, Collections.emptyList());
39 - }
40 -
41 - private CommitResponse(boolean success, List<UpdateResult<String, byte[]>> updates) {
42 - this.success = success;
43 - this.updates = ImmutableList.copyOf(updates);
44 - }
45 -
46 - public boolean success() {
47 - return success;
48 - }
49 -
50 - public List<UpdateResult<String, byte[]>> updates() {
51 - return updates;
52 - }
53 -
54 - @Override
55 - public String toString() {
56 - return toStringHelper(this)
57 - .add("success", success)
58 - .add("udpates", updates)
59 - .toString();
60 - }
61 -}
1 -/*
2 - * Copyright 2015 Open Networking Laboratory
3 - *
4 - * Licensed under the Apache License, Version 2.0 (the "License");
5 - * you may not use this file except in compliance with the License.
6 - * You may obtain a copy of the License at
7 - *
8 - * http://www.apache.org/licenses/LICENSE-2.0
9 - *
10 - * Unless required by applicable law or agreed to in writing, software
11 - * distributed under the License is distributed on an "AS IS" BASIS,
12 - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 - * See the License for the specific language governing permissions and
14 - * limitations under the License.
15 - */
16 -package org.onosproject.store.primitives.impl;
17 -
18 -import java.net.URI;
19 -import java.nio.ByteBuffer;
20 -import java.util.concurrent.CompletableFuture;
21 -
22 -import org.onlab.util.Tools;
23 -import org.onosproject.cluster.ClusterService;
24 -import org.onosproject.cluster.ControllerNode;
25 -import org.onosproject.cluster.NodeId;
26 -import org.onosproject.store.cluster.messaging.ClusterCommunicationService;
27 -import org.onosproject.store.cluster.messaging.MessageSubject;
28 -
29 -import net.kuujo.copycat.protocol.AbstractProtocol;
30 -import net.kuujo.copycat.protocol.ProtocolClient;
31 -import net.kuujo.copycat.protocol.ProtocolHandler;
32 -import net.kuujo.copycat.protocol.ProtocolServer;
33 -import net.kuujo.copycat.util.Configurable;
34 -
35 -/**
36 - * Protocol for Copycat communication that employs
37 - * {@code ClusterCommunicationService}.
38 - */
39 -public class CopycatCommunicationProtocol extends AbstractProtocol {
40 -
41 - private static final MessageSubject COPYCAT_MESSAGE_SUBJECT =
42 - new MessageSubject("onos-copycat-message");
43 -
44 - protected ClusterService clusterService;
45 - protected ClusterCommunicationService clusterCommunicator;
46 -
47 - public CopycatCommunicationProtocol(ClusterService clusterService,
48 - ClusterCommunicationService clusterCommunicator) {
49 - this.clusterService = clusterService;
50 - this.clusterCommunicator = clusterCommunicator;
51 - }
52 -
53 - @Override
54 - public Configurable copy() {
55 - return this;
56 - }
57 -
58 - @Override
59 - public ProtocolClient createClient(URI uri) {
60 - NodeId nodeId = uriToNodeId(uri);
61 - if (nodeId == null) {
62 - throw new IllegalStateException("Unknown peer " + uri);
63 - }
64 - return new Client(nodeId);
65 - }
66 -
67 - @Override
68 - public ProtocolServer createServer(URI uri) {
69 - return new Server();
70 - }
71 -
72 - private class Server implements ProtocolServer {
73 -
74 - @Override
75 - public void handler(ProtocolHandler handler) {
76 - if (handler == null) {
77 - clusterCommunicator.removeSubscriber(COPYCAT_MESSAGE_SUBJECT);
78 - } else {
79 - clusterCommunicator.addSubscriber(COPYCAT_MESSAGE_SUBJECT,
80 - ByteBuffer::wrap,
81 - handler,
82 - Tools::byteBuffertoArray);
83 - // FIXME: Tools::byteBuffertoArray involves a array copy.
84 - }
85 - }
86 -
87 - @Override
88 - public CompletableFuture<Void> listen() {
89 - return CompletableFuture.completedFuture(null);
90 - }
91 -
92 - @Override
93 - public CompletableFuture<Void> close() {
94 - clusterCommunicator.removeSubscriber(COPYCAT_MESSAGE_SUBJECT);
95 - return CompletableFuture.completedFuture(null);
96 - }
97 - }
98 -
99 - private class Client implements ProtocolClient {
100 - private final NodeId peer;
101 -
102 - public Client(NodeId peer) {
103 - this.peer = peer;
104 - }
105 -
106 - @Override
107 - public CompletableFuture<ByteBuffer> write(ByteBuffer request) {
108 - return clusterCommunicator.sendAndReceive(request,
109 - COPYCAT_MESSAGE_SUBJECT,
110 - Tools::byteBuffertoArray,
111 - ByteBuffer::wrap,
112 - peer);
113 - }
114 -
115 - @Override
116 - public CompletableFuture<Void> connect() {
117 - return CompletableFuture.completedFuture(null);
118 - }
119 -
120 - @Override
121 - public CompletableFuture<Void> close() {
122 - return CompletableFuture.completedFuture(null);
123 - }
124 - }
125 -
126 - private NodeId uriToNodeId(URI uri) {
127 - return clusterService.getNodes()
128 - .stream()
129 - .filter(node -> uri.getHost().equals(node.ip().toString()))
130 - .map(ControllerNode::id)
131 - .findAny()
132 - .orElse(null);
133 - }
134 -}
1 -/*
2 - * Copyright 2015 Open Networking Laboratory
3 - *
4 - * Licensed under the Apache License, Version 2.0 (the "License");
5 - * you may not use this file except in compliance with the License.
6 - * You may obtain a copy of the License at
7 - *
8 - * http://www.apache.org/licenses/LICENSE-2.0
9 - *
10 - * Unless required by applicable law or agreed to in writing, software
11 - * distributed under the License is distributed on an "AS IS" BASIS,
12 - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 - * See the License for the specific language governing permissions and
14 - * limitations under the License.
15 - */
16 -
17 -package org.onosproject.store.primitives.impl;
18 -
19 -
20 -import java.util.function.Consumer;
21 -
22 -import net.kuujo.copycat.cluster.ClusterConfig;
23 -import net.kuujo.copycat.cluster.internal.coordinator.ClusterCoordinator;
24 -import net.kuujo.copycat.cluster.internal.coordinator.CoordinatorConfig;
25 -import net.kuujo.copycat.cluster.internal.coordinator.DefaultClusterCoordinator;
26 -import net.kuujo.copycat.resource.Resource;
27 -
28 -/**
29 - * Database.
30 - */
31 -public interface Database extends DatabaseProxy<String, byte[]>, Resource<Database> {
32 -
33 - /**
34 - * Creates a new database with the default cluster configuration.<p>
35 - *
36 - * The database will be constructed with the default cluster configuration. The default cluster configuration
37 - * searches for two resources on the classpath - {@code cluster} and {cluster-defaults} - in that order. Configuration
38 - * options specified in {@code cluster.conf} will override those in {cluster-defaults.conf}.<p>
39 - *
40 - * Additionally, the database will be constructed with an database configuration that searches the classpath for
41 - * three configuration files - {@code name}, {@code database}, {@code database-defaults}, {@code resource}, and
42 - * {@code resource-defaults} - in that order. The first resource is a configuration resource with the same name
43 - * as the map resource. If the resource is namespaced - e.g. `databases.my-database.conf` - then resource
44 - * configurations will be loaded according to namespaces as well; for example, `databases.conf`.
45 - *
46 - * @param name The database name.
47 - * @return The database.
48 - */
49 - static Database create(String name) {
50 - return create(name, new ClusterConfig(), new DatabaseConfig());
51 - }
52 -
53 - /**
54 - * Creates a new database.<p>
55 - *
56 - * The database will be constructed with an database configuration that searches the classpath for
57 - * three configuration files - {@code name}, {@code database}, {@code database-defaults}, {@code resource}, and
58 - * {@code resource-defaults} - in that order. The first resource is a configuration resource with the same name
59 - * as the database resource. If the resource is namespaced - e.g. `databases.my-database.conf` - then resource
60 - * configurations will be loaded according to namespaces as well; for example, `databases.conf`.
61 - *
62 - * @param name The database name.
63 - * @param cluster The cluster configuration.
64 - * @return The database.
65 - */
66 - static Database create(String name, ClusterConfig cluster) {
67 - return create(name, cluster, new DatabaseConfig());
68 - }
69 -
70 - /**
71 - * Creates a new database.
72 - *
73 - * @param name The database name.
74 - * @param cluster The cluster configuration.
75 - * @param config The database configuration.
76 -
77 - * @return The database.
78 - */
79 - static Database create(String name, ClusterConfig cluster, DatabaseConfig config) {
80 - ClusterCoordinator coordinator =
81 - new DefaultClusterCoordinator(new CoordinatorConfig().withName(name).withClusterConfig(cluster));
82 - return coordinator.<Database>getResource(name, config.resolve(cluster))
83 - .addStartupTask(() -> coordinator.open().thenApply(v -> null))
84 - .addShutdownTask(coordinator::close);
85 - }
86 -
87 - /**
88 - * Tells whether the database supports change notifications.
89 - * @return true if notifications are supported; false otherwise
90 - */
91 - default boolean hasChangeNotificationSupport() {
92 - return true;
93 - }
94 -
95 - /**
96 - * Registers a new consumer of StateMachineUpdates.
97 - * @param consumer consumer to register
98 - */
99 - void registerConsumer(Consumer<StateMachineUpdate> consumer);
100 -
101 - /**
102 - * Unregisters a consumer of StateMachineUpdates.
103 - * @param consumer consumer to unregister
104 - */
105 - void unregisterConsumer(Consumer<StateMachineUpdate> consumer);
106 -}
...\ No newline at end of file ...\ No newline at end of file
1 -/*
2 - * Copyright 2015 Open Networking Laboratory
3 - *
4 - * Licensed under the Apache License, Version 2.0 (the "License");
5 - * you may not use this file except in compliance with the License.
6 - * You may obtain a copy of the License at
7 - *
8 - * http://www.apache.org/licenses/LICENSE-2.0
9 - *
10 - * Unless required by applicable law or agreed to in writing, software
11 - * distributed under the License is distributed on an "AS IS" BASIS,
12 - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 - * See the License for the specific language governing permissions and
14 - * limitations under the License.
15 - */
16 -
17 -package org.onosproject.store.primitives.impl;
18 -
19 -import com.typesafe.config.ConfigValueFactory;
20 -import net.kuujo.copycat.cluster.ClusterConfig;
21 -import net.kuujo.copycat.cluster.internal.coordinator.CoordinatedResourceConfig;
22 -import net.kuujo.copycat.protocol.Consistency;
23 -import net.kuujo.copycat.resource.ResourceConfig;
24 -import net.kuujo.copycat.state.StateLogConfig;
25 -import net.kuujo.copycat.util.internal.Assert;
26 -
27 -import java.util.Map;
28 -
29 -/**
30 - * Database configuration.
31 - *
32 - */
33 -public class DatabaseConfig extends ResourceConfig<DatabaseConfig> {
34 - private static final String DATABASE_CONSISTENCY = "consistency";
35 -
36 - private static final String DEFAULT_CONFIGURATION = "database-defaults";
37 - private static final String CONFIGURATION = "database";
38 -
39 - private String name;
40 -
41 - public DatabaseConfig() {
42 - super(CONFIGURATION, DEFAULT_CONFIGURATION);
43 - }
44 -
45 - public DatabaseConfig(Map<String, Object> config) {
46 - super(config, CONFIGURATION, DEFAULT_CONFIGURATION);
47 - }
48 -
49 - public DatabaseConfig(String resource) {
50 - super(resource, CONFIGURATION, DEFAULT_CONFIGURATION);
51 - }
52 -
53 - protected DatabaseConfig(DatabaseConfig config) {
54 - super(config);
55 - }
56 -
57 - @Override
58 - public DatabaseConfig copy() {
59 - return new DatabaseConfig(this);
60 - }
61 -
62 - /**
63 - * Sets the database read consistency.
64 - *
65 - * @param consistency The database read consistency.
66 - * @throws java.lang.NullPointerException If the consistency is {@code null}
67 - */
68 - public void setConsistency(String consistency) {
69 - this.config = config.withValue(DATABASE_CONSISTENCY,
70 - ConfigValueFactory.fromAnyRef(
71 - Consistency.parse(Assert.isNotNull(consistency, "consistency")).toString()));
72 - }
73 -
74 - /**
75 - * Sets the database read consistency.
76 - *
77 - * @param consistency The database read consistency.
78 - * @throws java.lang.NullPointerException If the consistency is {@code null}
79 - */
80 - public void setConsistency(Consistency consistency) {
81 - this.config = config.withValue(DATABASE_CONSISTENCY,
82 - ConfigValueFactory.fromAnyRef(
83 - Assert.isNotNull(consistency, "consistency").toString()));
84 - }
85 -
86 - /**
87 - * Returns the database read consistency.
88 - *
89 - * @return The database read consistency.
90 - */
91 - public Consistency getConsistency() {
92 - return Consistency.parse(config.getString(DATABASE_CONSISTENCY));
93 - }
94 -
95 - /**
96 - * Sets the database read consistency, returning the configuration for method chaining.
97 - *
98 - * @param consistency The database read consistency.
99 - * @return The database configuration.
100 - * @throws java.lang.NullPointerException If the consistency is {@code null}
101 - */
102 - public DatabaseConfig withConsistency(String consistency) {
103 - setConsistency(consistency);
104 - return this;
105 - }
106 -
107 - /**
108 - * Sets the database read consistency, returning the configuration for method chaining.
109 - *
110 - * @param consistency The database read consistency.
111 - * @return The database configuration.
112 - * @throws java.lang.NullPointerException If the consistency is {@code null}
113 - */
114 - public DatabaseConfig withConsistency(Consistency consistency) {
115 - setConsistency(consistency);
116 - return this;
117 - }
118 -
119 - /**
120 - * Returns the database name.
121 - *
122 - * @return The database name
123 - */
124 - public String getName() {
125 - return name;
126 - }
127 -
128 - /**
129 - * Sets the database name, returning the configuration for method chaining.
130 - *
131 - * @param name The database name
132 - * @return The database configuration
133 - * @throws java.lang.NullPointerException If the name is {@code null}
134 - */
135 - public DatabaseConfig withName(String name) {
136 - setName(Assert.isNotNull(name, "name"));
137 - return this;
138 - }
139 -
140 - /**
141 - * Sets the database name.
142 - *
143 - * @param name The database name
144 - * @throws java.lang.NullPointerException If the name is {@code null}
145 - */
146 - public void setName(String name) {
147 - this.name = Assert.isNotNull(name, "name");
148 - }
149 -
150 - @Override
151 - public CoordinatedResourceConfig resolve(ClusterConfig cluster) {
152 - return new StateLogConfig(toMap())
153 - .resolve(cluster)
154 - .withResourceType(DefaultDatabase.class);
155 - }
156 -
157 -}
1 -/*
2 - * Copyright 2015 Open Networking Laboratory
3 - *
4 - * Licensed under the Apache License, Version 2.0 (the "License");
5 - * you may not use this file except in compliance with the License.
6 - * You may obtain a copy of the License at
7 - *
8 - * http://www.apache.org/licenses/LICENSE-2.0
9 - *
10 - * Unless required by applicable law or agreed to in writing, software
11 - * distributed under the License is distributed on an "AS IS" BASIS,
12 - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 - * See the License for the specific language governing permissions and
14 - * limitations under the License.
15 - */
16 -
17 -package org.onosproject.store.primitives.impl;
18 -
19 -import static com.google.common.base.Preconditions.checkState;
20 -
21 -import java.util.List;
22 -import com.google.common.base.Charsets;
23 -import com.google.common.collect.ImmutableList;
24 -import com.google.common.hash.Hashing;
25 -
26 -/**
27 - * Partitioner for mapping map entries to individual database partitions.
28 - * <p>
29 - * By default a md5 hash of the hash key (key or map name) is used to pick a
30 - * partition.
31 - */
32 -public abstract class DatabasePartitioner implements Partitioner<String> {
33 - // Database partitions sorted by their partition name.
34 - protected final List<Database> partitions;
35 -
36 - public DatabasePartitioner(List<Database> partitions) {
37 - checkState(partitions != null && !partitions.isEmpty(), "Partitions cannot be null or empty");
38 - this.partitions = ImmutableList.copyOf(partitions);
39 - }
40 -
41 - protected int hash(String key) {
42 - return Math.abs(Hashing.md5().newHasher().putBytes(key.getBytes(Charsets.UTF_8)).hash().asInt());
43 - }
44 -
45 -}
1 -/*
2 - * Copyright 2015 Open Networking Laboratory
3 - *
4 - * Licensed under the Apache License, Version 2.0 (the "License");
5 - * you may not use this file except in compliance with the License.
6 - * You may obtain a copy of the License at
7 - *
8 - * http://www.apache.org/licenses/LICENSE-2.0
9 - *
10 - * Unless required by applicable law or agreed to in writing, software
11 - * distributed under the License is distributed on an "AS IS" BASIS,
12 - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 - * See the License for the specific language governing permissions and
14 - * limitations under the License.
15 - */
16 -
17 -package org.onosproject.store.primitives.impl;
18 -
19 -import org.onlab.util.Match;
20 -import org.onosproject.store.service.Versioned;
21 -
22 -import java.util.Collection;
23 -import java.util.Map;
24 -import java.util.Set;
25 -import java.util.concurrent.CompletableFuture;
26 -
27 -/**
28 - * Database proxy.
29 - */
30 -public interface DatabaseProxy<K, V> {
31 -
32 - /**
33 - * Returns a set of all map names.
34 - *
35 - * @return A completable future to be completed with the result once complete.
36 - */
37 - CompletableFuture<Set<String>> maps();
38 -
39 - /**
40 - * Returns a mapping from counter name to next value.
41 - *
42 - * @return A completable future to be completed with the result once complete.
43 - */
44 - CompletableFuture<Map<String, Long>> counters();
45 -
46 - /**
47 - * Returns the number of entries in map.
48 - *
49 - * @param mapName map name
50 - * @return A completable future to be completed with the result once complete.
51 - */
52 - CompletableFuture<Integer> mapSize(String mapName);
53 -
54 - /**
55 - * Checks whether the map is empty.
56 - *
57 - * @param mapName map name
58 - * @return A completable future to be completed with the result once complete.
59 - */
60 - CompletableFuture<Boolean> mapIsEmpty(String mapName);
61 -
62 - /**
63 - * Checks whether the map contains a key.
64 - *
65 - * @param mapName map name
66 - * @param key key to check.
67 - * @return A completable future to be completed with the result once complete.
68 - */
69 - CompletableFuture<Boolean> mapContainsKey(String mapName, K key);
70 -
71 - /**
72 - * Checks whether the map contains a value.
73 - *
74 - * @param mapName map name
75 - * @param value The value to check.
76 - * @return A completable future to be completed with the result once complete.
77 - */
78 - CompletableFuture<Boolean> mapContainsValue(String mapName, V value);
79 -
80 - /**
81 - * Gets a value from the map.
82 - *
83 - * @param mapName map name
84 - * @param key The key to get.
85 - * @return A completable future to be completed with the result once complete.
86 - */
87 - CompletableFuture<Versioned<V>> mapGet(String mapName, K key);
88 -
89 - /**
90 - * Updates the map.
91 - *
92 - * @param mapName map name
93 - * @param key The key to set
94 - * @param valueMatch match for checking existing value
95 - * @param versionMatch match for checking existing version
96 - * @param value new value
97 - * @return A completable future to be completed with the result once complete
98 - */
99 - CompletableFuture<Result<UpdateResult<K, V>>> mapUpdate(
100 - String mapName, K key, Match<V> valueMatch, Match<Long> versionMatch, V value);
101 -
102 - /**
103 - * Clears the map.
104 - *
105 - * @param mapName map name
106 - * @return A completable future to be completed with the result once complete.
107 - */
108 - CompletableFuture<Result<Void>> mapClear(String mapName);
109 -
110 - /**
111 - * Gets a set of keys in the map.
112 - *
113 - * @param mapName map name
114 - * @return A completable future to be completed with the result once complete.
115 - */
116 - CompletableFuture<Set<K>> mapKeySet(String mapName);
117 -
118 - /**
119 - * Gets a collection of values in the map.
120 - *
121 - * @param mapName map name
122 - * @return A completable future to be completed with the result once complete.
123 - */
124 - CompletableFuture<Collection<Versioned<V>>> mapValues(String mapName);
125 -
126 - /**
127 - * Gets a set of entries in the map.
128 - *
129 - * @param mapName map name
130 - * @return A completable future to be completed with the result once complete.
131 - */
132 - CompletableFuture<Set<Map.Entry<K, Versioned<V>>>> mapEntrySet(String mapName);
133 -
134 - /**
135 - * Atomically add the given value to current value of the specified counter.
136 - *
137 - * @param counterName counter name
138 - * @param delta value to add
139 - * @return updated value
140 - */
141 - CompletableFuture<Long> counterAddAndGet(String counterName, long delta);
142 -
143 - /**
144 - * Atomically add the given value to current value of the specified counter.
145 - *
146 - * @param counterName counter name
147 - * @param delta value to add
148 - * @return previous value
149 - */
150 - CompletableFuture<Long> counterGetAndAdd(String counterName, long delta);
151 -
152 -
153 - /**
154 - * Atomically sets the given value to current value of the specified counter.
155 - *
156 - * @param counterName counter name
157 - * @param value value to set
158 - * @return void future
159 - */
160 - CompletableFuture<Void> counterSet(String counterName, long value);
161 -
162 - /**
163 - * Atomically sets the given counter to the specified update value if and only if the current value is equal to the
164 - * expected value.
165 - * @param counterName counter name
166 - * @param expectedValue value to use for equivalence check
167 - * @param update value to set if expected value is current value
168 - * @return true if an update occurred, false otherwise
169 - */
170 - CompletableFuture<Boolean> counterCompareAndSet(String counterName, long expectedValue, long update);
171 -
172 - /**
173 - * Returns the current value of the specified atomic counter.
174 - *
175 - * @param counterName counter name
176 - * @return current value
177 - */
178 - CompletableFuture<Long> counterGet(String counterName);
179 -
180 - /**
181 - * Returns the size of queue.
182 - *
183 - * @param queueName queue name
184 - * @return queue size
185 - */
186 - CompletableFuture<Long> queueSize(String queueName);
187 -
188 - /**
189 - * Inserts an entry into the queue.
190 - *
191 - * @param queueName queue name
192 - * @param entry queue entry
193 - * @return void future
194 - */
195 - CompletableFuture<Void> queuePush(String queueName, byte[] entry);
196 -
197 - /**
198 - * Removes an entry from the queue if the queue is non-empty.
199 - *
200 - * @param queueName queue name
201 - * @return entry future. Can be completed with null if queue is empty
202 - */
203 - CompletableFuture<byte[]> queuePop(String queueName);
204 -
205 - /**
206 - * Returns but does not remove an entry from the queue.
207 - *
208 - * @param queueName queue name
209 - * @return entry. Can be null if queue is empty
210 - */
211 - CompletableFuture<byte[]> queuePeek(String queueName);
212 -
213 - /**
214 - * Prepare and commit the specified transaction.
215 - *
216 - * @param transaction transaction to commit (after preparation)
217 - * @return A completable future to be completed with the result once complete
218 - */
219 - CompletableFuture<CommitResponse> prepareAndCommit(Transaction transaction);
220 -
221 - /**
222 - * Prepare the specified transaction for commit. A successful prepare implies
223 - * all the affected resources are locked thus ensuring no concurrent updates can interfere.
224 - *
225 - * @param transaction transaction to prepare (for commit)
226 - * @return A completable future to be completed with the result once complete. The future is completed
227 - * with true if the transaction is successfully prepared i.e. all pre-conditions are met and
228 - * applicable resources locked.
229 - */
230 - CompletableFuture<Boolean> prepare(Transaction transaction);
231 -
232 - /**
233 - * Commit the specified transaction. A successful commit implies
234 - * all the updates are applied, are now durable and are now visible externally.
235 - *
236 - * @param transaction transaction to commit
237 - * @return A completable future to be completed with the result once complete
238 - */
239 - CompletableFuture<CommitResponse> commit(Transaction transaction);
240 -
241 - /**
242 - * Rollback the specified transaction. A successful rollback implies
243 - * all previously acquired locks for the affected resources are released.
244 - *
245 - * @param transaction transaction to rollback
246 - * @return A completable future to be completed with the result once complete
247 - */
248 - CompletableFuture<Boolean> rollback(Transaction transaction);
249 -}
1 -/*
2 - * Copyright 2015 Open Networking Laboratory
3 - *
4 - * Licensed under the Apache License, Version 2.0 (the "License");
5 - * you may not use this file except in compliance with the License.
6 - * You may obtain a copy of the License at
7 - *
8 - * http://www.apache.org/licenses/LICENSE-2.0
9 - *
10 - * Unless required by applicable law or agreed to in writing, software
11 - * distributed under the License is distributed on an "AS IS" BASIS,
12 - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 - * See the License for the specific language governing permissions and
14 - * limitations under the License.
15 - */
16 -
17 -package org.onosproject.store.primitives.impl;
18 -
19 -import java.nio.ByteBuffer;
20 -
21 -import org.onlab.util.KryoNamespace;
22 -import org.onlab.util.Match;
23 -import org.onosproject.cluster.NodeId;
24 -import org.onosproject.store.primitives.MapUpdate;
25 -import org.onosproject.store.primitives.TransactionId;
26 -import org.onosproject.store.serializers.KryoNamespaces;
27 -import org.onosproject.store.serializers.KryoSerializer;
28 -import org.onosproject.store.service.Versioned;
29 -
30 -import net.kuujo.copycat.cluster.internal.MemberInfo;
31 -import net.kuujo.copycat.raft.protocol.AppendRequest;
32 -import net.kuujo.copycat.raft.protocol.AppendResponse;
33 -import net.kuujo.copycat.raft.protocol.CommitRequest;
34 -import net.kuujo.copycat.raft.protocol.CommitResponse;
35 -import net.kuujo.copycat.raft.protocol.PollRequest;
36 -import net.kuujo.copycat.raft.protocol.PollResponse;
37 -import net.kuujo.copycat.raft.protocol.QueryRequest;
38 -import net.kuujo.copycat.raft.protocol.QueryResponse;
39 -import net.kuujo.copycat.raft.protocol.ReplicaInfo;
40 -import net.kuujo.copycat.raft.protocol.SyncRequest;
41 -import net.kuujo.copycat.raft.protocol.SyncResponse;
42 -import net.kuujo.copycat.raft.protocol.VoteRequest;
43 -import net.kuujo.copycat.raft.protocol.VoteResponse;
44 -import net.kuujo.copycat.util.serializer.SerializerConfig;
45 -
46 -/**
47 - * Serializer for DatabaseManager's interaction with Copycat.
48 - */
49 -public class DatabaseSerializer extends SerializerConfig {
50 -
51 - private static final KryoNamespace COPYCAT = KryoNamespace.newBuilder()
52 - .nextId(KryoNamespace.FLOATING_ID)
53 - .register(AppendRequest.class)
54 - .register(AppendResponse.class)
55 - .register(SyncRequest.class)
56 - .register(SyncResponse.class)
57 - .register(VoteRequest.class)
58 - .register(VoteResponse.class)
59 - .register(PollRequest.class)
60 - .register(PollResponse.class)
61 - .register(QueryRequest.class)
62 - .register(QueryResponse.class)
63 - .register(CommitRequest.class)
64 - .register(CommitResponse.class)
65 - .register(ReplicaInfo.class)
66 - .register(MemberInfo.class)
67 - .build();
68 -
69 - private static final KryoNamespace ONOS_STORE = KryoNamespace.newBuilder()
70 - .nextId(KryoNamespace.FLOATING_ID)
71 - .register(Versioned.class)
72 - .register(MapUpdate.class)
73 - .register(MapUpdate.Type.class)
74 - .register(Result.class)
75 - .register(UpdateResult.class)
76 - .register(Result.Status.class)
77 - .register(Transaction.class)
78 - .register(Transaction.State.class)
79 - .register(TransactionId.class)
80 - .register(org.onosproject.store.primitives.impl.CommitResponse.class)
81 - .register(Match.class)
82 - .register(NodeId.class)
83 - .build();
84 -
85 - private static final KryoSerializer SERIALIZER = new KryoSerializer() {
86 - @Override
87 - protected void setupKryoPool() {
88 - serializerPool = KryoNamespace.newBuilder()
89 - .register(KryoNamespaces.BASIC)
90 - .register(COPYCAT)
91 - .register(ONOS_STORE)
92 - .build();
93 - }
94 - };
95 -
96 - @Override
97 - public ByteBuffer writeObject(Object object) {
98 - return ByteBuffer.wrap(SERIALIZER.encode(object));
99 - }
100 -
101 - @Override
102 - public <T> T readObject(ByteBuffer buffer) {
103 - return SERIALIZER.decode(buffer);
104 - }
105 -}
...\ No newline at end of file ...\ No newline at end of file
1 -/*
2 - * Copyright 2015 Open Networking Laboratory
3 - *
4 - * Licensed under the Apache License, Version 2.0 (the "License");
5 - * you may not use this file except in compliance with the License.
6 - * You may obtain a copy of the License at
7 - *
8 - * http://www.apache.org/licenses/LICENSE-2.0
9 - *
10 - * Unless required by applicable law or agreed to in writing, software
11 - * distributed under the License is distributed on an "AS IS" BASIS,
12 - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 - * See the License for the specific language governing permissions and
14 - * limitations under the License.
15 - */
16 -
17 -package org.onosproject.store.primitives.impl;
18 -
19 -import net.kuujo.copycat.state.Command;
20 -import net.kuujo.copycat.state.Initializer;
21 -import net.kuujo.copycat.state.Query;
22 -import net.kuujo.copycat.state.StateContext;
23 -
24 -import org.onlab.util.Match;
25 -import org.onosproject.store.service.Versioned;
26 -
27 -import java.util.Collection;
28 -import java.util.Map;
29 -import java.util.Map.Entry;
30 -import java.util.Set;
31 -
32 -/**
33 - * Database state.
34 - *
35 - */
36 -public interface DatabaseState<K, V> {
37 -
38 - /**
39 - * Initializes the database state.
40 - *
41 - * @param context The map state context.
42 - */
43 - @Initializer
44 - void init(StateContext<DatabaseState<K, V>> context);
45 -
46 - @Query
47 - Set<String> maps();
48 -
49 - @Query
50 - Map<String, Long> counters();
51 -
52 - @Query
53 - int mapSize(String mapName);
54 -
55 - @Query
56 - boolean mapIsEmpty(String mapName);
57 -
58 - @Query
59 - boolean mapContainsKey(String mapName, K key);
60 -
61 - @Query
62 - boolean mapContainsValue(String mapName, V value);
63 -
64 - @Query
65 - Versioned<V> mapGet(String mapName, K key);
66 -
67 - @Command
68 - Result<UpdateResult<K, V>> mapUpdate(String mapName, K key, Match<V> valueMatch, Match<Long> versionMatch, V value);
69 -
70 - @Command
71 - Result<Void> mapClear(String mapName);
72 -
73 - @Query
74 - Set<K> mapKeySet(String mapName);
75 -
76 - @Query
77 - Collection<Versioned<V>> mapValues(String mapName);
78 -
79 - @Query
80 - Set<Entry<K, Versioned<V>>> mapEntrySet(String mapName);
81 -
82 - @Command
83 - Long counterAddAndGet(String counterName, long delta);
84 -
85 - @Command
86 - Boolean counterCompareAndSet(String counterName, long expectedValue, long updateValue);
87 -
88 - @Command
89 - Long counterGetAndAdd(String counterName, long delta);
90 -
91 - @Query
92 - Long queueSize(String queueName);
93 -
94 - @Query
95 - byte[] queuePeek(String queueName);
96 -
97 - @Command
98 - byte[] queuePop(String queueName);
99 -
100 - @Command
101 - void queuePush(String queueName, byte[] entry);
102 -
103 - @Query
104 - Long counterGet(String counterName);
105 -
106 - @Command
107 - void counterSet(String counterName, long value);
108 -
109 - @Command
110 - CommitResponse prepareAndCommit(Transaction transaction);
111 -
112 - @Command
113 - boolean prepare(Transaction transaction);
114 -
115 - @Command
116 - CommitResponse commit(Transaction transaction);
117 -
118 - @Command
119 - boolean rollback(Transaction transaction);
120 -}
1 -/*
2 - * Copyright 2015 Open Networking Laboratory
3 - *
4 - * Licensed under the Apache License, Version 2.0 (the "License");
5 - * you may not use this file except in compliance with the License.
6 - * You may obtain a copy of the License at
7 - *
8 - * http://www.apache.org/licenses/LICENSE-2.0
9 - *
10 - * Unless required by applicable law or agreed to in writing, software
11 - * distributed under the License is distributed on an "AS IS" BASIS,
12 - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 - * See the License for the specific language governing permissions and
14 - * limitations under the License.
15 - */
16 -package org.onosproject.store.primitives.impl;
17 -
18 -import org.onosproject.store.service.AsyncAtomicCounter;
19 -import org.onosproject.utils.MeteringAgent;
20 -
21 -import java.util.concurrent.CompletableFuture;
22 -
23 -import static com.google.common.base.Preconditions.checkNotNull;
24 -
25 -/**
26 - * Default implementation for a distributed AsyncAtomicCounter backed by
27 - * partitioned Raft DB.
28 - * <p>
29 - * The initial value will be zero.
30 - */
31 -public class DefaultAsyncAtomicCounter implements AsyncAtomicCounter {
32 -
33 - private final String name;
34 - private final Database database;
35 - private final MeteringAgent monitor;
36 -
37 - private static final String PRIMITIVE_NAME = "atomicCounter";
38 - private static final String INCREMENT_AND_GET = "incrementAndGet";
39 - private static final String GET_AND_INCREMENT = "getAndIncrement";
40 - private static final String GET_AND_ADD = "getAndAdd";
41 - private static final String ADD_AND_GET = "addAndGet";
42 - private static final String GET = "get";
43 - private static final String SET = "set";
44 - private static final String COMPARE_AND_SET = "compareAndSet";
45 -
46 - public DefaultAsyncAtomicCounter(String name,
47 - Database database,
48 - boolean meteringEnabled) {
49 - this.name = checkNotNull(name);
50 - this.database = checkNotNull(database);
51 - this.monitor = new MeteringAgent(PRIMITIVE_NAME, name, meteringEnabled);
52 - }
53 -
54 - @Override
55 - public String name() {
56 - return name;
57 - }
58 -
59 - @Override
60 - public CompletableFuture<Long> incrementAndGet() {
61 - final MeteringAgent.Context timer = monitor.startTimer(INCREMENT_AND_GET);
62 - return addAndGet(1L)
63 - .whenComplete((r, e) -> timer.stop(e));
64 - }
65 -
66 - @Override
67 - public CompletableFuture<Long> get() {
68 - final MeteringAgent.Context timer = monitor.startTimer(GET);
69 - return database.counterGet(name)
70 - .whenComplete((r, e) -> timer.stop(e));
71 - }
72 -
73 - @Override
74 - public CompletableFuture<Long> getAndIncrement() {
75 - final MeteringAgent.Context timer = monitor.startTimer(GET_AND_INCREMENT);
76 - return getAndAdd(1L)
77 - .whenComplete((r, e) -> timer.stop(e));
78 - }
79 -
80 - @Override
81 - public CompletableFuture<Long> getAndAdd(long delta) {
82 - final MeteringAgent.Context timer = monitor.startTimer(GET_AND_ADD);
83 - return database.counterGetAndAdd(name, delta)
84 - .whenComplete((r, e) -> timer.stop(e));
85 - }
86 -
87 - @Override
88 - public CompletableFuture<Long> addAndGet(long delta) {
89 - final MeteringAgent.Context timer = monitor.startTimer(ADD_AND_GET);
90 - return database.counterAddAndGet(name, delta)
91 - .whenComplete((r, e) -> timer.stop(e));
92 - }
93 -
94 - @Override
95 - public CompletableFuture<Void> set(long value) {
96 - final MeteringAgent.Context timer = monitor.startTimer(SET);
97 - return database.counterSet(name, value)
98 - .whenComplete((r, e) -> timer.stop(e));
99 - }
100 -
101 - @Override
102 - public CompletableFuture<Boolean> compareAndSet(long expectedValue, long updateValue) {
103 - final MeteringAgent.Context timer = monitor.startTimer(COMPARE_AND_SET);
104 - return database.counterCompareAndSet(name, expectedValue, updateValue)
105 - .whenComplete((r, e) -> timer.stop(e));
106 - }
107 -}
1 -/*
2 - * Copyright 2015 Open Networking Laboratory
3 - *
4 - * Licensed under the Apache License, Version 2.0 (the "License");
5 - * you may not use this file except in compliance with the License.
6 - * You may obtain a copy of the License at
7 - *
8 - * http://www.apache.org/licenses/LICENSE-2.0
9 - *
10 - * Unless required by applicable law or agreed to in writing, software
11 - * distributed under the License is distributed on an "AS IS" BASIS,
12 - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 - * See the License for the specific language governing permissions and
14 - * limitations under the License.
15 - */
16 -package org.onosproject.store.primitives.impl;
17 -
18 -import org.onosproject.store.service.AsyncAtomicCounter;
19 -import org.onosproject.store.service.AtomicCounterBuilder;
20 -
21 -import static com.google.common.base.Preconditions.checkNotNull;
22 -
23 -/**
24 - * Default implementation of AtomicCounterBuilder.
25 - */
26 -public class DefaultAtomicCounterBuilder extends AtomicCounterBuilder {
27 -
28 - private final Database partitionedDatabase;
29 - private final Database inMemoryDatabase;
30 -
31 - public DefaultAtomicCounterBuilder(Database inMemoryDatabase, Database partitionedDatabase) {
32 - this.inMemoryDatabase = inMemoryDatabase;
33 - this.partitionedDatabase = partitionedDatabase;
34 - }
35 -
36 - @Override
37 - public AsyncAtomicCounter build() {
38 - Database database = partitionsDisabled() ? inMemoryDatabase : partitionedDatabase;
39 - return new DefaultAsyncAtomicCounter(checkNotNull(name()), database, meteringEnabled());
40 - }
41 -}
1 -/*
2 - * Copyright 2015 Open Networking Laboratory
3 - *
4 - * Licensed under the Apache License, Version 2.0 (the "License");
5 - * you may not use this file except in compliance with the License.
6 - * You may obtain a copy of the License at
7 - *
8 - * http://www.apache.org/licenses/LICENSE-2.0
9 - *
10 - * Unless required by applicable law or agreed to in writing, software
11 - * distributed under the License is distributed on an "AS IS" BASIS,
12 - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 - * See the License for the specific language governing permissions and
14 - * limitations under the License.
15 - */
16 -package org.onosproject.store.primitives.impl;
17 -
18 -import org.onosproject.store.service.AsyncConsistentMap;
19 -import org.onosproject.store.service.ConsistentMap;
20 -import org.onosproject.store.service.ConsistentMapBuilder;
21 -
22 -import static com.google.common.base.Preconditions.checkState;
23 -
24 -/**
25 - * Default Consistent Map builder.
26 - *
27 - * @param <K> type for map key
28 - * @param <V> type for map value
29 - */
30 -public class DefaultConsistentMapBuilder<K, V> extends ConsistentMapBuilder<K, V> {
31 -
32 - private final DatabaseManager manager;
33 -
34 - public DefaultConsistentMapBuilder(DatabaseManager manager) {
35 - this.manager = manager;
36 - }
37 -
38 - private void validateInputs() {
39 - checkState(name() != null, "name must be specified");
40 - checkState(serializer() != null, "serializer must be specified");
41 - if (purgeOnUninstall()) {
42 - checkState(applicationId() != null, "ApplicationId must be specified when purgeOnUninstall is enabled");
43 - }
44 - }
45 -
46 - @Override
47 - public ConsistentMap<K, V> build() {
48 - return buildAndRegisterMap().asConsistentMap();
49 - }
50 -
51 - @Override
52 - public AsyncConsistentMap<K, V> buildAsyncMap() {
53 - return buildAndRegisterMap();
54 - }
55 -
56 - private DefaultAsyncConsistentMap<K, V> buildAndRegisterMap() {
57 - validateInputs();
58 - Database database = partitionsDisabled() ? manager.inMemoryDatabase : manager.partitionedDatabase;
59 - if (relaxedReadConsistency()) {
60 - return manager.registerMap(
61 - new AsyncCachingConsistentMap<>(name(),
62 - applicationId(),
63 - database,
64 - serializer(),
65 - readOnly(),
66 - purgeOnUninstall(),
67 - meteringEnabled()));
68 - } else {
69 - return manager.registerMap(
70 - new DefaultAsyncConsistentMap<>(name(),
71 - applicationId(),
72 - database,
73 - serializer(),
74 - readOnly(),
75 - purgeOnUninstall(),
76 - meteringEnabled()));
77 - }
78 - }
79 -}
...\ No newline at end of file ...\ No newline at end of file
1 -/*
2 - * Copyright 2015 Open Networking Laboratory
3 - *
4 - * Licensed under the Apache License, Version 2.0 (the "License");
5 - * you may not use this file except in compliance with the License.
6 - * You may obtain a copy of the License at
7 - *
8 - * http://www.apache.org/licenses/LICENSE-2.0
9 - *
10 - * Unless required by applicable law or agreed to in writing, software
11 - * distributed under the License is distributed on an "AS IS" BASIS,
12 - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 - * See the License for the specific language governing permissions and
14 - * limitations under the License.
15 - */
16 -
17 -package org.onosproject.store.primitives.impl;
18 -
19 -import com.google.common.collect.Sets;
20 -
21 -import net.kuujo.copycat.resource.internal.AbstractResource;
22 -import net.kuujo.copycat.resource.internal.ResourceManager;
23 -import net.kuujo.copycat.state.StateMachine;
24 -import net.kuujo.copycat.state.internal.DefaultStateMachine;
25 -import net.kuujo.copycat.util.concurrent.Futures;
26 -import net.kuujo.copycat.util.function.TriConsumer;
27 -
28 -import org.onlab.util.Match;
29 -import org.onosproject.store.service.Versioned;
30 -
31 -import java.util.Collection;
32 -import java.util.Map;
33 -import java.util.Set;
34 -import java.util.concurrent.CompletableFuture;
35 -import java.util.function.Consumer;
36 -import java.util.function.Supplier;
37 -
38 -/**
39 - * Default database.
40 - */
41 -public class DefaultDatabase extends AbstractResource<Database> implements Database {
42 - private final StateMachine<DatabaseState<String, byte[]>> stateMachine;
43 - private DatabaseProxy<String, byte[]> proxy;
44 - private final Set<Consumer<StateMachineUpdate>> consumers = Sets.newCopyOnWriteArraySet();
45 - private final TriConsumer<String, Object, Object> watcher = new InternalStateMachineWatcher();
46 -
47 - @SuppressWarnings({"unchecked", "rawtypes"})
48 - public DefaultDatabase(ResourceManager context) {
49 - super(context);
50 - this.stateMachine = new DefaultStateMachine(context,
51 - DatabaseState.class,
52 - DefaultDatabaseState.class,
53 - DefaultDatabase.class.getClassLoader());
54 - this.stateMachine.addStartupTask(() -> {
55 - stateMachine.registerWatcher(watcher);
56 - return CompletableFuture.completedFuture(null);
57 - });
58 - this.stateMachine.addShutdownTask(() -> {
59 - stateMachine.unregisterWatcher(watcher);
60 - return CompletableFuture.completedFuture(null);
61 - });
62 - }
63 -
64 - /**
65 - * If the database is closed, returning a failed CompletableFuture. Otherwise, calls the given supplier to
66 - * return the completed future result.
67 - *
68 - * @param supplier The supplier to call if the database is open.
69 - * @param <T> The future result type.
70 - * @return A completable future that if this database is closed is immediately failed.
71 - */
72 - protected <T> CompletableFuture<T> checkOpen(Supplier<CompletableFuture<T>> supplier) {
73 - if (proxy == null) {
74 - return Futures.exceptionalFuture(new IllegalStateException("Database closed"));
75 - }
76 - return supplier.get();
77 - }
78 -
79 - @Override
80 - public CompletableFuture<Set<String>> maps() {
81 - return checkOpen(() -> proxy.maps());
82 - }
83 -
84 - @Override
85 - public CompletableFuture<Map<String, Long>> counters() {
86 - return checkOpen(() -> proxy.counters());
87 - }
88 -
89 - @Override
90 - public CompletableFuture<Integer> mapSize(String mapName) {
91 - return checkOpen(() -> proxy.mapSize(mapName));
92 - }
93 -
94 - @Override
95 - public CompletableFuture<Boolean> mapIsEmpty(String mapName) {
96 - return checkOpen(() -> proxy.mapIsEmpty(mapName));
97 - }
98 -
99 - @Override
100 - public CompletableFuture<Boolean> mapContainsKey(String mapName, String key) {
101 - return checkOpen(() -> proxy.mapContainsKey(mapName, key));
102 - }
103 -
104 - @Override
105 - public CompletableFuture<Boolean> mapContainsValue(String mapName, byte[] value) {
106 - return checkOpen(() -> proxy.mapContainsValue(mapName, value));
107 - }
108 -
109 - @Override
110 - public CompletableFuture<Versioned<byte[]>> mapGet(String mapName, String key) {
111 - return checkOpen(() -> proxy.mapGet(mapName, key));
112 - }
113 -
114 - @Override
115 - public CompletableFuture<Result<UpdateResult<String, byte[]>>> mapUpdate(
116 - String mapName, String key, Match<byte[]> valueMatch, Match<Long> versionMatch, byte[] value) {
117 - return checkOpen(() -> proxy.mapUpdate(mapName, key, valueMatch, versionMatch, value));
118 - }
119 -
120 - @Override
121 - public CompletableFuture<Result<Void>> mapClear(String mapName) {
122 - return checkOpen(() -> proxy.mapClear(mapName));
123 - }
124 -
125 - @Override
126 - public CompletableFuture<Set<String>> mapKeySet(String mapName) {
127 - return checkOpen(() -> proxy.mapKeySet(mapName));
128 - }
129 -
130 - @Override
131 - public CompletableFuture<Collection<Versioned<byte[]>>> mapValues(String mapName) {
132 - return checkOpen(() -> proxy.mapValues(mapName));
133 - }
134 -
135 - @Override
136 - public CompletableFuture<Set<Map.Entry<String, Versioned<byte[]>>>> mapEntrySet(String mapName) {
137 - return checkOpen(() -> proxy.mapEntrySet(mapName));
138 - }
139 -
140 - @Override
141 - public CompletableFuture<Long> counterGet(String counterName) {
142 - return checkOpen(() -> proxy.counterGet(counterName));
143 - }
144 -
145 - @Override
146 - public CompletableFuture<Long> counterAddAndGet(String counterName, long delta) {
147 - return checkOpen(() -> proxy.counterAddAndGet(counterName, delta));
148 - }
149 -
150 - @Override
151 - public CompletableFuture<Long> counterGetAndAdd(String counterName, long delta) {
152 - return checkOpen(() -> proxy.counterGetAndAdd(counterName, delta));
153 - }
154 -
155 - @Override
156 - public CompletableFuture<Void> counterSet(String counterName, long value) {
157 - return checkOpen(() -> proxy.counterSet(counterName, value));
158 - }
159 -
160 - @Override
161 - public CompletableFuture<Boolean> counterCompareAndSet(String counterName, long expectedValue, long update) {
162 - return checkOpen(() -> proxy.counterCompareAndSet(counterName, expectedValue, update));
163 - }
164 -
165 - @Override
166 - public CompletableFuture<Long> queueSize(String queueName) {
167 - return checkOpen(() -> proxy.queueSize(queueName));
168 - }
169 -
170 - @Override
171 - public CompletableFuture<Void> queuePush(String queueName, byte[] entry) {
172 - return checkOpen(() -> proxy.queuePush(queueName, entry));
173 - }
174 -
175 - @Override
176 - public CompletableFuture<byte[]> queuePop(String queueName) {
177 - return checkOpen(() -> proxy.queuePop(queueName));
178 - }
179 -
180 - @Override
181 - public CompletableFuture<byte[]> queuePeek(String queueName) {
182 - return checkOpen(() -> proxy.queuePeek(queueName));
183 - }
184 -
185 - @Override
186 - public CompletableFuture<CommitResponse> prepareAndCommit(Transaction transaction) {
187 - return checkOpen(() -> proxy.prepareAndCommit(transaction));
188 - }
189 -
190 - @Override
191 - public CompletableFuture<Boolean> prepare(Transaction transaction) {
192 - return checkOpen(() -> proxy.prepare(transaction));
193 - }
194 -
195 - @Override
196 - public CompletableFuture<CommitResponse> commit(Transaction transaction) {
197 - return checkOpen(() -> proxy.commit(transaction));
198 - }
199 -
200 - @Override
201 - public CompletableFuture<Boolean> rollback(Transaction transaction) {
202 - return checkOpen(() -> proxy.rollback(transaction));
203 - }
204 -
205 - @Override
206 - @SuppressWarnings("unchecked")
207 - public synchronized CompletableFuture<Database> open() {
208 - return runStartupTasks()
209 - .thenCompose(v -> stateMachine.open())
210 - .thenRun(() -> {
211 - this.proxy = stateMachine.createProxy(DatabaseProxy.class, this.getClass().getClassLoader());
212 - })
213 - .thenApply(v -> null);
214 - }
215 -
216 - @Override
217 - public synchronized CompletableFuture<Void> close() {
218 - proxy = null;
219 - return stateMachine.close()
220 - .thenCompose(v -> runShutdownTasks());
221 - }
222 -
223 - @Override
224 - public int hashCode() {
225 - return name().hashCode();
226 - }
227 -
228 - @Override
229 - public boolean equals(Object other) {
230 - if (other instanceof Database) {
231 - return name().equals(((Database) other).name());
232 - }
233 - return false;
234 - }
235 -
236 - @Override
237 - public void registerConsumer(Consumer<StateMachineUpdate> consumer) {
238 - consumers.add(consumer);
239 - }
240 -
241 - @Override
242 - public void unregisterConsumer(Consumer<StateMachineUpdate> consumer) {
243 - consumers.remove(consumer);
244 - }
245 -
246 - private class InternalStateMachineWatcher implements TriConsumer<String, Object, Object> {
247 - @Override
248 - public void accept(String name, Object input, Object output) {
249 - StateMachineUpdate update = new StateMachineUpdate(name, input, output);
250 - consumers.forEach(consumer -> consumer.accept(update));
251 - }
252 - }
253 -}
1 -/*
2 - * Copyright 2015 Open Networking Laboratory
3 - *
4 - * Licensed under the Apache License, Version 2.0 (the "License");
5 - * you may not use this file except in compliance with the License.
6 - * You may obtain a copy of the License at
7 - *
8 - * http://www.apache.org/licenses/LICENSE-2.0
9 - *
10 - * Unless required by applicable law or agreed to in writing, software
11 - * distributed under the License is distributed on an "AS IS" BASIS,
12 - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 - * See the License for the specific language governing permissions and
14 - * limitations under the License.
15 - */
16 -package org.onosproject.store.primitives.impl;
17 -
18 -import com.google.common.collect.Sets;
19 -import com.google.common.util.concurrent.Futures;
20 -
21 -import org.onlab.util.SharedExecutors;
22 -import org.onosproject.store.service.DistributedPrimitive;
23 -import org.onosproject.store.service.DistributedQueue;
24 -import org.onosproject.store.service.Serializer;
25 -import org.onosproject.utils.MeteringAgent;
26 -
27 -import java.util.List;
28 -import java.util.Set;
29 -import java.util.concurrent.CompletableFuture;
30 -
31 -import static com.google.common.base.Preconditions.checkNotNull;
32 -import static org.onosproject.store.primitives.impl.StateMachineUpdate.Target.QUEUE_PUSH;
33 -
34 -/**
35 - * DistributedQueue implementation that provides FIFO ordering semantics.
36 - *
37 - * @param <E> queue entry type
38 - */
39 -public class DefaultDistributedQueue<E> implements DistributedQueue<E> {
40 -
41 - private final String name;
42 - private final Database database;
43 - private final Serializer serializer;
44 - private final Set<CompletableFuture<E>> pendingFutures = Sets.newIdentityHashSet();
45 -
46 - private static final String PRIMITIVE_NAME = "distributedQueue";
47 - private static final String SIZE = "size";
48 - private static final String PUSH = "push";
49 - private static final String POP = "pop";
50 - private static final String PEEK = "peek";
51 -
52 - private static final String ERROR_NULL_ENTRY = "Null entries are not allowed";
53 - private final MeteringAgent monitor;
54 -
55 - public DefaultDistributedQueue(String name,
56 - Database database,
57 - Serializer serializer,
58 - boolean meteringEnabled) {
59 - this.name = checkNotNull(name, "queue name cannot be null");
60 - this.database = checkNotNull(database, "database cannot be null");
61 - this.serializer = checkNotNull(serializer, "serializer cannot be null");
62 - this.monitor = new MeteringAgent(PRIMITIVE_NAME, name, meteringEnabled);
63 - this.database.registerConsumer(update -> {
64 - SharedExecutors.getSingleThreadExecutor().execute(() -> {
65 - if (update.target() == QUEUE_PUSH) {
66 - List<Object> input = update.input();
67 - String queueName = (String) input.get(0);
68 - if (queueName.equals(name)) {
69 - tryPoll();
70 - }
71 - }
72 - });
73 - });
74 - }
75 -
76 - @Override
77 - public long size() {
78 - final MeteringAgent.Context timer = monitor.startTimer(SIZE);
79 - return Futures.getUnchecked(database.queueSize(name).whenComplete((r, e) -> timer.stop(e)));
80 - }
81 -
82 - @Override
83 - public void push(E entry) {
84 - checkNotNull(entry, ERROR_NULL_ENTRY);
85 - final MeteringAgent.Context timer = monitor.startTimer(PUSH);
86 - Futures.getUnchecked(database.queuePush(name, serializer.encode(entry))
87 - .whenComplete((r, e) -> timer.stop(e)));
88 - }
89 -
90 - @Override
91 - public CompletableFuture<E> pop() {
92 - final MeteringAgent.Context timer = monitor.startTimer(POP);
93 - return database.queuePop(name)
94 - .whenComplete((r, e) -> timer.stop(e))
95 - .thenCompose(v -> {
96 - if (v != null) {
97 - return CompletableFuture.<E>completedFuture(serializer.decode(v));
98 - }
99 - CompletableFuture<E> newPendingFuture = new CompletableFuture<>();
100 - pendingFutures.add(newPendingFuture);
101 - return newPendingFuture;
102 - });
103 -
104 - }
105 -
106 - @Override
107 - public E peek() {
108 - final MeteringAgent.Context timer = monitor.startTimer(PEEK);
109 - return Futures.getUnchecked(database.queuePeek(name)
110 - .thenApply(v -> v != null ? serializer.<E>decode(v) : null)
111 - .whenComplete((r, e) -> timer.stop(e)));
112 - }
113 -
114 - @Override
115 - public String name() {
116 - return name;
117 - }
118 -
119 - @Override
120 - public DistributedPrimitive.Type primitiveType() {
121 - return DistributedPrimitive.Type.QUEUE;
122 - }
123 -
124 - protected void tryPoll() {
125 - Set<CompletableFuture<E>> completedFutures = Sets.newHashSet();
126 - for (CompletableFuture<E> future : pendingFutures) {
127 - E entry = Futures.getUnchecked(database.queuePop(name)
128 - .thenApply(v -> v != null ? serializer.decode(v) : null));
129 - if (entry != null) {
130 - future.complete(entry);
131 - completedFutures.add(future);
132 - } else {
133 - break;
134 - }
135 - }
136 - pendingFutures.removeAll(completedFutures);
137 - }
138 -}
...\ No newline at end of file ...\ No newline at end of file
1 -/*
2 - * Copyright 2015 Open Networking Laboratory
3 - *
4 - * Licensed under the Apache License, Version 2.0 (the "License");
5 - * you may not use this file except in compliance with the License.
6 - * You may obtain a copy of the License at
7 - *
8 - * http://www.apache.org/licenses/LICENSE-2.0
9 - *
10 - * Unless required by applicable law or agreed to in writing, software
11 - * distributed under the License is distributed on an "AS IS" BASIS,
12 - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 - * See the License for the specific language governing permissions and
14 - * limitations under the License.
15 - */
16 -package org.onosproject.store.primitives.impl;
17 -
18 -import org.onosproject.store.service.DistributedQueue;
19 -import org.onosproject.store.service.DistributedQueueBuilder;
20 -import org.onosproject.store.service.Serializer;
21 -
22 -import static com.google.common.base.Preconditions.checkArgument;
23 -import static com.google.common.base.Preconditions.checkState;
24 -
25 -/**
26 - * Default implementation of a {@code DistributedQueueBuilder}.
27 - *
28 - * @param <E> queue entry type
29 - */
30 -public class DefaultDistributedQueueBuilder<E> implements DistributedQueueBuilder<E> {
31 -
32 - private Serializer serializer;
33 - private String name;
34 - private boolean persistenceEnabled = true;
35 - private final DatabaseManager databaseManager;
36 - private boolean metering = true;
37 -
38 - public DefaultDistributedQueueBuilder(DatabaseManager databaseManager) {
39 - this.databaseManager = databaseManager;
40 - }
41 -
42 - @Override
43 - public DistributedQueueBuilder<E> withName(String name) {
44 - checkArgument(name != null && !name.isEmpty());
45 - this.name = name;
46 - return this;
47 - }
48 -
49 - @Override
50 - public DistributedQueueBuilder<E> withSerializer(Serializer serializer) {
51 - checkArgument(serializer != null);
52 - this.serializer = serializer;
53 - return this;
54 - }
55 -
56 - @Override
57 - public DistributedQueueBuilder<E> withMeteringDisabled() {
58 - metering = false;
59 - return this;
60 - }
61 -
62 - @Override
63 - public DistributedQueueBuilder<E> withPersistenceDisabled() {
64 - persistenceEnabled = false;
65 - return this;
66 - }
67 -
68 - private boolean validInputs() {
69 - return name != null && serializer != null;
70 - }
71 -
72 - @Override
73 - public DistributedQueue<E> build() {
74 - checkState(validInputs());
75 - return new DefaultDistributedQueue<>(
76 - name,
77 - persistenceEnabled ? databaseManager.partitionedDatabase : databaseManager.inMemoryDatabase,
78 - serializer,
79 - metering);
80 - }
81 -}
1 -/*
2 - * Copyright 2015 Open Networking Laboratory
3 - *
4 - * Licensed under the Apache License, Version 2.0 (the "License");
5 - * you may not use this file except in compliance with the License.
6 - * You may obtain a copy of the License at
7 - *
8 - * http://www.apache.org/licenses/LICENSE-2.0
9 - *
10 - * Unless required by applicable law or agreed to in writing, software
11 - * distributed under the License is distributed on an "AS IS" BASIS,
12 - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 - * See the License for the specific language governing permissions and
14 - * limitations under the License.
15 - */
16 -
17 -package org.onosproject.store.primitives.impl;
18 -
19 -import java.util.List;
20 -import java.util.Map;
21 -import java.util.concurrent.CompletableFuture;
22 -import java.util.function.Function;
23 -import java.util.function.Supplier;
24 -
25 -import static com.google.common.base.Preconditions.*;
26 -
27 -import org.onosproject.store.primitives.MapUpdate;
28 -import org.onosproject.store.primitives.TransactionId;
29 -import org.onosproject.store.primitives.resources.impl.CommitResult;
30 -import org.onosproject.store.service.CommitStatus;
31 -import org.onosproject.store.service.ConsistentMapBuilder;
32 -import org.onosproject.store.service.Serializer;
33 -import org.onosproject.store.service.TransactionContext;
34 -import org.onosproject.store.service.TransactionalMap;
35 -
36 -import com.google.common.base.MoreObjects;
37 -import com.google.common.base.MoreObjects.ToStringHelper;
38 -import com.google.common.collect.Lists;
39 -import com.google.common.collect.Maps;
40 -import com.google.common.util.concurrent.Futures;
41 -
42 -/**
43 - * Default TransactionContext implementation.
44 - */
45 -public class DefaultTransactionContext implements TransactionContext {
46 - private static final String TX_NOT_OPEN_ERROR = "Transaction Context is not open";
47 -
48 - @SuppressWarnings("rawtypes")
49 - private final Map<String, DefaultTransactionalMap> txMaps = Maps.newConcurrentMap();
50 - private boolean isOpen = false;
51 - private final Function<Transaction, CompletableFuture<CommitResult>> transactionCommitter;
52 - private final TransactionId transactionId;
53 - private final Supplier<ConsistentMapBuilder> mapBuilderSupplier;
54 -
55 - public DefaultTransactionContext(TransactionId transactionId,
56 - Function<Transaction, CompletableFuture<CommitResult>> transactionCommitter,
57 - Supplier<ConsistentMapBuilder> mapBuilderSupplier) {
58 - this.transactionId = transactionId;
59 - this.transactionCommitter = checkNotNull(transactionCommitter);
60 - this.mapBuilderSupplier = checkNotNull(mapBuilderSupplier);
61 - }
62 -
63 - @Override
64 - public TransactionId transactionId() {
65 - return transactionId;
66 - }
67 -
68 - @Override
69 - public void begin() {
70 - checkState(!isOpen, "Transaction Context is already open");
71 - isOpen = true;
72 - }
73 -
74 - @Override
75 - public boolean isOpen() {
76 - return isOpen;
77 - }
78 -
79 - @Override
80 - @SuppressWarnings("unchecked")
81 - public <K, V> TransactionalMap<K, V> getTransactionalMap(String mapName,
82 - Serializer serializer) {
83 - checkState(isOpen, TX_NOT_OPEN_ERROR);
84 - checkNotNull(mapName);
85 - checkNotNull(serializer);
86 - return txMaps.computeIfAbsent(mapName, name -> {
87 - ConsistentMapBuilder mapBuilder = (ConsistentMapBuilder) mapBuilderSupplier.get()
88 - .withName(name)
89 - .withSerializer(serializer);
90 - return new DefaultTransactionalMap<>(
91 - name,
92 - mapBuilder.buildAsyncMap(),
93 - this,
94 - serializer);
95 - });
96 - }
97 -
98 - @SuppressWarnings("unchecked")
99 - @Override
100 - public CompletableFuture<CommitStatus> commit() {
101 - // TODO: rework commit implementation to be more intuitive
102 - checkState(isOpen, TX_NOT_OPEN_ERROR);
103 - CommitStatus status;
104 - try {
105 - List<MapUpdate<String, byte[]>> updates = Lists.newLinkedList();
106 - txMaps.values().forEach(m -> updates.addAll(m.toMapUpdates()));
107 - Transaction transaction = new Transaction(transactionId, updates);
108 - status = Futures.getUnchecked(transactionCommitter.apply(transaction)) == CommitResult.OK
109 - ? CommitStatus.SUCCESS : CommitStatus.FAILURE;
110 - } catch (Exception e) {
111 - abort();
112 - status = CommitStatus.FAILURE;
113 - } finally {
114 - isOpen = false;
115 - }
116 - return CompletableFuture.completedFuture(status);
117 - }
118 -
119 - @Override
120 - public void abort() {
121 - if (isOpen) {
122 - try {
123 - txMaps.values().forEach(m -> m.abort());
124 - } finally {
125 - isOpen = false;
126 - }
127 - }
128 - }
129 -
130 - @Override
131 - public String toString() {
132 - ToStringHelper s = MoreObjects.toStringHelper(this)
133 - .add("transactionId", transactionId)
134 - .add("isOpen", isOpen);
135 -
136 - txMaps.entrySet().forEach(e -> {
137 - s.add(e.getKey(), e.getValue());
138 - });
139 - return s.toString();
140 - }
141 -
142 - @Override
143 - public String name() {
144 - return transactionId.toString();
145 - }
146 -}
1 -/*
2 - * Copyright 2015 Open Networking Laboratory
3 - *
4 - * Licensed under the Apache License, Version 2.0 (the "License");
5 - * you may not use this file except in compliance with the License.
6 - * You may obtain a copy of the License at
7 - *
8 - * http://www.apache.org/licenses/LICENSE-2.0
9 - *
10 - * Unless required by applicable law or agreed to in writing, software
11 - * distributed under the License is distributed on an "AS IS" BASIS,
12 - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 - * See the License for the specific language governing permissions and
14 - * limitations under the License.
15 - */
16 -package org.onosproject.store.primitives.impl;
17 -
18 -import java.util.concurrent.CompletableFuture;
19 -import java.util.function.Function;
20 -import java.util.function.Supplier;
21 -
22 -import org.onosproject.store.primitives.TransactionId;
23 -import org.onosproject.store.primitives.resources.impl.CommitResult;
24 -import org.onosproject.store.service.ConsistentMapBuilder;
25 -import org.onosproject.store.service.TransactionContext;
26 -import org.onosproject.store.service.TransactionContextBuilder;
27 -
28 -/**
29 - * The default implementation of a transaction context builder. This builder
30 - * generates a {@link DefaultTransactionContext}.
31 - */
32 -public class DefaultTransactionContextBuilder extends TransactionContextBuilder {
33 -
34 - private final Supplier<ConsistentMapBuilder> mapBuilderSupplier;
35 - private final Function<Transaction, CompletableFuture<CommitResult>> transactionCommitter;
36 - private final TransactionId transactionId;
37 -
38 - public DefaultTransactionContextBuilder(Supplier<ConsistentMapBuilder> mapBuilderSupplier,
39 - Function<Transaction, CompletableFuture<CommitResult>> transactionCommiter,
40 - TransactionId transactionId) {
41 - this.mapBuilderSupplier = mapBuilderSupplier;
42 - this.transactionCommitter = transactionCommiter;
43 - this.transactionId = transactionId;
44 - }
45 -
46 - @Override
47 - public TransactionContext build() {
48 - return new DefaultTransactionContext(transactionId, transactionCommitter, () -> {
49 - ConsistentMapBuilder mapBuilder = mapBuilderSupplier.get();
50 - if (partitionsDisabled()) {
51 - mapBuilder = (ConsistentMapBuilder) mapBuilder.withPartitionsDisabled();
52 - }
53 - return mapBuilder;
54 - });
55 - }
56 -}
1 -/*
2 - * Copyright 2015 Open Networking Laboratory
3 - *
4 - * Licensed under the Apache License, Version 2.0 (the "License");
5 - * you may not use this file except in compliance with the License.
6 - * You may obtain a copy of the License at
7 - *
8 - * http://www.apache.org/licenses/LICENSE-2.0
9 - *
10 - * Unless required by applicable law or agreed to in writing, software
11 - * distributed under the License is distributed on an "AS IS" BASIS,
12 - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 - * See the License for the specific language governing permissions and
14 - * limitations under the License.
15 - */
16 -package org.onosproject.store.primitives.impl;
17 -
18 -import java.util.Arrays;
19 -import java.util.Collection;
20 -import java.util.Iterator;
21 -import java.util.Set;
22 -import java.util.function.Function;
23 -import java.util.stream.Collectors;
24 -
25 -import com.google.common.collect.Iterators;
26 -
27 -/**
28 - * Set view backed by Set with element type {@code <BACK>} but returns
29 - * element as {@code <OUT>} for convenience.
30 - *
31 - * @param <BACK> Backing {@link Set} element type.
32 - * MappingSet will follow this type's equality behavior.
33 - * @param <OUT> external facing element type.
34 - * MappingSet will ignores equality defined by this type.
35 - */
36 -class MappingSet<BACK, OUT> implements Set<OUT> {
37 -
38 - private final Set<BACK> backedSet;
39 - private final Function<OUT, BACK> toBack;
40 - private final Function<BACK, OUT> toOut;
41 -
42 - public MappingSet(Set<BACK> backedSet,
43 - Function<Set<BACK>, Set<BACK>> supplier,
44 - Function<OUT, BACK> toBack, Function<BACK, OUT> toOut) {
45 - this.backedSet = supplier.apply(backedSet);
46 - this.toBack = toBack;
47 - this.toOut = toOut;
48 - }
49 -
50 - @Override
51 - public int size() {
52 - return backedSet.size();
53 - }
54 -
55 - @Override
56 - public boolean isEmpty() {
57 - return backedSet.isEmpty();
58 - }
59 -
60 - @Override
61 - public boolean contains(Object o) {
62 - return backedSet.contains(toBack.apply((OUT) o));
63 - }
64 -
65 - @Override
66 - public Iterator<OUT> iterator() {
67 - return Iterators.transform(backedSet.iterator(), toOut::apply);
68 - }
69 -
70 - @Override
71 - public Object[] toArray() {
72 - return backedSet.stream()
73 - .map(toOut)
74 - .toArray();
75 - }
76 -
77 - @Override
78 - public <T> T[] toArray(T[] a) {
79 - return backedSet.stream()
80 - .map(toOut)
81 - .toArray(size -> {
82 - if (size < a.length) {
83 - return (T[]) new Object[size];
84 - } else {
85 - Arrays.fill(a, null);
86 - return a;
87 - }
88 - });
89 - }
90 -
91 - @Override
92 - public boolean add(OUT e) {
93 - return backedSet.add(toBack.apply(e));
94 - }
95 -
96 - @Override
97 - public boolean remove(Object o) {
98 - return backedSet.remove(toBack.apply((OUT) o));
99 - }
100 -
101 - @Override
102 - public boolean containsAll(Collection<?> c) {
103 - return c.stream()
104 - .map(e -> toBack.apply((OUT) e))
105 - .allMatch(backedSet::contains);
106 - }
107 -
108 - @Override
109 - public boolean addAll(Collection<? extends OUT> c) {
110 - return backedSet.addAll(c.stream().map(toBack).collect(Collectors.toList()));
111 - }
112 -
113 - @Override
114 - public boolean retainAll(Collection<?> c) {
115 - return backedSet.retainAll(c.stream()
116 - .map(x -> toBack.apply((OUT) x))
117 - .collect(Collectors.toList()));
118 - }
119 -
120 - @Override
121 - public boolean removeAll(Collection<?> c) {
122 - return backedSet.removeAll(c.stream()
123 - .map(x -> toBack.apply((OUT) x))
124 - .collect(Collectors.toList()));
125 - }
126 -
127 - @Override
128 - public void clear() {
129 - backedSet.clear();
130 - }
131 -}
1 -/*
2 - * Copyright 2015 Open Networking Laboratory
3 - *
4 - * Licensed under the Apache License, Version 2.0 (the "License");
5 - * you may not use this file except in compliance with the License.
6 - * You may obtain a copy of the License at
7 - *
8 - * http://www.apache.org/licenses/LICENSE-2.0
9 - *
10 - * Unless required by applicable law or agreed to in writing, software
11 - * distributed under the License is distributed on an "AS IS" BASIS,
12 - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 - * See the License for the specific language governing permissions and
14 - * limitations under the License.
15 - */
16 -
17 -package org.onosproject.store.primitives.impl;
18 -
19 -/**
20 - * Partitioner is responsible for mapping keys to individual database partitions.
21 - *
22 - * @param <K> key type.
23 - */
24 -public interface Partitioner<K> {
25 -
26 - /**
27 - * Returns the database partition.
28 - * @param mapName map name
29 - * @param key key
30 - * @return Database partition
31 - */
32 - Database getPartition(String mapName, K key);
33 -}
1 -/*
2 - * Copyright 2015 Open Networking Laboratory
3 - *
4 - * Licensed under the Apache License, Version 2.0 (the "License");
5 - * you may not use this file except in compliance with the License.
6 - * You may obtain a copy of the License at
7 - *
8 - * http://www.apache.org/licenses/LICENSE-2.0
9 - *
10 - * Unless required by applicable law or agreed to in writing, software
11 - * distributed under the License is distributed on an "AS IS" BASIS,
12 - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 - * See the License for the specific language governing permissions and
14 - * limitations under the License.
15 - */
16 -package org.onosproject.store.primitives.impl;
17 -
18 -import static com.google.common.base.MoreObjects.toStringHelper;
19 -
20 -import java.util.Objects;
21 -
22 -/**
23 - * Result of a database update operation.
24 - *
25 - * @param <V> return value type
26 - */
27 -public final class Result<V> {
28 -
29 - public enum Status {
30 - /**
31 - * Indicates a successful update.
32 - */
33 - OK,
34 -
35 - /**
36 - * Indicates a failure due to underlying state being locked by another transaction.
37 - */
38 - LOCKED
39 - }
40 -
41 - private final Status status;
42 - private final V value;
43 -
44 - /**
45 - * Creates a new Result instance with the specified value with status set to Status.OK.
46 - *
47 - * @param <V> result value type
48 - * @param value result value
49 - * @return Result instance
50 - */
51 - public static <V> Result<V> ok(V value) {
52 - return new Result<>(value, Status.OK);
53 - }
54 -
55 - /**
56 - * Creates a new Result instance with status set to Status.LOCKED.
57 - *
58 - * @param <V> result value type
59 - * @return Result instance
60 - */
61 - public static <V> Result<V> locked() {
62 - return new Result<>(null, Status.LOCKED);
63 - }
64 -
65 - private Result(V value, Status status) {
66 - this.value = value;
67 - this.status = status;
68 - }
69 -
70 - /**
71 - * Returns true if this result indicates a successful execution i.e status is Status.OK.
72 - *
73 - * @return true if successful, false otherwise
74 - */
75 - public boolean success() {
76 - return status == Status.OK;
77 - }
78 -
79 - /**
80 - * Returns the status of database update operation.
81 - *
82 - * @return database update status
83 - */
84 - public Status status() {
85 - return status;
86 - }
87 -
88 - /**
89 - * Returns the return value for the update.
90 - *
91 - * @return value returned by database update. If the status is another
92 - * other than Status.OK, this returns a null
93 - */
94 - public V value() {
95 - return value;
96 - }
97 -
98 - @Override
99 - public int hashCode() {
100 - return Objects.hash(value, status);
101 - }
102 -
103 - @SuppressWarnings("unchecked")
104 - @Override
105 - public boolean equals(Object other) {
106 - if (!(other instanceof Result)) {
107 - return false;
108 - }
109 - Result<V> that = (Result<V>) other;
110 - return Objects.equals(this.value, that.value) &&
111 - Objects.equals(this.status, that.status);
112 - }
113 -
114 - @Override
115 - public String toString() {
116 - return toStringHelper(this)
117 - .add("status", status)
118 - .add("value", value)
119 - .toString();
120 - }
121 -}
...\ No newline at end of file ...\ No newline at end of file
1 -/*
2 - * Copyright 2015 Open Networking Laboratory
3 - *
4 - * Licensed under the Apache License, Version 2.0 (the "License");
5 - * you may not use this file except in compliance with the License.
6 - * You may obtain a copy of the License at
7 - *
8 - * http://www.apache.org/licenses/LICENSE-2.0
9 - *
10 - * Unless required by applicable law or agreed to in writing, software
11 - * distributed under the License is distributed on an "AS IS" BASIS,
12 - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 - * See the License for the specific language governing permissions and
14 - * limitations under the License.
15 - */
16 -
17 -package org.onosproject.store.primitives.impl;
18 -
19 -import java.util.List;
20 -
21 -/**
22 - * A simple Partitioner for mapping keys to database partitions.
23 - * <p>
24 - * This class uses a md5 hash based hashing scheme for hashing the key to
25 - * a partition.
26 - *
27 - */
28 -public class SimpleKeyHashPartitioner extends DatabasePartitioner {
29 -
30 - public SimpleKeyHashPartitioner(List<Database> partitions) {
31 - super(partitions);
32 - }
33 -
34 - @Override
35 - public Database getPartition(String mapName, String key) {
36 - return partitions.get(hash(key) % partitions.size());
37 - }
38 -}
...\ No newline at end of file ...\ No newline at end of file
1 -/*
2 - * Copyright 2015 Open Networking Laboratory
3 - *
4 - * Licensed under the Apache License, Version 2.0 (the "License");
5 - * you may not use this file except in compliance with the License.
6 - * You may obtain a copy of the License at
7 - *
8 - * http://www.apache.org/licenses/LICENSE-2.0
9 - *
10 - * Unless required by applicable law or agreed to in writing, software
11 - * distributed under the License is distributed on an "AS IS" BASIS,
12 - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 - * See the License for the specific language governing permissions and
14 - * limitations under the License.
15 - */
16 -
17 -package org.onosproject.store.primitives.impl;
18 -
19 -import java.util.List;
20 -
21 -/**
22 - * A simple Partitioner that uses the map name hash to
23 - * pick a partition.
24 - * <p>
25 - * This class uses a md5 hash based hashing scheme for hashing the map name to
26 - * a partition. This partitioner maps all keys for a map to the same database
27 - * partition.
28 - */
29 -public class SimpleTableHashPartitioner extends DatabasePartitioner {
30 -
31 - public SimpleTableHashPartitioner(List<Database> partitions) {
32 - super(partitions);
33 - }
34 -
35 - @Override
36 - public Database getPartition(String mapName, String key) {
37 - return partitions.get(hash(mapName) % partitions.size());
38 - }
39 -}
1 -/*
2 - * Copyright 2015 Open Networking Laboratory
3 - *
4 - * Licensed under the Apache License, Version 2.0 (the "License");
5 - * you may not use this file except in compliance with the License.
6 - * You may obtain a copy of the License at
7 - *
8 - * http://www.apache.org/licenses/LICENSE-2.0
9 - *
10 - * Unless required by applicable law or agreed to in writing, software
11 - * distributed under the License is distributed on an "AS IS" BASIS,
12 - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 - * See the License for the specific language governing permissions and
14 - * limitations under the License.
15 - */
16 -package org.onosproject.store.primitives.impl;
17 -
18 -import static com.google.common.base.MoreObjects.toStringHelper;
19 -
20 -/**
21 - * Representation of a state machine update.
22 - */
23 -public class StateMachineUpdate {
24 -
25 - /**
26 - * Target data structure type this update is for.
27 - */
28 - enum Target {
29 - /**
30 - * Update is for a map.
31 - */
32 - MAP_UPDATE,
33 -
34 - /**
35 - * Update is a transaction commit.
36 - */
37 - TX_COMMIT,
38 -
39 - /**
40 - * Update is a queue push.
41 - */
42 - QUEUE_PUSH,
43 -
44 - /**
45 - * Update is for some other operation.
46 - */
47 - OTHER
48 - }
49 -
50 - private final String operationName;
51 - private final Object input;
52 - private final Object output;
53 -
54 - public StateMachineUpdate(String operationName, Object input, Object output) {
55 - this.operationName = operationName;
56 - this.input = input;
57 - this.output = output;
58 - }
59 -
60 - public Target target() {
61 - // FIXME: This check is brittle
62 - if (operationName.contains("mapUpdate")) {
63 - return Target.MAP_UPDATE;
64 - } else if (operationName.contains("commit") || operationName.contains("prepareAndCommit")) {
65 - return Target.TX_COMMIT;
66 - } else if (operationName.contains("queuePush")) {
67 - return Target.QUEUE_PUSH;
68 - } else {
69 - return Target.OTHER;
70 - }
71 - }
72 -
73 - @SuppressWarnings("unchecked")
74 - public <T> T input() {
75 - return (T) input;
76 - }
77 -
78 - @SuppressWarnings("unchecked")
79 - public <T> T output() {
80 - return (T) output;
81 - }
82 -
83 - @Override
84 - public String toString() {
85 - return toStringHelper(this)
86 - .add("name", operationName)
87 - .add("input", input)
88 - .add("output", output)
89 - .toString();
90 - }
91 -}
...\ No newline at end of file ...\ No newline at end of file
1 -/*
2 - * Copyright 2015 Open Networking Laboratory
3 - *
4 - * Licensed under the Apache License, Version 2.0 (the "License");
5 - * you may not use this file except in compliance with the License.
6 - * You may obtain a copy of the License at
7 - *
8 - * http://www.apache.org/licenses/LICENSE-2.0
9 - *
10 - * Unless required by applicable law or agreed to in writing, software
11 - * distributed under the License is distributed on an "AS IS" BASIS,
12 - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 - * See the License for the specific language governing permissions and
14 - * limitations under the License.
15 - */
16 -package org.onosproject.store.primitives.impl;
17 -
18 -import static com.google.common.base.Preconditions.checkNotNull;
19 -
20 -import java.util.Collection;
21 -import java.util.concurrent.CompletableFuture;
22 -import java.util.stream.Collectors;
23 -
24 -import org.onosproject.store.primitives.TransactionId;
25 -import org.onosproject.store.primitives.resources.impl.CommitResult;
26 -import org.onosproject.store.service.AsyncConsistentMap;
27 -
28 -import static org.onosproject.store.primitives.impl.Transaction.State.COMMITTED;
29 -import static org.onosproject.store.primitives.impl.Transaction.State.COMMITTING;
30 -import static org.onosproject.store.primitives.impl.Transaction.State.ROLLEDBACK;
31 -import static org.onosproject.store.primitives.impl.Transaction.State.ROLLINGBACK;
32 -
33 -/**
34 - * Agent that runs the two phase commit protocol.
35 - */
36 -public class TransactionManager {
37 -
38 - private final Database database;
39 - private final AsyncConsistentMap<TransactionId, Transaction> transactions;
40 -
41 - public TransactionManager(Database database, AsyncConsistentMap<TransactionId, Transaction> transactions) {
42 - this.database = checkNotNull(database, "database cannot be null");
43 - this.transactions = transactions;
44 - }
45 -
46 - /**
47 - * Executes the specified transaction by employing a two phase commit protocol.
48 - *
49 - * @param transaction transaction to commit
50 - * @return transaction commit result
51 - */
52 - public CompletableFuture<CommitResult> execute(Transaction transaction) {
53 - // short-circuit if there is only a single update
54 - if (transaction.updates().size() <= 1) {
55 - return database.prepareAndCommit(transaction)
56 - .thenApply(response -> response.success()
57 - ? CommitResult.OK : CommitResult.FAILURE_DURING_COMMIT);
58 - }
59 - // clean up if this transaction in already in a terminal state.
60 - if (transaction.state() == COMMITTED || transaction.state() == ROLLEDBACK) {
61 - return transactions.remove(transaction.id()).thenApply(v -> CommitResult.OK);
62 - } else if (transaction.state() == COMMITTING) {
63 - return commit(transaction);
64 - } else if (transaction.state() == ROLLINGBACK) {
65 - return rollback(transaction).thenApply(v -> CommitResult.FAILURE_TO_PREPARE);
66 - } else {
67 - return prepare(transaction).thenCompose(v -> v ? commit(transaction) : rollback(transaction));
68 - }
69 - }
70 -
71 - /**
72 - * Returns all pending transaction identifiers.
73 - *
74 - * @return future for a collection of transaction identifiers.
75 - */
76 - public CompletableFuture<Collection<TransactionId>> getPendingTransactionIds() {
77 - return transactions.values().thenApply(c -> c.stream()
78 - .map(v -> v.value())
79 - .filter(v -> v.state() != COMMITTED && v.state() != ROLLEDBACK)
80 - .map(Transaction::id)
81 - .collect(Collectors.toList()));
82 - }
83 -
84 - private CompletableFuture<Boolean> prepare(Transaction transaction) {
85 - return transactions.put(transaction.id(), transaction)
86 - .thenCompose(v -> database.prepare(transaction))
87 - .thenCompose(status -> transactions.put(
88 - transaction.id(),
89 - transaction.transition(status ? COMMITTING : ROLLINGBACK))
90 - .thenApply(v -> status));
91 - }
92 -
93 - private CompletableFuture<CommitResult> commit(Transaction transaction) {
94 - return database.commit(transaction)
95 - .thenCompose(r -> {
96 - if (r.success()) {
97 - return transactions.put(transaction.id(), transaction.transition(COMMITTED))
98 - .thenApply(v -> CommitResult.OK);
99 - } else {
100 - return CompletableFuture.completedFuture(CommitResult.FAILURE_DURING_COMMIT);
101 - }
102 - });
103 - }
104 -
105 - private CompletableFuture<CommitResult> rollback(Transaction transaction) {
106 - return database.rollback(transaction)
107 - .thenCompose(v -> transactions.put(transaction.id(), transaction.transition(ROLLEDBACK)))
108 - .thenApply(v -> CommitResult.FAILURE_TO_PREPARE);
109 - }
110 -}
1 -/*
2 - * Copyright 2015 Open Networking Laboratory
3 - *
4 - * Licensed under the Apache License, Version 2.0 (the "License");
5 - * you may not use this file except in compliance with the License.
6 - * You may obtain a copy of the License at
7 - *
8 - * http://www.apache.org/licenses/LICENSE-2.0
9 - *
10 - * Unless required by applicable law or agreed to in writing, software
11 - * distributed under the License is distributed on an "AS IS" BASIS,
12 - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 - * See the License for the specific language governing permissions and
14 - * limitations under the License.
15 - */
16 -package org.onosproject.store.primitives.impl;
17 -
18 -import java.util.function.Function;
19 -
20 -import org.onosproject.store.service.MapEvent;
21 -import org.onosproject.store.service.Versioned;
22 -
23 -/**
24 - * Result of a update operation.
25 - * <p>
26 - * Both old and new values are accessible along with a flag that indicates if the
27 - * the value was updated. If flag is false, oldValue and newValue both
28 - * point to the same unmodified value.
29 - * @param <V> result type
30 - */
31 -public class UpdateResult<K, V> {
32 -
33 - private final boolean updated;
34 - private final String mapName;
35 - private final K key;
36 - private final Versioned<V> oldValue;
37 - private final Versioned<V> newValue;
38 -
39 - public UpdateResult(boolean updated, String mapName, K key, Versioned<V> oldValue, Versioned<V> newValue) {
40 - this.updated = updated;
41 - this.mapName = mapName;
42 - this.key = key;
43 - this.oldValue = oldValue;
44 - this.newValue = newValue;
45 - }
46 -
47 - public boolean updated() {
48 - return updated;
49 - }
50 -
51 - public String mapName() {
52 - return mapName;
53 - }
54 -
55 - public K key() {
56 - return key;
57 - }
58 -
59 - public Versioned<V> oldValue() {
60 - return oldValue;
61 - }
62 -
63 - public Versioned<V> newValue() {
64 - return newValue;
65 - }
66 -
67 - public <K1, V1> UpdateResult<K1, V1> map(Function<K, K1> keyTransform, Function<V, V1> valueMapper) {
68 - return new UpdateResult<>(updated,
69 - mapName,
70 - keyTransform.apply(key),
71 - oldValue == null ? null : oldValue.map(valueMapper),
72 - newValue == null ? null : newValue.map(valueMapper));
73 - }
74 -
75 - public MapEvent<K, V> toMapEvent() {
76 - if (!updated) {
77 - return null;
78 - } else {
79 - return new MapEvent<>(mapName(), key(), newValue, oldValue);
80 - }
81 - }
82 -}
...\ No newline at end of file ...\ No newline at end of file
1 -/*
2 - * Copyright 2015 Open Networking Laboratory
3 - *
4 - * Licensed under the Apache License, Version 2.0 (the "License");
5 - * you may not use this file except in compliance with the License.
6 - * You may obtain a copy of the License at
7 - *
8 - * http://www.apache.org/licenses/LICENSE-2.0
9 - *
10 - * Unless required by applicable law or agreed to in writing, software
11 - * distributed under the License is distributed on an "AS IS" BASIS,
12 - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 - * See the License for the specific language governing permissions and
14 - * limitations under the License.
15 - */
16 -package org.onosproject.store.primitives.impl;
17 -
18 -import static junit.framework.TestCase.assertEquals;
19 -import static junit.framework.TestCase.assertFalse;
20 -import static junit.framework.TestCase.assertNull;
21 -import static junit.framework.TestCase.assertTrue;
22 -
23 -import org.junit.Test;
24 -
25 -/**
26 - * Unit tests for Result.
27 - */
28 -public class ResultTest {
29 -
30 - @Test
31 - public void testLocked() {
32 - Result<String> r = Result.locked();
33 - assertFalse(r.success());
34 - assertNull(r.value());
35 - assertEquals(Result.Status.LOCKED, r.status());
36 - }
37 -
38 - @Test
39 - public void testOk() {
40 - Result<String> r = Result.ok("foo");
41 - assertTrue(r.success());
42 - assertEquals("foo", r.value());
43 - assertEquals(Result.Status.OK, r.status());
44 - }
45 -
46 - @Test
47 - public void testEquality() {
48 - Result<String> r1 = Result.ok("foo");
49 - Result<String> r2 = Result.locked();
50 - Result<String> r3 = Result.ok("bar");
51 - Result<String> r4 = Result.ok("foo");
52 - assertTrue(r1.equals(r4));
53 - assertFalse(r1.equals(r2));
54 - assertFalse(r1.equals(r3));
55 - assertFalse(r2.equals(r3));
56 - }
57 -}
1 -/*
2 - * Copyright 2015 Open Networking Laboratory
3 - *
4 - * Licensed under the Apache License, Version 2.0 (the "License");
5 - * you may not use this file except in compliance with the License.
6 - * You may obtain a copy of the License at
7 - *
8 - * http://www.apache.org/licenses/LICENSE-2.0
9 - *
10 - * Unless required by applicable law or agreed to in writing, software
11 - * distributed under the License is distributed on an "AS IS" BASIS,
12 - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 - * See the License for the specific language governing permissions and
14 - * limitations under the License.
15 - */
16 -package org.onosproject.store.primitives.impl;
17 -
18 -import static junit.framework.TestCase.assertEquals;
19 -import static junit.framework.TestCase.assertNull;
20 -import static junit.framework.TestCase.assertTrue;
21 -
22 -import org.junit.Test;
23 -import org.onosproject.store.service.MapEvent;
24 -import org.onosproject.store.service.Versioned;
25 -
26 -/**
27 - * Unit tests for UpdateResult.
28 - */
29 -public class UpdateResultTest {
30 -
31 - @Test
32 - public void testGetters() {
33 - Versioned<String> oldValue = new Versioned<>("a", 1);
34 - Versioned<String> newValue = new Versioned<>("b", 2);
35 - UpdateResult<String, String> ur =
36 - new UpdateResult<>(true, "foo", "k", oldValue, newValue);
37 -
38 - assertTrue(ur.updated());
39 - assertEquals("foo", ur.mapName());
40 - assertEquals("k", ur.key());
41 - assertEquals(oldValue, ur.oldValue());
42 - assertEquals(newValue, ur.newValue());
43 - }
44 -
45 - @Test
46 - public void testToMapEvent() {
47 - Versioned<String> oldValue = new Versioned<>("a", 1);
48 - Versioned<String> newValue = new Versioned<>("b", 2);
49 - UpdateResult<String, String> ur1 =
50 - new UpdateResult<>(true, "foo", "k", oldValue, newValue);
51 - MapEvent<String, String> event1 = ur1.toMapEvent();
52 - assertEquals(MapEvent.Type.UPDATE, event1.type());
53 - assertEquals("k", event1.key());
54 - assertEquals(newValue, event1.value());
55 -
56 - UpdateResult<String, String> ur2 =
57 - new UpdateResult<>(true, "foo", "k", null, newValue);
58 - MapEvent<String, String> event2 = ur2.toMapEvent();
59 - assertEquals(MapEvent.Type.INSERT, event2.type());
60 - assertEquals("k", event2.key());
61 - assertEquals(newValue, event2.value());
62 -
63 - UpdateResult<String, String> ur3 =
64 - new UpdateResult<>(true, "foo", "k", oldValue, null);
65 - MapEvent<String, String> event3 = ur3.toMapEvent();
66 - assertEquals(MapEvent.Type.REMOVE, event3.type());
67 - assertEquals("k", event3.key());
68 - assertEquals(oldValue, event3.value());
69 -
70 - UpdateResult<String, String> ur4 =
71 - new UpdateResult<>(false, "foo", "k", oldValue, oldValue);
72 - assertNull(ur4.toMapEvent());
73 - }
74 -
75 - @Test
76 - public void testMap() {
77 - Versioned<String> oldValue = new Versioned<>("a", 1);
78 - Versioned<String> newValue = new Versioned<>("b", 2);
79 - UpdateResult<String, String> ur1 =
80 - new UpdateResult<>(true, "foo", "k", oldValue, newValue);
81 - UpdateResult<Integer, Integer> ur2 = ur1.map(s -> s.length(), s -> s.length());
82 -
83 - assertEquals(ur2.updated(), ur1.updated());
84 - assertEquals(ur1.mapName(), ur2.mapName());
85 - assertEquals(new Integer(1), ur2.key());
86 - assertEquals(oldValue.map(s -> s.length()), ur2.oldValue());
87 - assertEquals(newValue.map(s -> s.length()), ur2.newValue());
88 -
89 - UpdateResult<String, String> ur3 =
90 - new UpdateResult<>(true, "foo", "k", null, newValue);
91 - UpdateResult<Integer, Integer> ur4 = ur3.map(s -> s.length(), s -> s.length());
92 -
93 - assertEquals(ur3.updated(), ur4.updated());
94 - assertEquals(ur3.mapName(), ur4.mapName());
95 - assertEquals(new Integer(1), ur4.key());
96 - assertNull(ur4.oldValue());
97 - assertEquals(newValue.map(s -> s.length()), ur4.newValue());
98 - }
99 -}
...@@ -80,8 +80,7 @@ ...@@ -80,8 +80,7 @@
80 <!-- TODO: replace with final release version when it is out --> 80 <!-- TODO: replace with final release version when it is out -->
81 <catalyst.version>1.0.6</catalyst.version> 81 <catalyst.version>1.0.6</catalyst.version>
82 <atomix.version>1.0.0-rc3</atomix.version> 82 <atomix.version>1.0.0-rc3</atomix.version>
83 - <atomix.copycat.version>1.0.0-rc6</atomix.copycat.version> 83 + <copycat.version>1.0.0-rc6</copycat.version>
84 - <copycat.version>0.5.1.onos</copycat.version>
85 <openflowj.version>0.9.3.onos-SNAPSHOT</openflowj.version> 84 <openflowj.version>0.9.3.onos-SNAPSHOT</openflowj.version>
86 <onos-maven-plugin.version>1.9</onos-maven-plugin.version> 85 <onos-maven-plugin.version>1.9</onos-maven-plugin.version>
87 <osgi.version>4.3.1</osgi.version> 86 <osgi.version>4.3.1</osgi.version>
......
...@@ -53,28 +53,15 @@ ...@@ -53,28 +53,15 @@
53 <dependency> 53 <dependency>
54 <groupId>io.atomix.copycat</groupId> 54 <groupId>io.atomix.copycat</groupId>
55 <artifactId>copycat-client</artifactId> 55 <artifactId>copycat-client</artifactId>
56 - <version>${atomix.copycat.version}</version> 56 + <version>${copycat.version}</version>
57 </dependency> 57 </dependency>
58 58
59 <dependency> 59 <dependency>
60 <groupId>io.atomix.copycat</groupId> 60 <groupId>io.atomix.copycat</groupId>
61 <artifactId>copycat-server</artifactId> 61 <artifactId>copycat-server</artifactId>
62 - <version>${atomix.copycat.version}</version>
63 - </dependency>
64 -
65 - <dependency>
66 - <!-- FIXME once fixes get merged to upstream -->
67 - <groupId>org.onosproject</groupId>
68 - <artifactId>copycat-api</artifactId>
69 <version>${copycat.version}</version> 62 <version>${copycat.version}</version>
70 </dependency> 63 </dependency>
71 64
72 - <dependency>
73 - <!-- FIXME once fixes get merged to upstream -->
74 - <groupId>org.onosproject</groupId>
75 - <artifactId>copycat-core</artifactId>
76 - <version>${copycat.version}</version>
77 - </dependency>
78 </dependencies> 65 </dependencies>
79 66
80 <build> 67 <build>
...@@ -99,16 +86,6 @@ ...@@ -99,16 +86,6 @@
99 86
100 <filters> 87 <filters>
101 <filter> 88 <filter>
102 - <artifact>org.onosproject:copycat*</artifact>
103 - <includes>
104 - <include>**</include>
105 - </includes>
106 - <excludes>
107 - <exclude>net/kuujo/copycat/**</exclude>
108 - </excludes>
109 - </filter>
110 -
111 - <filter>
112 <artifact>io.atomix:atomix-all</artifact> 89 <artifact>io.atomix:atomix-all</artifact>
113 <includes> 90 <includes>
114 <include>**</include> 91 <include>**</include>
...@@ -132,7 +109,7 @@ ...@@ -132,7 +109,7 @@
132 <configuration> 109 <configuration>
133 <instructions> 110 <instructions>
134 <Export-Package> 111 <Export-Package>
135 - net.kuujo.copycat.*;io.atomix.* 112 + io.atomix.*
136 </Export-Package> 113 </Export-Package>
137 <Import-Package> 114 <Import-Package>
138 !sun.nio.ch,!sun.misc,* 115 !sun.nio.ch,!sun.misc,*
......