Madan Jampani

Using latest atomix release candidate + Updates to CopycatTransport

Change-Id: I960af428ff733ee7467024811e3b3470e951ecb7
Showing 15 changed files with 99 additions and 69 deletions
...@@ -86,7 +86,7 @@ public class CopycatTransport implements Transport { ...@@ -86,7 +86,7 @@ public class CopycatTransport implements Transport {
86 86
87 /** 87 /**
88 * Maps {@link Address address} to {@link Endpoint endpoint}. 88 * Maps {@link Address address} to {@link Endpoint endpoint}.
89 - * @param address 89 + * @param address address
90 * @return end point 90 * @return end point
91 */ 91 */
92 public static Endpoint toEndpoint(Address address) { 92 public static Endpoint toEndpoint(Address address) {
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
16 package org.onosproject.store.primitives.impl; 16 package org.onosproject.store.primitives.impl;
17 17
18 import static com.google.common.base.Preconditions.checkNotNull; 18 import static com.google.common.base.Preconditions.checkNotNull;
19 +import static org.slf4j.LoggerFactory.getLogger;
19 20
20 import java.util.Set; 21 import java.util.Set;
21 import java.util.concurrent.CompletableFuture; 22 import java.util.concurrent.CompletableFuture;
...@@ -23,8 +24,10 @@ import java.util.concurrent.CompletableFuture; ...@@ -23,8 +24,10 @@ import java.util.concurrent.CompletableFuture;
23 import org.apache.commons.lang.math.RandomUtils; 24 import org.apache.commons.lang.math.RandomUtils;
24 import org.onosproject.cluster.PartitionId; 25 import org.onosproject.cluster.PartitionId;
25 import org.onosproject.store.cluster.messaging.MessagingService; 26 import org.onosproject.store.cluster.messaging.MessagingService;
27 +import org.slf4j.Logger;
26 28
27 import com.google.common.collect.Sets; 29 import com.google.common.collect.Sets;
30 +import com.google.common.primitives.Longs;
28 31
29 import io.atomix.catalyst.transport.Address; 32 import io.atomix.catalyst.transport.Address;
30 import io.atomix.catalyst.transport.Client; 33 import io.atomix.catalyst.transport.Client;
...@@ -36,26 +39,30 @@ import io.atomix.catalyst.util.concurrent.ThreadContext; ...@@ -36,26 +39,30 @@ import io.atomix.catalyst.util.concurrent.ThreadContext;
36 */ 39 */
37 public class CopycatTransportClient implements Client { 40 public class CopycatTransportClient implements Client {
38 41
42 + private final Logger log = getLogger(getClass());
39 private final PartitionId partitionId; 43 private final PartitionId partitionId;
40 private final MessagingService messagingService; 44 private final MessagingService messagingService;
41 private final CopycatTransport.Mode mode; 45 private final CopycatTransport.Mode mode;
46 + private final String newConnectionMessageSubject;
42 private final Set<CopycatTransportConnection> connections = Sets.newConcurrentHashSet(); 47 private final Set<CopycatTransportConnection> connections = Sets.newConcurrentHashSet();
43 48
44 CopycatTransportClient(PartitionId partitionId, MessagingService messagingService, CopycatTransport.Mode mode) { 49 CopycatTransportClient(PartitionId partitionId, MessagingService messagingService, CopycatTransport.Mode mode) {
45 this.partitionId = checkNotNull(partitionId); 50 this.partitionId = checkNotNull(partitionId);
46 this.messagingService = checkNotNull(messagingService); 51 this.messagingService = checkNotNull(messagingService);
47 this.mode = checkNotNull(mode); 52 this.mode = checkNotNull(mode);
53 + this.newConnectionMessageSubject = String.format("onos-copycat-server-connection-%s", partitionId);
48 } 54 }
49 55
50 @Override 56 @Override
51 public CompletableFuture<Connection> connect(Address remoteAddress) { 57 public CompletableFuture<Connection> connect(Address remoteAddress) {
52 ThreadContext context = ThreadContext.currentContextOrThrow(); 58 ThreadContext context = ThreadContext.currentContextOrThrow();
53 return messagingService.sendAndReceive(CopycatTransport.toEndpoint(remoteAddress), 59 return messagingService.sendAndReceive(CopycatTransport.toEndpoint(remoteAddress),
54 - PartitionManager.HELLO_MESSAGE_SUBJECT, 60 + newConnectionMessageSubject,
55 - "hello".getBytes()) 61 + Longs.toByteArray(nextConnectionId()))
56 - .thenApplyAsync(r -> { 62 + .thenApplyAsync(bytes -> {
63 + long connectionId = Longs.fromByteArray(bytes);
57 CopycatTransportConnection connection = new CopycatTransportConnection( 64 CopycatTransportConnection connection = new CopycatTransportConnection(
58 - nextConnectionId(), 65 + connectionId,
59 CopycatTransport.Mode.CLIENT, 66 CopycatTransport.Mode.CLIENT,
60 partitionId, 67 partitionId,
61 remoteAddress, 68 remoteAddress,
...@@ -64,6 +71,7 @@ public class CopycatTransportClient implements Client { ...@@ -64,6 +71,7 @@ public class CopycatTransportClient implements Client {
64 if (mode == CopycatTransport.Mode.CLIENT) { 71 if (mode == CopycatTransport.Mode.CLIENT) {
65 connection.setBidirectional(); 72 connection.setBidirectional();
66 } 73 }
74 + log.debug("Created new outgoing connection[id={}] to {}", connectionId, remoteAddress);
67 connections.add(connection); 75 connections.add(connection);
68 return connection; 76 return connection;
69 }, context.executor()); 77 }, context.executor());
......
...@@ -31,12 +31,14 @@ import org.apache.commons.io.IOUtils; ...@@ -31,12 +31,14 @@ import org.apache.commons.io.IOUtils;
31 import org.onlab.util.Tools; 31 import org.onlab.util.Tools;
32 import org.onosproject.cluster.PartitionId; 32 import org.onosproject.cluster.PartitionId;
33 import org.onosproject.store.cluster.messaging.MessagingService; 33 import org.onosproject.store.cluster.messaging.MessagingService;
34 +import org.slf4j.Logger;
34 35
35 import com.google.common.base.MoreObjects; 36 import com.google.common.base.MoreObjects;
36 import com.google.common.base.Throwables; 37 import com.google.common.base.Throwables;
37 import com.google.common.collect.Maps; 38 import com.google.common.collect.Maps;
38 39
39 import static com.google.common.base.Preconditions.checkNotNull; 40 import static com.google.common.base.Preconditions.checkNotNull;
41 +import static org.slf4j.LoggerFactory.getLogger;
40 import io.atomix.catalyst.transport.Address; 42 import io.atomix.catalyst.transport.Address;
41 import io.atomix.catalyst.transport.Connection; 43 import io.atomix.catalyst.transport.Connection;
42 import io.atomix.catalyst.transport.MessageHandler; 44 import io.atomix.catalyst.transport.MessageHandler;
...@@ -52,6 +54,7 @@ import io.atomix.catalyst.util.concurrent.ThreadContext; ...@@ -52,6 +54,7 @@ import io.atomix.catalyst.util.concurrent.ThreadContext;
52 */ 54 */
53 public class CopycatTransportConnection implements Connection { 55 public class CopycatTransportConnection implements Connection {
54 56
57 + private final Logger log = getLogger(getClass());
55 private final Listeners<Throwable> exceptionListeners = new Listeners<>(); 58 private final Listeners<Throwable> exceptionListeners = new Listeners<>();
56 private final Listeners<Connection> closeListeners = new Listeners<>(); 59 private final Listeners<Connection> closeListeners = new Listeners<>();
57 60
...@@ -82,11 +85,11 @@ public class CopycatTransportConnection implements Connection { ...@@ -82,11 +85,11 @@ public class CopycatTransportConnection implements Connection {
82 this.remoteAddress = checkNotNull(address); 85 this.remoteAddress = checkNotNull(address);
83 this.messagingService = checkNotNull(messagingService); 86 this.messagingService = checkNotNull(messagingService);
84 if (mode == CopycatTransport.Mode.CLIENT) { 87 if (mode == CopycatTransport.Mode.CLIENT) {
85 - this.outboundMessageSubject = String.format("onos-copycat-%s", partitionId); 88 + this.outboundMessageSubject = String.format("onos-copycat-server-%s", partitionId);
86 - this.inboundMessageSubject = String.format("onos-copycat-%s-%d", partitionId, connectionId); 89 + this.inboundMessageSubject = String.format("onos-copycat-client-%s-%d", partitionId, connectionId);
87 } else { 90 } else {
88 - this.outboundMessageSubject = String.format("onos-copycat-%s-%d", partitionId, connectionId); 91 + this.outboundMessageSubject = String.format("onos-copycat-client-%s-%d", partitionId, connectionId);
89 - this.inboundMessageSubject = String.format("onos-copycat-%s", partitionId); 92 + this.inboundMessageSubject = String.format("onos-copycat-server-%s", partitionId);
90 } 93 }
91 this.context = checkNotNull(context); 94 this.context = checkNotNull(context);
92 } 95 }
...@@ -203,6 +206,7 @@ public class CopycatTransportConnection implements Connection { ...@@ -203,6 +206,7 @@ public class CopycatTransportConnection implements Connection {
203 206
204 @Override 207 @Override
205 public CompletableFuture<Void> close() { 208 public CompletableFuture<Void> close() {
209 + log.debug("Closing connection[id={}, mode={}] to {}", connectionId, mode, remoteAddress);
206 closeListeners.forEach(listener -> listener.accept(this)); 210 closeListeners.forEach(listener -> listener.accept(this));
207 if (mode == CopycatTransport.Mode.CLIENT) { 211 if (mode == CopycatTransport.Mode.CLIENT) {
208 messagingService.unregisterHandler(inboundMessageSubject); 212 messagingService.unregisterHandler(inboundMessageSubject);
......
...@@ -35,6 +35,7 @@ import org.onosproject.store.cluster.messaging.MessagingService; ...@@ -35,6 +35,7 @@ import org.onosproject.store.cluster.messaging.MessagingService;
35 import org.slf4j.Logger; 35 import org.slf4j.Logger;
36 36
37 import com.google.common.collect.Maps; 37 import com.google.common.collect.Maps;
38 +import com.google.common.primitives.Longs;
38 39
39 import io.atomix.catalyst.transport.Address; 40 import io.atomix.catalyst.transport.Address;
40 import io.atomix.catalyst.transport.Connection; 41 import io.atomix.catalyst.transport.Connection;
...@@ -54,13 +55,15 @@ public class CopycatTransportServer implements Server { ...@@ -54,13 +55,15 @@ public class CopycatTransportServer implements Server {
54 private final ScheduledExecutorService executorService; 55 private final ScheduledExecutorService executorService;
55 private final PartitionId partitionId; 56 private final PartitionId partitionId;
56 private final MessagingService messagingService; 57 private final MessagingService messagingService;
57 - private final String messageSubject; 58 + private final String protocolMessageSubject;
59 + private final String newConnectionMessageSubject;
58 private final Map<Long, CopycatTransportConnection> connections = Maps.newConcurrentMap(); 60 private final Map<Long, CopycatTransportConnection> connections = Maps.newConcurrentMap();
59 61
60 CopycatTransportServer(PartitionId partitionId, MessagingService messagingService) { 62 CopycatTransportServer(PartitionId partitionId, MessagingService messagingService) {
61 this.partitionId = checkNotNull(partitionId); 63 this.partitionId = checkNotNull(partitionId);
62 this.messagingService = checkNotNull(messagingService); 64 this.messagingService = checkNotNull(messagingService);
63 - this.messageSubject = String.format("onos-copycat-%s", partitionId); 65 + this.protocolMessageSubject = String.format("onos-copycat-server-%s", partitionId);
66 + this.newConnectionMessageSubject = String.format("onos-copycat-server-connection-%s", partitionId);
64 this.executorService = Executors.newScheduledThreadPool(Runtime.getRuntime().availableProcessors(), 67 this.executorService = Executors.newScheduledThreadPool(Runtime.getRuntime().availableProcessors(),
65 new CatalystThreadFactory("copycat-server-p" + partitionId + "-%d")); 68 new CatalystThreadFactory("copycat-server-p" + partitionId + "-%d"));
66 } 69 }
...@@ -68,49 +71,49 @@ public class CopycatTransportServer implements Server { ...@@ -68,49 +71,49 @@ public class CopycatTransportServer implements Server {
68 @Override 71 @Override
69 public CompletableFuture<Void> listen(Address address, Consumer<Connection> listener) { 72 public CompletableFuture<Void> listen(Address address, Consumer<Connection> listener) {
70 if (listening.compareAndSet(false, true)) { 73 if (listening.compareAndSet(false, true)) {
74 + // message handler for all non-connection-establishment messages.
75 + messagingService.registerHandler(protocolMessageSubject, (sender, payload) -> {
76 + try (DataInputStream input = new DataInputStream(new ByteArrayInputStream(payload))) {
77 + long connectionId = input.readLong();
78 + CopycatTransportConnection connection = connections.get(connectionId);
79 + if (connection == null) {
80 + throw new IOException("Closed connection");
81 + }
82 + byte[] messagePayload = IOUtils.toByteArray(input);
83 + return connection.handle(messagePayload);
84 + } catch (IOException e) {
85 + return Tools.exceptionalFuture(e);
86 + }
87 + });
88 +
89 + // message handler for new connection attempts.
71 ThreadContext context = ThreadContext.currentContextOrThrow(); 90 ThreadContext context = ThreadContext.currentContextOrThrow();
72 - listen(address, listener, context); 91 + messagingService.registerHandler(newConnectionMessageSubject, (sender, payload) -> {
92 + long connectionId = Longs.fromByteArray(payload);
93 + CopycatTransportConnection connection = new CopycatTransportConnection(connectionId,
94 + CopycatTransport.Mode.SERVER,
95 + partitionId,
96 + CopycatTransport.toAddress(sender),
97 + messagingService,
98 + getOrCreateContext(context));
99 + connections.put(connectionId, connection);
100 + connection.closeListener(c -> connections.remove(connectionId, c));
101 + log.debug("Created new incoming connection[id={}] from {}", connectionId, sender);
102 + return CompletableFuture.supplyAsync(() -> {
103 + listener.accept(connection);
104 + // echo the connectionId back to indicate successful completion.
105 + return payload;
106 + }, context.executor());
107 + });
108 + context.execute(() -> listenFuture.complete(null));
73 } 109 }
74 return listenFuture; 110 return listenFuture;
75 } 111 }
76 112
77 - private void listen(Address address, Consumer<Connection> listener, ThreadContext context) {
78 - messagingService.registerHandler(messageSubject, (sender, payload) -> {
79 - try (DataInputStream input = new DataInputStream(new ByteArrayInputStream(payload))) {
80 - long connectionId = input.readLong();
81 - AtomicBoolean newConnectionCreated = new AtomicBoolean(false);
82 - CopycatTransportConnection connection = connections.computeIfAbsent(connectionId, k -> {
83 - newConnectionCreated.set(true);
84 - CopycatTransportConnection newConnection = new CopycatTransportConnection(connectionId,
85 - CopycatTransport.Mode.SERVER,
86 - partitionId,
87 - CopycatTransport.toAddress(sender),
88 - messagingService,
89 - getOrCreateContext(context));
90 - log.debug("Created new incoming connection {}", connectionId);
91 - newConnection.closeListener(c -> connections.remove(connectionId, c));
92 - return newConnection;
93 - });
94 - byte[] request = IOUtils.toByteArray(input);
95 - return CompletableFuture.supplyAsync(
96 - () -> {
97 - if (newConnectionCreated.get()) {
98 - listener.accept(connection);
99 - }
100 - return connection;
101 - }, context.executor()).thenCompose(c -> c.handle(request));
102 - } catch (IOException e) {
103 - return Tools.exceptionalFuture(e);
104 - }
105 - });
106 - context.execute(() -> {
107 - listenFuture.complete(null);
108 - });
109 - }
110 -
111 @Override 113 @Override
112 public CompletableFuture<Void> close() { 114 public CompletableFuture<Void> close() {
113 - messagingService.unregisterHandler(messageSubject); 115 + messagingService.unregisterHandler(newConnectionMessageSubject);
116 + messagingService.unregisterHandler(protocolMessageSubject);
114 executorService.shutdown(); 117 executorService.shutdown();
115 return CompletableFuture.completedFuture(null); 118 return CompletableFuture.completedFuture(null);
116 } 119 }
......
...@@ -54,7 +54,7 @@ public class DefaultCatalystTypeSerializerFactory implements TypeSerializerFacto ...@@ -54,7 +54,7 @@ public class DefaultCatalystTypeSerializerFactory implements TypeSerializerFacto
54 } 54 }
55 55
56 @Override 56 @Override
57 - public void write(T object, BufferOutput<?> buffer, 57 + public void write(T object, BufferOutput buffer,
58 io.atomix.catalyst.serializer.Serializer serializer) { 58 io.atomix.catalyst.serializer.Serializer serializer) {
59 try { 59 try {
60 byte[] payload = this.serializer.encode(object); 60 byte[] payload = this.serializer.encode(object);
...@@ -66,7 +66,7 @@ public class DefaultCatalystTypeSerializerFactory implements TypeSerializerFacto ...@@ -66,7 +66,7 @@ public class DefaultCatalystTypeSerializerFactory implements TypeSerializerFacto
66 } 66 }
67 67
68 @Override 68 @Override
69 - public T read(Class<T> type, BufferInput<?> buffer, 69 + public T read(Class<T> type, BufferInput buffer,
70 io.atomix.catalyst.serializer.Serializer serializer) { 70 io.atomix.catalyst.serializer.Serializer serializer) {
71 int size = buffer.readInt(); 71 int size = buffer.readInt();
72 try { 72 try {
......
...@@ -27,6 +27,7 @@ import java.util.stream.Collectors; ...@@ -27,6 +27,7 @@ import java.util.stream.Collectors;
27 27
28 import org.apache.felix.scr.annotations.Activate; 28 import org.apache.felix.scr.annotations.Activate;
29 import org.apache.felix.scr.annotations.Component; 29 import org.apache.felix.scr.annotations.Component;
30 +import org.apache.felix.scr.annotations.Deactivate;
30 import org.apache.felix.scr.annotations.Reference; 31 import org.apache.felix.scr.annotations.Reference;
31 import org.apache.felix.scr.annotations.ReferenceCardinality; 32 import org.apache.felix.scr.annotations.ReferenceCardinality;
32 import org.apache.felix.scr.annotations.Service; 33 import org.apache.felix.scr.annotations.Service;
...@@ -56,7 +57,6 @@ import com.google.common.collect.Maps; ...@@ -56,7 +57,6 @@ import com.google.common.collect.Maps;
56 public class PartitionManager extends AbstractListenerManager<PartitionEvent, PartitionEventListener> 57 public class PartitionManager extends AbstractListenerManager<PartitionEvent, PartitionEventListener>
57 implements PartitionService, PartitionAdminService { 58 implements PartitionService, PartitionAdminService {
58 59
59 - public static final String HELLO_MESSAGE_SUBJECT = "partition-manager-hello";
60 private final Logger log = getLogger(getClass()); 60 private final Logger log = getLogger(getClass());
61 61
62 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 62 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
...@@ -72,8 +72,6 @@ public class PartitionManager extends AbstractListenerManager<PartitionEvent, Pa ...@@ -72,8 +72,6 @@ public class PartitionManager extends AbstractListenerManager<PartitionEvent, Pa
72 72
73 @Activate 73 @Activate
74 public void activate() { 74 public void activate() {
75 - messagingService.registerHandler(HELLO_MESSAGE_SUBJECT,
76 - (ep, input) -> CompletableFuture.completedFuture(input));
77 eventDispatcher.addSink(PartitionEvent.class, listenerRegistry); 75 eventDispatcher.addSink(PartitionEvent.class, listenerRegistry);
78 76
79 metadataService.getClusterMetadata() 77 metadataService.getClusterMetadata()
...@@ -93,8 +91,8 @@ public class PartitionManager extends AbstractListenerManager<PartitionEvent, Pa ...@@ -93,8 +91,8 @@ public class PartitionManager extends AbstractListenerManager<PartitionEvent, Pa
93 log.info("Started"); 91 log.info("Started");
94 } 92 }
95 93
94 + @Deactivate
96 public void deactivate() { 95 public void deactivate() {
97 - messagingService.unregisterHandler(HELLO_MESSAGE_SUBJECT);
98 eventDispatcher.removeSink(PartitionEvent.class); 96 eventDispatcher.removeSink(PartitionEvent.class);
99 97
100 CompletableFuture<Void> closeFuture = CompletableFuture.allOf(partitions.values() 98 CompletableFuture<Void> closeFuture = CompletableFuture.allOf(partitions.values()
......
...@@ -90,7 +90,7 @@ public class StorageManager implements StorageService, StorageAdminService { ...@@ -90,7 +90,7 @@ public class StorageManager implements StorageService, StorageAdminService {
90 private TransactionCoordinator transactionCoordinator; 90 private TransactionCoordinator transactionCoordinator;
91 91
92 @Activate 92 @Activate
93 - public void actiavte() { 93 + public void activate() {
94 basePrimitiveCreator = partitionService.getDistributedPrimitiveCreator(PartitionId.from(0)); 94 basePrimitiveCreator = partitionService.getDistributedPrimitiveCreator(PartitionId.from(0));
95 Map<PartitionId, DistributedPrimitiveCreator> partitionMap = Maps.newHashMap(); 95 Map<PartitionId, DistributedPrimitiveCreator> partitionMap = Maps.newHashMap();
96 partitionService.getAllPartitionIds().stream() 96 partitionService.getAllPartitionIds().stream()
......
...@@ -19,14 +19,14 @@ import io.atomix.copycat.server.cluster.Member; ...@@ -19,14 +19,14 @@ import io.atomix.copycat.server.cluster.Member;
19 19
20 import java.util.Collection; 20 import java.util.Collection;
21 import java.util.Set; 21 import java.util.Set;
22 +import java.util.function.Function;
23 +import java.util.stream.Collectors;
22 24
23 import org.onosproject.cluster.PartitionId; 25 import org.onosproject.cluster.PartitionId;
24 import org.onosproject.store.service.PartitionInfo; 26 import org.onosproject.store.service.PartitionInfo;
25 27
26 import com.google.common.base.MoreObjects; 28 import com.google.common.base.MoreObjects;
27 -import com.google.common.collect.ImmutableList;
28 import com.google.common.collect.ImmutableSet; 29 import com.google.common.collect.ImmutableSet;
29 -import com.google.common.collect.Lists;
30 30
31 /** 31 /**
32 * Operational details for a {@code StoragePartition}. 32 * Operational details for a {@code StoragePartition}.
...@@ -98,9 +98,11 @@ public class StoragePartitionDetails { ...@@ -98,9 +98,11 @@ public class StoragePartitionDetails {
98 * @return partition info 98 * @return partition info
99 */ 99 */
100 public PartitionInfo toPartitionInfo() { 100 public PartitionInfo toPartitionInfo() {
101 + Function<Member, String> memberToString =
102 + m -> m == null ? "none" : String.format("%s:%d", m.address().host(), m.address().port());
101 return new PartitionInfo(partitionId.toString(), 103 return new PartitionInfo(partitionId.toString(),
102 leaderTerm, 104 leaderTerm,
103 - Lists.transform(ImmutableList.copyOf(activeMembers), m -> m.address().toString()), 105 + activeMembers.stream().map(memberToString).collect(Collectors.toList()),
104 - leader == null ? "none" : leader.address().toString()); 106 + memberToString.apply(leader));
105 } 107 }
106 } 108 }
......
...@@ -22,6 +22,7 @@ import io.atomix.catalyst.transport.Transport; ...@@ -22,6 +22,7 @@ import io.atomix.catalyst.transport.Transport;
22 import io.atomix.copycat.server.CopycatServer; 22 import io.atomix.copycat.server.CopycatServer;
23 import io.atomix.copycat.server.storage.Storage; 23 import io.atomix.copycat.server.storage.Storage;
24 import io.atomix.copycat.server.storage.StorageLevel; 24 import io.atomix.copycat.server.storage.StorageLevel;
25 +import io.atomix.manager.ResourceManagerTypeResolver;
25 import io.atomix.manager.state.ResourceManagerState; 26 import io.atomix.manager.state.ResourceManagerState;
26 import io.atomix.resource.ResourceRegistry; 27 import io.atomix.resource.ResourceRegistry;
27 import io.atomix.resource.ResourceType; 28 import io.atomix.resource.ResourceType;
...@@ -107,7 +108,7 @@ public class StoragePartitionServer implements Managed<StoragePartitionServer> { ...@@ -107,7 +108,7 @@ public class StoragePartitionServer implements Managed<StoragePartitionServer> {
107 ResourceRegistry registry = new ResourceRegistry(); 108 ResourceRegistry registry = new ResourceRegistry();
108 resourceTypes.forEach(registry::register); 109 resourceTypes.forEach(registry::register);
109 resourceResolver.resolve(registry); 110 resourceResolver.resolve(registry);
110 - return CopycatServer.builder(localAddress, partition.getMemberAddresses()) 111 + CopycatServer server = CopycatServer.builder(localAddress, partition.getMemberAddresses())
111 .withName("partition-" + partition.getId()) 112 .withName("partition-" + partition.getId())
112 .withSerializer(serializer.clone()) 113 .withSerializer(serializer.clone())
113 .withTransport(transport.get()) 114 .withTransport(transport.get())
...@@ -119,6 +120,8 @@ public class StoragePartitionServer implements Managed<StoragePartitionServer> { ...@@ -119,6 +120,8 @@ public class StoragePartitionServer implements Managed<StoragePartitionServer> {
119 .withMaxEntriesPerSegment(MAX_ENTRIES_PER_LOG_SEGMENT) 120 .withMaxEntriesPerSegment(MAX_ENTRIES_PER_LOG_SEGMENT)
120 .build()) 121 .build())
121 .build(); 122 .build();
123 + server.serializer().resolve(new ResourceManagerTypeResolver(registry));
124 + return server;
122 } 125 }
123 126
124 public Set<NodeId> configuredMembers() { 127 public Set<NodeId> configuredMembers() {
......
...@@ -43,8 +43,10 @@ import com.google.common.collect.Sets; ...@@ -43,8 +43,10 @@ import com.google.common.collect.Sets;
43 /** 43 /**
44 * Distributed resource providing the {@link AsyncConsistentMap} primitive. 44 * Distributed resource providing the {@link AsyncConsistentMap} primitive.
45 */ 45 */
46 -@ResourceTypeInfo(id = -151, stateMachine = AtomixConsistentMapState.class) 46 +@ResourceTypeInfo(id = -151,
47 -public class AtomixConsistentMap extends Resource<AtomixConsistentMap, Resource.Options> 47 + stateMachine = AtomixConsistentMapState.class,
48 + typeResolver = AtomixConsistentMapCommands.TypeResolver.class)
49 +public class AtomixConsistentMap extends Resource<AtomixConsistentMap>
48 implements AsyncConsistentMap<String, byte[]> { 50 implements AsyncConsistentMap<String, byte[]> {
49 51
50 private final Set<MapEventListener<String, byte[]>> mapEventListeners = Sets.newCopyOnWriteArraySet(); 52 private final Set<MapEventListener<String, byte[]>> mapEventListeners = Sets.newCopyOnWriteArraySet();
......
...@@ -26,6 +26,7 @@ import io.atomix.copycat.server.session.SessionListener; ...@@ -26,6 +26,7 @@ import io.atomix.copycat.server.session.SessionListener;
26 import io.atomix.copycat.server.storage.snapshot.SnapshotReader; 26 import io.atomix.copycat.server.storage.snapshot.SnapshotReader;
27 import io.atomix.copycat.server.storage.snapshot.SnapshotWriter; 27 import io.atomix.copycat.server.storage.snapshot.SnapshotWriter;
28 import io.atomix.resource.ResourceStateMachine; 28 import io.atomix.resource.ResourceStateMachine;
29 +import io.atomix.resource.ResourceType;
29 30
30 import java.util.Collection; 31 import java.util.Collection;
31 import java.util.HashMap; 32 import java.util.HashMap;
...@@ -69,12 +70,17 @@ import static com.google.common.base.Preconditions.checkState; ...@@ -69,12 +70,17 @@ import static com.google.common.base.Preconditions.checkState;
69 * State Machine for {@link AtomixConsistentMap} resource. 70 * State Machine for {@link AtomixConsistentMap} resource.
70 */ 71 */
71 public class AtomixConsistentMapState extends ResourceStateMachine implements SessionListener, Snapshottable { 72 public class AtomixConsistentMapState extends ResourceStateMachine implements SessionListener, Snapshottable {
73 +
72 private final Map<Long, Commit<? extends AtomixConsistentMapCommands.Listen>> listeners = new HashMap<>(); 74 private final Map<Long, Commit<? extends AtomixConsistentMapCommands.Listen>> listeners = new HashMap<>();
73 private final Map<String, MapEntryValue> mapEntries = new HashMap<>(); 75 private final Map<String, MapEntryValue> mapEntries = new HashMap<>();
74 private final Set<String> preparedKeys = Sets.newHashSet(); 76 private final Set<String> preparedKeys = Sets.newHashSet();
75 private final Map<TransactionId, Commit<? extends TransactionPrepare>> pendingTransactions = Maps.newHashMap(); 77 private final Map<TransactionId, Commit<? extends TransactionPrepare>> pendingTransactions = Maps.newHashMap();
76 private AtomicLong versionCounter = new AtomicLong(0); 78 private AtomicLong versionCounter = new AtomicLong(0);
77 79
80 + public AtomixConsistentMapState() {
81 + super(new ResourceType(AtomixConsistentMap.class));
82 + }
83 +
78 @Override 84 @Override
79 public void snapshot(SnapshotWriter writer) { 85 public void snapshot(SnapshotWriter writer) {
80 writer.writeLong(versionCounter.get()); 86 writer.writeLong(versionCounter.get());
......
...@@ -25,7 +25,6 @@ import java.util.Set; ...@@ -25,7 +25,6 @@ import java.util.Set;
25 import java.util.concurrent.CompletableFuture; 25 import java.util.concurrent.CompletableFuture;
26 import java.util.function.Consumer; 26 import java.util.function.Consumer;
27 27
28 -import org.onlab.util.SharedExecutors;
29 import org.onosproject.cluster.Leadership; 28 import org.onosproject.cluster.Leadership;
30 import org.onosproject.cluster.NodeId; 29 import org.onosproject.cluster.NodeId;
31 import org.onosproject.event.Change; 30 import org.onosproject.event.Change;
...@@ -36,8 +35,10 @@ import com.google.common.collect.Sets; ...@@ -36,8 +35,10 @@ import com.google.common.collect.Sets;
36 /** 35 /**
37 * Distributed resource providing the {@link AsyncLeaderElector} primitive. 36 * Distributed resource providing the {@link AsyncLeaderElector} primitive.
38 */ 37 */
39 -@ResourceTypeInfo(id = -152, stateMachine = AtomixLeaderElectorState.class) 38 +@ResourceTypeInfo(id = -152,
40 -public class AtomixLeaderElector extends Resource<AtomixLeaderElector, Resource.Options> 39 + stateMachine = AtomixLeaderElectorState.class,
40 + typeResolver = AtomixLeaderElectorCommands.TypeResolver.class)
41 +public class AtomixLeaderElector extends Resource<AtomixLeaderElector>
41 implements AsyncLeaderElector { 42 implements AsyncLeaderElector {
42 private final Set<Consumer<Change<Leadership>>> leadershipChangeListeners = 43 private final Set<Consumer<Change<Leadership>>> leadershipChangeListeners =
43 Sets.newConcurrentHashSet(); 44 Sets.newConcurrentHashSet();
...@@ -62,8 +63,7 @@ public class AtomixLeaderElector extends Resource<AtomixLeaderElector, Resource. ...@@ -62,8 +63,7 @@ public class AtomixLeaderElector extends Resource<AtomixLeaderElector, Resource.
62 } 63 }
63 64
64 private void handleEvent(Change<Leadership> change) { 65 private void handleEvent(Change<Leadership> change) {
65 - SharedExecutors.getSingleThreadExecutor().execute(() -> 66 + leadershipChangeListeners.forEach(l -> l.accept(change));
66 - leadershipChangeListeners.forEach(l -> l.accept(change)));
67 } 67 }
68 68
69 @Override 69 @Override
......
...@@ -24,6 +24,7 @@ import io.atomix.copycat.server.session.SessionListener; ...@@ -24,6 +24,7 @@ import io.atomix.copycat.server.session.SessionListener;
24 import io.atomix.copycat.server.storage.snapshot.SnapshotReader; 24 import io.atomix.copycat.server.storage.snapshot.SnapshotReader;
25 import io.atomix.copycat.server.storage.snapshot.SnapshotWriter; 25 import io.atomix.copycat.server.storage.snapshot.SnapshotWriter;
26 import io.atomix.resource.ResourceStateMachine; 26 import io.atomix.resource.ResourceStateMachine;
27 +import io.atomix.resource.ResourceType;
27 28
28 import java.util.Arrays; 29 import java.util.Arrays;
29 import java.util.HashMap; 30 import java.util.HashMap;
...@@ -72,6 +73,10 @@ public class AtomixLeaderElectorState extends ResourceStateMachine ...@@ -72,6 +73,10 @@ public class AtomixLeaderElectorState extends ResourceStateMachine
72 ElectionState.class, 73 ElectionState.class,
73 Registration.class); 74 Registration.class);
74 75
76 + public AtomixLeaderElectorState() {
77 + super(new ResourceType(AtomixLeaderElector.class));
78 + }
79 +
75 @Override 80 @Override
76 protected void configure(StateMachineExecutor executor) { 81 protected void configure(StateMachineExecutor executor) {
77 // Notification 82 // Notification
...@@ -261,7 +266,7 @@ public class AtomixLeaderElectorState extends ResourceStateMachine ...@@ -261,7 +266,7 @@ public class AtomixLeaderElectorState extends ResourceStateMachine
261 } 266 }
262 267
263 private void onSessionEnd(Session session) { 268 private void onSessionEnd(Session session) {
264 - Commit<? extends AtomixLeaderElectorCommands.Listen> listener = listeners.remove(session); 269 + Commit<? extends AtomixLeaderElectorCommands.Listen> listener = listeners.remove(session.id());
265 if (listener != null) { 270 if (listener != null) {
266 listener.close(); 271 listener.close();
267 } 272 }
......
...@@ -110,7 +110,6 @@ public abstract class AtomixTestBase { ...@@ -110,7 +110,6 @@ public abstract class AtomixTestBase {
110 .withStorage(Storage.builder() 110 .withStorage(Storage.builder()
111 .withStorageLevel(StorageLevel.DISK) 111 .withStorageLevel(StorageLevel.DISK)
112 .withDirectory(TEST_DIR + "/" + address.port()) 112 .withDirectory(TEST_DIR + "/" + address.port())
113 - .withSerializer(serializer.clone())
114 .build()) 113 .build())
115 .withStateMachine(() -> new ResourceManagerState(resourceRegistry)) 114 .withStateMachine(() -> new ResourceManagerState(resourceRegistry))
116 .withSerializer(serializer.clone()) 115 .withSerializer(serializer.clone())
......
...@@ -79,7 +79,7 @@ ...@@ -79,7 +79,7 @@
79 <onos-build-conf.version>1.2-SNAPSHOT</onos-build-conf.version> 79 <onos-build-conf.version>1.2-SNAPSHOT</onos-build-conf.version>
80 <netty4.version>4.0.33.Final</netty4.version> 80 <netty4.version>4.0.33.Final</netty4.version>
81 <!-- TODO: replace with final release version when it is out --> 81 <!-- TODO: replace with final release version when it is out -->
82 - <atomix.version>0.1.0-beta5</atomix.version> 82 + <atomix.version>1.0.0-rc1</atomix.version>
83 <copycat.version>0.5.1.onos</copycat.version> 83 <copycat.version>0.5.1.onos</copycat.version>
84 <openflowj.version>0.9.1.onos</openflowj.version> 84 <openflowj.version>0.9.1.onos</openflowj.version>
85 <onos-maven-plugin.version>1.8-SNAPSHOT</onos-maven-plugin.version> 85 <onos-maven-plugin.version>1.8-SNAPSHOT</onos-maven-plugin.version>
......