Committed by
Gerrit Code Review
Method name refactor in DistributedPrimitive + Builder for AsyncLeaderElector
Change-Id: I59be6e66665c0b12d02106bd5c722e9fa38dd7a1
Showing
28 changed files
with
276 additions
and
41 deletions
... | @@ -21,6 +21,7 @@ import org.onosproject.store.service.DistributedSetBuilder; | ... | @@ -21,6 +21,7 @@ import org.onosproject.store.service.DistributedSetBuilder; |
21 | import org.onosproject.store.service.DistributedQueueBuilder; | 21 | import org.onosproject.store.service.DistributedQueueBuilder; |
22 | import org.onosproject.store.service.AtomicCounterBuilder; | 22 | import org.onosproject.store.service.AtomicCounterBuilder; |
23 | import org.onosproject.store.service.AtomicValueBuilder; | 23 | import org.onosproject.store.service.AtomicValueBuilder; |
24 | +import org.onosproject.store.service.LeaderElectorBuilder; | ||
24 | import org.onosproject.store.service.TransactionContextBuilder; | 25 | import org.onosproject.store.service.TransactionContextBuilder; |
25 | import org.onosproject.store.service.StorageService; | 26 | import org.onosproject.store.service.StorageService; |
26 | 27 | ||
... | @@ -62,4 +63,9 @@ public class VtnStorageServiceAdapter implements StorageService { | ... | @@ -62,4 +63,9 @@ public class VtnStorageServiceAdapter implements StorageService { |
62 | public TransactionContextBuilder transactionContextBuilder() { | 63 | public TransactionContextBuilder transactionContextBuilder() { |
63 | return null; | 64 | return null; |
64 | } | 65 | } |
66 | + | ||
67 | + @Override | ||
68 | + public LeaderElectorBuilder leaderElectorBuilder() { | ||
69 | + return null; | ||
70 | + } | ||
65 | } | 71 | } | ... | ... |
1 | +/* | ||
2 | + * Copyright 2016 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; | ||
17 | + | ||
18 | +import java.util.Map; | ||
19 | +import java.util.concurrent.CompletableFuture; | ||
20 | +import java.util.concurrent.ExecutionException; | ||
21 | +import java.util.concurrent.TimeUnit; | ||
22 | +import java.util.concurrent.TimeoutException; | ||
23 | +import java.util.function.Consumer; | ||
24 | + | ||
25 | +import org.onosproject.cluster.Leadership; | ||
26 | +import org.onosproject.cluster.NodeId; | ||
27 | +import org.onosproject.event.Change; | ||
28 | +import org.onosproject.store.service.AsyncLeaderElector; | ||
29 | +import org.onosproject.store.service.LeaderElector; | ||
30 | +import org.onosproject.store.service.StorageException; | ||
31 | +import org.onosproject.store.service.Synchronous; | ||
32 | + | ||
33 | +/** | ||
34 | + * Default implementation for a {@code LeaderElector} backed by a {@link AsyncLeaderElector}. | ||
35 | + */ | ||
36 | +public class DefaultLeaderElector extends Synchronous<AsyncLeaderElector> implements LeaderElector { | ||
37 | + | ||
38 | + private final AsyncLeaderElector asyncElector; | ||
39 | + private final long operationTimeoutMillis; | ||
40 | + | ||
41 | + public DefaultLeaderElector(AsyncLeaderElector asyncElector, long operationTimeoutMillis) { | ||
42 | + super(asyncElector); | ||
43 | + this.asyncElector = asyncElector; | ||
44 | + this.operationTimeoutMillis = operationTimeoutMillis; | ||
45 | + } | ||
46 | + | ||
47 | + @Override | ||
48 | + public Leadership run(String topic, NodeId nodeId) { | ||
49 | + return complete(asyncElector.run(topic, nodeId)); | ||
50 | + } | ||
51 | + | ||
52 | + @Override | ||
53 | + public void withdraw(String topic) { | ||
54 | + complete(asyncElector.withdraw(topic)); | ||
55 | + } | ||
56 | + | ||
57 | + @Override | ||
58 | + public boolean anoint(String topic, NodeId nodeId) { | ||
59 | + return complete(asyncElector.anoint(topic, nodeId)); | ||
60 | + } | ||
61 | + | ||
62 | + @Override | ||
63 | + public Leadership getLeadership(String topic) { | ||
64 | + return complete(asyncElector.getLeadership(topic)); | ||
65 | + } | ||
66 | + | ||
67 | + @Override | ||
68 | + public Map<String, Leadership> getLeaderships() { | ||
69 | + return complete(asyncElector.getLeaderships()); | ||
70 | + } | ||
71 | + | ||
72 | + @Override | ||
73 | + public void addChangeListener(Consumer<Change<Leadership>> consumer) { | ||
74 | + complete(asyncElector.addChangeListener(consumer)); | ||
75 | + } | ||
76 | + | ||
77 | + @Override | ||
78 | + public void removeChangeListener(Consumer<Change<Leadership>> consumer) { | ||
79 | + complete(asyncElector.removeChangeListener(consumer)); | ||
80 | + } | ||
81 | + | ||
82 | + private <T> T complete(CompletableFuture<T> future) { | ||
83 | + try { | ||
84 | + return future.get(operationTimeoutMillis, TimeUnit.MILLISECONDS); | ||
85 | + } catch (InterruptedException e) { | ||
86 | + Thread.currentThread().interrupt(); | ||
87 | + throw new StorageException.Interrupted(); | ||
88 | + } catch (TimeoutException e) { | ||
89 | + throw new StorageException.Timeout(); | ||
90 | + } catch (ExecutionException e) { | ||
91 | + throw new StorageException(e.getCause()); | ||
92 | + } | ||
93 | + } | ||
94 | +} |
... | @@ -25,7 +25,7 @@ import org.onosproject.store.primitives.DefaultAtomicCounter; | ... | @@ -25,7 +25,7 @@ import org.onosproject.store.primitives.DefaultAtomicCounter; |
25 | public interface AsyncAtomicCounter extends DistributedPrimitive { | 25 | public interface AsyncAtomicCounter extends DistributedPrimitive { |
26 | 26 | ||
27 | @Override | 27 | @Override |
28 | - default DistributedPrimitive.Type type() { | 28 | + default DistributedPrimitive.Type primitiveType() { |
29 | return DistributedPrimitive.Type.COUNTER; | 29 | return DistributedPrimitive.Type.COUNTER; |
30 | } | 30 | } |
31 | 31 | ... | ... |
... | @@ -32,7 +32,7 @@ import org.onosproject.store.primitives.DefaultAtomicValue; | ... | @@ -32,7 +32,7 @@ import org.onosproject.store.primitives.DefaultAtomicValue; |
32 | public interface AsyncAtomicValue<V> extends DistributedPrimitive { | 32 | public interface AsyncAtomicValue<V> extends DistributedPrimitive { |
33 | 33 | ||
34 | @Override | 34 | @Override |
35 | - default DistributedPrimitive.Type type() { | 35 | + default DistributedPrimitive.Type primitiveType() { |
36 | return DistributedPrimitive.Type.VALUE; | 36 | return DistributedPrimitive.Type.VALUE; |
37 | } | 37 | } |
38 | 38 | ... | ... |
... | @@ -55,7 +55,7 @@ import org.onosproject.store.primitives.TransactionId; | ... | @@ -55,7 +55,7 @@ import org.onosproject.store.primitives.TransactionId; |
55 | public interface AsyncConsistentMap<K, V> extends DistributedPrimitive { | 55 | public interface AsyncConsistentMap<K, V> extends DistributedPrimitive { |
56 | 56 | ||
57 | @Override | 57 | @Override |
58 | - default DistributedPrimitive.Type type() { | 58 | + default DistributedPrimitive.Type primitiveType() { |
59 | return DistributedPrimitive.Type.CONSISTENT_MAP; | 59 | return DistributedPrimitive.Type.CONSISTENT_MAP; |
60 | } | 60 | } |
61 | 61 | ... | ... |
... | @@ -33,7 +33,7 @@ import org.onosproject.store.primitives.DefaultDistributedSet; | ... | @@ -33,7 +33,7 @@ import org.onosproject.store.primitives.DefaultDistributedSet; |
33 | public interface AsyncDistributedSet<E> extends DistributedPrimitive { | 33 | public interface AsyncDistributedSet<E> extends DistributedPrimitive { |
34 | 34 | ||
35 | @Override | 35 | @Override |
36 | - default DistributedPrimitive.Type type() { | 36 | + default DistributedPrimitive.Type primitiveType() { |
37 | return DistributedPrimitive.Type.SET; | 37 | return DistributedPrimitive.Type.SET; |
38 | } | 38 | } |
39 | 39 | ... | ... |
... | @@ -22,6 +22,7 @@ import java.util.function.Consumer; | ... | @@ -22,6 +22,7 @@ import java.util.function.Consumer; |
22 | import org.onosproject.cluster.Leadership; | 22 | import org.onosproject.cluster.Leadership; |
23 | import org.onosproject.cluster.NodeId; | 23 | import org.onosproject.cluster.NodeId; |
24 | import org.onosproject.event.Change; | 24 | import org.onosproject.event.Change; |
25 | +import org.onosproject.store.primitives.DefaultLeaderElector; | ||
25 | 26 | ||
26 | /** | 27 | /** |
27 | * Distributed mutual exclusion primitive. | 28 | * Distributed mutual exclusion primitive. |
... | @@ -45,7 +46,7 @@ import org.onosproject.event.Change; | ... | @@ -45,7 +46,7 @@ import org.onosproject.event.Change; |
45 | public interface AsyncLeaderElector extends DistributedPrimitive { | 46 | public interface AsyncLeaderElector extends DistributedPrimitive { |
46 | 47 | ||
47 | @Override | 48 | @Override |
48 | - default DistributedPrimitive.Type type() { | 49 | + default DistributedPrimitive.Type primitiveType() { |
49 | return DistributedPrimitive.Type.LEADER_ELECTOR; | 50 | return DistributedPrimitive.Type.LEADER_ELECTOR; |
50 | } | 51 | } |
51 | 52 | ||
... | @@ -102,4 +103,23 @@ public interface AsyncLeaderElector extends DistributedPrimitive { | ... | @@ -102,4 +103,23 @@ public interface AsyncLeaderElector extends DistributedPrimitive { |
102 | * @return CompletableFuture that is completed when the operation completes | 103 | * @return CompletableFuture that is completed when the operation completes |
103 | */ | 104 | */ |
104 | CompletableFuture<Void> removeChangeListener(Consumer<Change<Leadership>> consumer); | 105 | CompletableFuture<Void> removeChangeListener(Consumer<Change<Leadership>> consumer); |
106 | + | ||
107 | + /** | ||
108 | + * Returns a new {@link LeaderElector} that is backed by this instance. | ||
109 | + * | ||
110 | + * @param timeoutMillis timeout duration for the returned LeaderElector operations | ||
111 | + * @return new {@code LeaderElector} instance | ||
112 | + */ | ||
113 | + default LeaderElector asLeaderElector(long timeoutMillis) { | ||
114 | + return new DefaultLeaderElector(this, timeoutMillis); | ||
115 | + } | ||
116 | + | ||
117 | + /** | ||
118 | + * Returns a new {@link LeaderElector} that is backed by this instance and with a default operation timeout. | ||
119 | + * | ||
120 | + * @return new {@code LeaderElector} instance | ||
121 | + */ | ||
122 | + default LeaderElector asLeaderElector() { | ||
123 | + return asLeaderElector(DEFAULT_OPERTATION_TIMEOUT_MILLIS); | ||
124 | + } | ||
105 | } | 125 | } | ... | ... |
... | @@ -21,7 +21,7 @@ package org.onosproject.store.service; | ... | @@ -21,7 +21,7 @@ package org.onosproject.store.service; |
21 | public interface AtomicCounter extends DistributedPrimitive { | 21 | public interface AtomicCounter extends DistributedPrimitive { |
22 | 22 | ||
23 | @Override | 23 | @Override |
24 | - default DistributedPrimitive.Type type() { | 24 | + default DistributedPrimitive.Type primitiveType() { |
25 | return DistributedPrimitive.Type.COUNTER; | 25 | return DistributedPrimitive.Type.COUNTER; |
26 | } | 26 | } |
27 | 27 | ... | ... |
... | @@ -81,7 +81,7 @@ public interface DistributedPrimitive { | ... | @@ -81,7 +81,7 @@ public interface DistributedPrimitive { |
81 | * Returns the type of primitive. | 81 | * Returns the type of primitive. |
82 | * @return primitive type | 82 | * @return primitive type |
83 | */ | 83 | */ |
84 | - Type type(); | 84 | + Type primitiveType(); |
85 | 85 | ||
86 | /** | 86 | /** |
87 | * Returns the application owning this primitive. | 87 | * Returns the application owning this primitive. | ... | ... |
... | @@ -42,7 +42,7 @@ import java.util.function.BiFunction; | ... | @@ -42,7 +42,7 @@ import java.util.function.BiFunction; |
42 | public interface EventuallyConsistentMap<K, V> extends DistributedPrimitive { | 42 | public interface EventuallyConsistentMap<K, V> extends DistributedPrimitive { |
43 | 43 | ||
44 | @Override | 44 | @Override |
45 | - default DistributedPrimitive.Type type() { | 45 | + default DistributedPrimitive.Type primitiveType() { |
46 | return DistributedPrimitive.Type.EVENTUALLY_CONSISTENT_MAP; | 46 | return DistributedPrimitive.Type.EVENTUALLY_CONSISTENT_MAP; |
47 | } | 47 | } |
48 | 48 | ... | ... |
... | @@ -29,7 +29,7 @@ import org.onosproject.event.Change; | ... | @@ -29,7 +29,7 @@ import org.onosproject.event.Change; |
29 | public interface LeaderElector extends DistributedPrimitive { | 29 | public interface LeaderElector extends DistributedPrimitive { |
30 | 30 | ||
31 | @Override | 31 | @Override |
32 | - default DistributedPrimitive.Type type() { | 32 | + default DistributedPrimitive.Type primitiveType() { |
33 | return DistributedPrimitive.Type.LEADER_ELECTOR; | 33 | return DistributedPrimitive.Type.LEADER_ELECTOR; |
34 | } | 34 | } |
35 | 35 | ... | ... |
1 | +/* | ||
2 | + * Copyright 2016 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.service; | ||
17 | + | ||
18 | +import org.onosproject.store.primitives.DistributedPrimitiveBuilder; | ||
19 | + | ||
20 | +/** | ||
21 | + * Builder for constructing new {@link AsyncLeaderElector} instances. | ||
22 | + */ | ||
23 | +public abstract class LeaderElectorBuilder | ||
24 | + extends DistributedPrimitiveBuilder<LeaderElectorBuilder, AsyncLeaderElector> { | ||
25 | + public LeaderElectorBuilder() { | ||
26 | + super(DistributedPrimitive.Type.LEADER_ELECTOR); | ||
27 | + } | ||
28 | +} |
... | @@ -21,6 +21,7 @@ import java.util.function.Function; | ... | @@ -21,6 +21,7 @@ import java.util.function.Function; |
21 | import org.onosproject.store.primitives.MapUpdate; | 21 | import org.onosproject.store.primitives.MapUpdate; |
22 | import org.onosproject.store.primitives.TransactionId; | 22 | import org.onosproject.store.primitives.TransactionId; |
23 | 23 | ||
24 | +import com.google.common.base.MoreObjects; | ||
24 | import com.google.common.collect.ImmutableList; | 25 | import com.google.common.collect.ImmutableList; |
25 | import com.google.common.collect.Lists; | 26 | import com.google.common.collect.Lists; |
26 | 27 | ||
... | @@ -58,6 +59,14 @@ public class MapTransaction<K, V> { | ... | @@ -58,6 +59,14 @@ public class MapTransaction<K, V> { |
58 | return updates; | 59 | return updates; |
59 | } | 60 | } |
60 | 61 | ||
62 | + @Override | ||
63 | + public String toString() { | ||
64 | + return MoreObjects.toStringHelper(getClass()) | ||
65 | + .add("transactionId", transactionId) | ||
66 | + .add("updates", updates) | ||
67 | + .toString(); | ||
68 | + } | ||
69 | + | ||
61 | /** | 70 | /** |
62 | * Maps this instance to another {@code MapTransaction} with different key and value types. | 71 | * Maps this instance to another {@code MapTransaction} with different key and value types. |
63 | * | 72 | * | ... | ... |
... | @@ -75,6 +75,13 @@ public interface StorageService { | ... | @@ -75,6 +75,13 @@ public interface StorageService { |
75 | <V> AtomicValueBuilder<V> atomicValueBuilder(); | 75 | <V> AtomicValueBuilder<V> atomicValueBuilder(); |
76 | 76 | ||
77 | /** | 77 | /** |
78 | + * Creates a new LeaderElectorBuilder. | ||
79 | + * | ||
80 | + * @return leader elector builder | ||
81 | + */ | ||
82 | + LeaderElectorBuilder leaderElectorBuilder(); | ||
83 | + | ||
84 | + /** | ||
78 | * Creates a new transaction context builder. | 85 | * Creates a new transaction context builder. |
79 | * | 86 | * |
80 | * @return a builder for a transaction context. | 87 | * @return a builder for a transaction context. | ... | ... |
... | @@ -37,8 +37,8 @@ public abstract class Synchronous<T extends DistributedPrimitive> implements Dis | ... | @@ -37,8 +37,8 @@ public abstract class Synchronous<T extends DistributedPrimitive> implements Dis |
37 | } | 37 | } |
38 | 38 | ||
39 | @Override | 39 | @Override |
40 | - public Type type() { | 40 | + public Type primitiveType() { |
41 | - return primitive.type(); | 41 | + return primitive.primitiveType(); |
42 | } | 42 | } |
43 | 43 | ||
44 | @Override | 44 | @Override | ... | ... |
... | @@ -36,7 +36,7 @@ import org.onosproject.store.primitives.TransactionId; | ... | @@ -36,7 +36,7 @@ import org.onosproject.store.primitives.TransactionId; |
36 | public interface TransactionContext extends DistributedPrimitive { | 36 | public interface TransactionContext extends DistributedPrimitive { |
37 | 37 | ||
38 | @Override | 38 | @Override |
39 | - default DistributedPrimitive.Type type() { | 39 | + default DistributedPrimitive.Type primitiveType() { |
40 | return DistributedPrimitive.Type.TRANSACTION_CONTEXT; | 40 | return DistributedPrimitive.Type.TRANSACTION_CONTEXT; |
41 | } | 41 | } |
42 | 42 | ... | ... |
... | @@ -19,6 +19,7 @@ package org.onosproject.store.service; | ... | @@ -19,6 +19,7 @@ package org.onosproject.store.service; |
19 | import java.util.function.Function; | 19 | import java.util.function.Function; |
20 | 20 | ||
21 | import org.joda.time.DateTime; | 21 | import org.joda.time.DateTime; |
22 | +import org.onlab.util.ByteArraySizeHashPrinter; | ||
22 | 23 | ||
23 | import com.google.common.base.MoreObjects; | 24 | import com.google.common.base.MoreObjects; |
24 | import com.google.common.base.Objects; | 25 | import com.google.common.base.Objects; |
... | @@ -140,7 +141,7 @@ public class Versioned<V> { | ... | @@ -140,7 +141,7 @@ public class Versioned<V> { |
140 | @Override | 141 | @Override |
141 | public String toString() { | 142 | public String toString() { |
142 | return MoreObjects.toStringHelper(this) | 143 | return MoreObjects.toStringHelper(this) |
143 | - .add("value", value) | 144 | + .add("value", value instanceof byte[] ? new ByteArraySizeHashPrinter((byte[]) value) : value) |
144 | .add("version", version) | 145 | .add("version", version) |
145 | .add("creationTime", new DateTime(creationTime)) | 146 | .add("creationTime", new DateTime(creationTime)) |
146 | .toString(); | 147 | .toString(); | ... | ... |
... | @@ -33,7 +33,7 @@ public class ConsistentMapAdapter<K, V> implements ConsistentMap<K, V> { | ... | @@ -33,7 +33,7 @@ public class ConsistentMapAdapter<K, V> implements ConsistentMap<K, V> { |
33 | } | 33 | } |
34 | 34 | ||
35 | @Override | 35 | @Override |
36 | - public DistributedPrimitive.Type type() { | 36 | + public DistributedPrimitive.Type primitiveType() { |
37 | return DistributedPrimitive.Type.CONSISTENT_MAP; | 37 | return DistributedPrimitive.Type.CONSISTENT_MAP; |
38 | } | 38 | } |
39 | 39 | ... | ... |
... | @@ -34,7 +34,7 @@ public class EventuallyConsistentMapAdapter<K, V> implements EventuallyConsisten | ... | @@ -34,7 +34,7 @@ public class EventuallyConsistentMapAdapter<K, V> implements EventuallyConsisten |
34 | } | 34 | } |
35 | 35 | ||
36 | @Override | 36 | @Override |
37 | - public Type type() { | 37 | + public Type primitiveType() { |
38 | return Type.EVENTUALLY_CONSISTENT_MAP; | 38 | return Type.EVENTUALLY_CONSISTENT_MAP; |
39 | } | 39 | } |
40 | 40 | ... | ... |
... | @@ -53,4 +53,9 @@ public class StorageServiceAdapter implements StorageService { | ... | @@ -53,4 +53,9 @@ public class StorageServiceAdapter implements StorageService { |
53 | public TransactionContextBuilder transactionContextBuilder() { | 53 | public TransactionContextBuilder transactionContextBuilder() { |
54 | return null; | 54 | return null; |
55 | } | 55 | } |
56 | + | ||
57 | + @Override | ||
58 | + public LeaderElectorBuilder leaderElectorBuilder() { | ||
59 | + return null; | ||
60 | + } | ||
56 | } | 61 | } | ... | ... |
... | @@ -22,6 +22,7 @@ import java.io.DataInputStream; | ... | @@ -22,6 +22,7 @@ import java.io.DataInputStream; |
22 | import java.io.IOException; | 22 | import java.io.IOException; |
23 | import java.net.InetAddress; | 23 | import java.net.InetAddress; |
24 | import java.net.InetSocketAddress; | 24 | import java.net.InetSocketAddress; |
25 | +import java.net.UnknownHostException; | ||
25 | import java.util.Map; | 26 | import java.util.Map; |
26 | import java.util.concurrent.CompletableFuture; | 27 | import java.util.concurrent.CompletableFuture; |
27 | import java.util.concurrent.atomic.AtomicBoolean; | 28 | import java.util.concurrent.atomic.AtomicBoolean; |
... | @@ -32,6 +33,7 @@ import org.onlab.util.Tools; | ... | @@ -32,6 +33,7 @@ import org.onlab.util.Tools; |
32 | import org.onosproject.cluster.PartitionId; | 33 | import org.onosproject.cluster.PartitionId; |
33 | import org.onosproject.store.cluster.messaging.MessagingService; | 34 | import org.onosproject.store.cluster.messaging.MessagingService; |
34 | 35 | ||
36 | +import com.google.common.base.Throwables; | ||
35 | import com.google.common.collect.Maps; | 37 | import com.google.common.collect.Maps; |
36 | 38 | ||
37 | import io.atomix.catalyst.transport.Address; | 39 | import io.atomix.catalyst.transport.Address; |
... | @@ -71,18 +73,23 @@ public class CopycatTransportServer implements Server { | ... | @@ -71,18 +73,23 @@ public class CopycatTransportServer implements Server { |
71 | messagingService.registerHandler(messageSubject, (sender, payload) -> { | 73 | messagingService.registerHandler(messageSubject, (sender, payload) -> { |
72 | try (DataInputStream input = new DataInputStream(new ByteArrayInputStream(payload))) { | 74 | try (DataInputStream input = new DataInputStream(new ByteArrayInputStream(payload))) { |
73 | long connectionId = input.readLong(); | 75 | long connectionId = input.readLong(); |
74 | - InetAddress senderHost = InetAddress.getByAddress(sender.host().toOctets()); | ||
75 | - int senderPort = sender.port(); | ||
76 | - Address senderAddress = new Address(new InetSocketAddress(senderHost, senderPort)); | ||
77 | AtomicBoolean newConnection = new AtomicBoolean(false); | 76 | AtomicBoolean newConnection = new AtomicBoolean(false); |
78 | CopycatTransportConnection connection = connections.computeIfAbsent(connectionId, k -> { | 77 | CopycatTransportConnection connection = connections.computeIfAbsent(connectionId, k -> { |
79 | newConnection.set(true); | 78 | newConnection.set(true); |
80 | - return new CopycatTransportConnection(connectionId, | 79 | + try { |
81 | - CopycatTransport.Mode.SERVER, | 80 | + InetAddress senderHost = InetAddress.getByAddress(sender.host().toOctets()); |
82 | - partitionId, | 81 | + int senderPort = sender.port(); |
83 | - senderAddress, | 82 | + Address senderAddress = new Address(new InetSocketAddress(senderHost, senderPort)); |
84 | - messagingService, | 83 | + return new CopycatTransportConnection(connectionId, |
85 | - getOrCreateContext(context)); | 84 | + CopycatTransport.Mode.SERVER, |
85 | + partitionId, | ||
86 | + senderAddress, | ||
87 | + messagingService, | ||
88 | + getOrCreateContext(context)); | ||
89 | + } catch (UnknownHostException e) { | ||
90 | + Throwables.propagate(e); | ||
91 | + return null; | ||
92 | + } | ||
86 | }); | 93 | }); |
87 | byte[] request = IOUtils.toByteArray(input); | 94 | byte[] request = IOUtils.toByteArray(input); |
88 | return CompletableFuture.supplyAsync( | 95 | return CompletableFuture.supplyAsync( | ... | ... |
... | @@ -76,6 +76,7 @@ import org.onosproject.store.service.ConsistentMapException; | ... | @@ -76,6 +76,7 @@ import org.onosproject.store.service.ConsistentMapException; |
76 | import org.onosproject.store.service.DistributedQueueBuilder; | 76 | import org.onosproject.store.service.DistributedQueueBuilder; |
77 | import org.onosproject.store.service.DistributedSetBuilder; | 77 | import org.onosproject.store.service.DistributedSetBuilder; |
78 | import org.onosproject.store.service.EventuallyConsistentMapBuilder; | 78 | import org.onosproject.store.service.EventuallyConsistentMapBuilder; |
79 | +import org.onosproject.store.service.LeaderElectorBuilder; | ||
79 | import org.onosproject.store.service.MapInfo; | 80 | import org.onosproject.store.service.MapInfo; |
80 | import org.onosproject.store.service.PartitionInfo; | 81 | import org.onosproject.store.service.PartitionInfo; |
81 | import org.onosproject.store.service.Serializer; | 82 | import org.onosproject.store.service.Serializer; |
... | @@ -360,6 +361,11 @@ public class DatabaseManager implements StorageService, StorageAdminService { | ... | @@ -360,6 +361,11 @@ public class DatabaseManager implements StorageService, StorageAdminService { |
360 | } | 361 | } |
361 | 362 | ||
362 | @Override | 363 | @Override |
364 | + public LeaderElectorBuilder leaderElectorBuilder() { | ||
365 | + throw new UnsupportedOperationException(); | ||
366 | + } | ||
367 | + | ||
368 | + @Override | ||
363 | public List<MapInfo> getMapInfo() { | 369 | public List<MapInfo> getMapInfo() { |
364 | List<MapInfo> maps = Lists.newArrayList(); | 370 | List<MapInfo> maps = Lists.newArrayList(); |
365 | maps.addAll(getMapInfo(inMemoryDatabase)); | 371 | maps.addAll(getMapInfo(inMemoryDatabase)); | ... | ... |
... | @@ -54,29 +54,29 @@ public class DefaultCatalystTypeSerializerFactory implements TypeSerializerFacto | ... | @@ -54,29 +54,29 @@ public class DefaultCatalystTypeSerializerFactory implements TypeSerializerFacto |
54 | } | 54 | } |
55 | 55 | ||
56 | @Override | 56 | @Override |
57 | - public T read(Class<T> clazz, BufferInput<?> input, | 57 | + public void write(T object, BufferOutput<?> buffer, |
58 | - io.atomix.catalyst.serializer.Serializer serializer) { | 58 | + io.atomix.catalyst.serializer.Serializer serializer) { |
59 | - int size = input.readInt(); | ||
60 | - byte[] payload = new byte[size]; | ||
61 | - input.read(payload); | ||
62 | try { | 59 | try { |
63 | - return this.serializer.decode(payload); | 60 | + byte[] payload = this.serializer.encode(object); |
61 | + buffer.writeInt(payload.length); | ||
62 | + buffer.write(payload); | ||
64 | } catch (Exception e) { | 63 | } catch (Exception e) { |
65 | - log.warn("Failed to deserialize as type {}", clazz, e); | 64 | + log.warn("Failed to serialize {}", object, e); |
66 | - Throwables.propagate(e); | ||
67 | - return null; | ||
68 | } | 65 | } |
69 | } | 66 | } |
70 | 67 | ||
71 | @Override | 68 | @Override |
72 | - public void write(T object, BufferOutput<?> output, | 69 | + public T read(Class<T> type, BufferInput<?> buffer, |
73 | - io.atomix.catalyst.serializer.Serializer serializer) { | 70 | + io.atomix.catalyst.serializer.Serializer serializer) { |
71 | + int size = buffer.readInt(); | ||
74 | try { | 72 | try { |
75 | - byte[] payload = this.serializer.encode(object); | 73 | + byte[] payload = new byte[size]; |
76 | - output.writeInt(payload.length); | 74 | + buffer.read(payload); |
77 | - output.write(payload); | 75 | + return this.serializer.decode(payload); |
78 | } catch (Exception e) { | 76 | } catch (Exception e) { |
79 | - log.warn("Failed to serialize {}", object, e); | 77 | + log.warn("Failed to deserialize as type {}. Payload size: {}", type, size, e); |
78 | + Throwables.propagate(e); | ||
79 | + return null; | ||
80 | } | 80 | } |
81 | } | 81 | } |
82 | } | 82 | } | ... | ... |
... | @@ -117,7 +117,7 @@ public class DefaultDistributedQueue<E> implements DistributedQueue<E> { | ... | @@ -117,7 +117,7 @@ public class DefaultDistributedQueue<E> implements DistributedQueue<E> { |
117 | } | 117 | } |
118 | 118 | ||
119 | @Override | 119 | @Override |
120 | - public DistributedPrimitive.Type type() { | 120 | + public DistributedPrimitive.Type primitiveType() { |
121 | return DistributedPrimitive.Type.QUEUE; | 121 | return DistributedPrimitive.Type.QUEUE; |
122 | } | 122 | } |
123 | 123 | ... | ... |
1 | +/* | ||
2 | + * Copyright 2016 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.primitives.DistributedPrimitiveCreator; | ||
19 | +import org.onosproject.store.service.AsyncLeaderElector; | ||
20 | +import org.onosproject.store.service.LeaderElectorBuilder; | ||
21 | + | ||
22 | +/** | ||
23 | + * Default implementation of {@code LeaderElectorBuilder}. | ||
24 | + */ | ||
25 | +public class DefaultLeaderElectorBuilder extends LeaderElectorBuilder { | ||
26 | + | ||
27 | + private final DistributedPrimitiveCreator base; | ||
28 | + private final DistributedPrimitiveCreator federated; | ||
29 | + | ||
30 | + public DefaultLeaderElectorBuilder(DistributedPrimitiveCreator base, DistributedPrimitiveCreator federated) { | ||
31 | + this.base = base; | ||
32 | + this.federated = federated; | ||
33 | + } | ||
34 | + | ||
35 | + @Override | ||
36 | + public AsyncLeaderElector build() { | ||
37 | + DistributedPrimitiveCreator creator = partitionsDisabled() ? base : federated; | ||
38 | + return creator.newAsyncLeaderElector(name()); | ||
39 | + } | ||
40 | +} |
... | @@ -33,6 +33,7 @@ import org.onosproject.cluster.NodeId; | ... | @@ -33,6 +33,7 @@ import org.onosproject.cluster.NodeId; |
33 | import org.onosproject.cluster.Partition; | 33 | import org.onosproject.cluster.Partition; |
34 | import org.onosproject.store.cluster.messaging.MessagingService; | 34 | import org.onosproject.store.cluster.messaging.MessagingService; |
35 | import org.onosproject.store.primitives.resources.impl.AtomixConsistentMap; | 35 | import org.onosproject.store.primitives.resources.impl.AtomixConsistentMap; |
36 | +import org.onosproject.store.primitives.resources.impl.AtomixLeaderElector; | ||
36 | import org.onosproject.store.service.PartitionInfo; | 37 | import org.onosproject.store.service.PartitionInfo; |
37 | 38 | ||
38 | import com.google.common.collect.Collections2; | 39 | import com.google.common.collect.Collections2; |
... | @@ -51,6 +52,7 @@ public class StoragePartition extends DefaultPartition implements Managed<Storag | ... | @@ -51,6 +52,7 @@ public class StoragePartition extends DefaultPartition implements Managed<Storag |
51 | private final File logFolder; | 52 | private final File logFolder; |
52 | private static final Collection<ResourceType> RESOURCE_TYPES = ImmutableSet.of( | 53 | private static final Collection<ResourceType> RESOURCE_TYPES = ImmutableSet.of( |
53 | new ResourceType(DistributedLong.class), | 54 | new ResourceType(DistributedLong.class), |
55 | + new ResourceType(AtomixLeaderElector.class), | ||
54 | new ResourceType(AtomixConsistentMap.class)); | 56 | new ResourceType(AtomixConsistentMap.class)); |
55 | 57 | ||
56 | private NodeId localNodeId; | 58 | private NodeId localNodeId; | ... | ... |
... | @@ -29,6 +29,7 @@ import org.onlab.util.HexString; | ... | @@ -29,6 +29,7 @@ import org.onlab.util.HexString; |
29 | import org.onosproject.store.primitives.DistributedPrimitiveCreator; | 29 | import org.onosproject.store.primitives.DistributedPrimitiveCreator; |
30 | import org.onosproject.store.primitives.resources.impl.AtomixConsistentMap; | 30 | import org.onosproject.store.primitives.resources.impl.AtomixConsistentMap; |
31 | import org.onosproject.store.primitives.resources.impl.AtomixCounter; | 31 | import org.onosproject.store.primitives.resources.impl.AtomixCounter; |
32 | +import org.onosproject.store.primitives.resources.impl.AtomixLeaderElector; | ||
32 | import org.onosproject.store.serializers.KryoNamespaces; | 33 | import org.onosproject.store.serializers.KryoNamespaces; |
33 | import org.onosproject.store.service.AsyncAtomicCounter; | 34 | import org.onosproject.store.service.AsyncAtomicCounter; |
34 | import org.onosproject.store.service.AsyncAtomicValue; | 35 | import org.onosproject.store.service.AsyncAtomicValue; |
... | @@ -133,7 +134,7 @@ public class StoragePartitionClient implements DistributedPrimitiveCreator, Mana | ... | @@ -133,7 +134,7 @@ public class StoragePartitionClient implements DistributedPrimitiveCreator, Mana |
133 | 134 | ||
134 | @Override | 135 | @Override |
135 | public AsyncLeaderElector newAsyncLeaderElector(String name) { | 136 | public AsyncLeaderElector newAsyncLeaderElector(String name) { |
136 | - throw new UnsupportedOperationException(); | 137 | + return client.get(name, AtomixLeaderElector.class).join(); |
137 | } | 138 | } |
138 | 139 | ||
139 | @Override | 140 | @Override | ... | ... |
... | @@ -40,6 +40,7 @@ import org.onlab.util.Match; | ... | @@ -40,6 +40,7 @@ import org.onlab.util.Match; |
40 | import org.onosproject.app.ApplicationState; | 40 | import org.onosproject.app.ApplicationState; |
41 | import org.onosproject.cluster.ControllerNode; | 41 | import org.onosproject.cluster.ControllerNode; |
42 | import org.onosproject.cluster.DefaultControllerNode; | 42 | import org.onosproject.cluster.DefaultControllerNode; |
43 | +import org.onosproject.cluster.Leader; | ||
43 | import org.onosproject.cluster.Leadership; | 44 | import org.onosproject.cluster.Leadership; |
44 | import org.onosproject.cluster.LeadershipEvent; | 45 | import org.onosproject.cluster.LeadershipEvent; |
45 | import org.onosproject.cluster.NodeId; | 46 | import org.onosproject.cluster.NodeId; |
... | @@ -49,6 +50,7 @@ import org.onosproject.core.DefaultApplication; | ... | @@ -49,6 +50,7 @@ import org.onosproject.core.DefaultApplication; |
49 | import org.onosproject.core.DefaultApplicationId; | 50 | import org.onosproject.core.DefaultApplicationId; |
50 | import org.onosproject.core.DefaultGroupId; | 51 | import org.onosproject.core.DefaultGroupId; |
51 | import org.onosproject.core.Version; | 52 | import org.onosproject.core.Version; |
53 | +import org.onosproject.event.Change; | ||
52 | import org.onosproject.incubator.net.domain.IntentDomainId; | 54 | import org.onosproject.incubator.net.domain.IntentDomainId; |
53 | import org.onosproject.mastership.MastershipTerm; | 55 | import org.onosproject.mastership.MastershipTerm; |
54 | import org.onosproject.net.Annotations; | 56 | import org.onosproject.net.Annotations; |
... | @@ -204,8 +206,10 @@ import org.onosproject.net.resource.link.MplsLabelResourceAllocation; | ... | @@ -204,8 +206,10 @@ import org.onosproject.net.resource.link.MplsLabelResourceAllocation; |
204 | import org.onosproject.net.resource.link.MplsLabelResourceRequest; | 206 | import org.onosproject.net.resource.link.MplsLabelResourceRequest; |
205 | import org.onosproject.security.Permission; | 207 | import org.onosproject.security.Permission; |
206 | import org.onosproject.store.Timestamp; | 208 | import org.onosproject.store.Timestamp; |
209 | +import org.onosproject.store.primitives.MapUpdate; | ||
207 | import org.onosproject.store.primitives.TransactionId; | 210 | import org.onosproject.store.primitives.TransactionId; |
208 | import org.onosproject.store.service.MapEvent; | 211 | import org.onosproject.store.service.MapEvent; |
212 | +import org.onosproject.store.service.MapTransaction; | ||
209 | import org.onosproject.store.service.SetEvent; | 213 | import org.onosproject.store.service.SetEvent; |
210 | import org.onosproject.store.service.Versioned; | 214 | import org.onosproject.store.service.Versioned; |
211 | 215 | ||
... | @@ -327,6 +331,8 @@ public final class KryoNamespaces { | ... | @@ -327,6 +331,8 @@ public final class KryoNamespaces { |
327 | Link.Type.class, | 331 | Link.Type.class, |
328 | Link.State.class, | 332 | Link.State.class, |
329 | Timestamp.class, | 333 | Timestamp.class, |
334 | + Change.class, | ||
335 | + Leader.class, | ||
330 | Leadership.class, | 336 | Leadership.class, |
331 | LeadershipEvent.class, | 337 | LeadershipEvent.class, |
332 | LeadershipEvent.Type.class, | 338 | LeadershipEvent.Type.class, |
... | @@ -493,6 +499,9 @@ public final class KryoNamespaces { | ... | @@ -493,6 +499,9 @@ public final class KryoNamespaces { |
493 | .register(ExtensionSelectorType.class) | 499 | .register(ExtensionSelectorType.class) |
494 | .register(ExtensionTreatmentType.class) | 500 | .register(ExtensionTreatmentType.class) |
495 | .register(TransactionId.class) | 501 | .register(TransactionId.class) |
502 | + .register(MapTransaction.class) | ||
503 | + .register(MapUpdate.class) | ||
504 | + .register(MapUpdate.Type.class) | ||
496 | .register(Versioned.class) | 505 | .register(Versioned.class) |
497 | .register(MapEvent.class) | 506 | .register(MapEvent.class) |
498 | .register(MapEvent.Type.class) | 507 | .register(MapEvent.Type.class) | ... | ... |
-
Please register or login to post a comment