Committed by
Gerrit Code Review
Support for reacting to underlying copycat client session state changes
Change-Id: If8af43f81963653da3584167d7a9813456ce3773
Showing
1 changed file
with
46 additions
and
5 deletions
| ... | @@ -18,9 +18,22 @@ package org.onosproject.store.primitives.impl; | ... | @@ -18,9 +18,22 @@ package org.onosproject.store.primitives.impl; |
| 18 | import static org.slf4j.LoggerFactory.getLogger; | 18 | import static org.slf4j.LoggerFactory.getLogger; |
| 19 | import io.atomix.Atomix; | 19 | import io.atomix.Atomix; |
| 20 | import io.atomix.AtomixClient; | 20 | import io.atomix.AtomixClient; |
| 21 | +import io.atomix.catalyst.transport.Address; | ||
| 21 | import io.atomix.catalyst.transport.Transport; | 22 | import io.atomix.catalyst.transport.Transport; |
| 23 | +import io.atomix.catalyst.util.concurrent.CatalystThreadFactory; | ||
| 24 | +import io.atomix.copycat.client.ConnectionStrategies; | ||
| 25 | +import io.atomix.copycat.client.CopycatClient; | ||
| 26 | +import io.atomix.copycat.client.RecoveryStrategies; | ||
| 27 | +import io.atomix.copycat.client.RetryStrategies; | ||
| 28 | +import io.atomix.copycat.client.ServerSelectionStrategies; | ||
| 29 | +import io.atomix.manager.ResourceClient; | ||
| 30 | +import io.atomix.manager.state.ResourceManagerException; | ||
| 31 | +import io.atomix.manager.util.ResourceManagerTypeResolver; | ||
| 32 | +import io.atomix.resource.ResourceType; | ||
| 33 | +import io.atomix.resource.util.ResourceRegistry; | ||
| 22 | import io.atomix.variables.DistributedLong; | 34 | import io.atomix.variables.DistributedLong; |
| 23 | 35 | ||
| 36 | +import java.util.Collection; | ||
| 24 | import java.util.Set; | 37 | import java.util.Set; |
| 25 | import java.util.concurrent.CompletableFuture; | 38 | import java.util.concurrent.CompletableFuture; |
| 26 | 39 | ||
| ... | @@ -53,6 +66,7 @@ public class StoragePartitionClient implements DistributedPrimitiveCreator, Mana | ... | @@ -53,6 +66,7 @@ public class StoragePartitionClient implements DistributedPrimitiveCreator, Mana |
| 53 | private final Transport transport; | 66 | private final Transport transport; |
| 54 | private final io.atomix.catalyst.serializer.Serializer serializer; | 67 | private final io.atomix.catalyst.serializer.Serializer serializer; |
| 55 | private Atomix client; | 68 | private Atomix client; |
| 69 | + private CopycatClient copycatClient; | ||
| 56 | private static final String ATOMIC_VALUES_CONSISTENT_MAP_NAME = "onos-atomic-values"; | 70 | private static final String ATOMIC_VALUES_CONSISTENT_MAP_NAME = "onos-atomic-values"; |
| 57 | private final Supplier<AsyncConsistentMap<String, byte[]>> onosAtomicValuesMap = | 71 | private final Supplier<AsyncConsistentMap<String, byte[]>> onosAtomicValuesMap = |
| 58 | Suppliers.memoize(() -> newAsyncConsistentMap(ATOMIC_VALUES_CONSISTENT_MAP_NAME, | 72 | Suppliers.memoize(() -> newAsyncConsistentMap(ATOMIC_VALUES_CONSISTENT_MAP_NAME, |
| ... | @@ -72,11 +86,12 @@ public class StoragePartitionClient implements DistributedPrimitiveCreator, Mana | ... | @@ -72,11 +86,12 @@ public class StoragePartitionClient implements DistributedPrimitiveCreator, Mana |
| 72 | return CompletableFuture.completedFuture(null); | 86 | return CompletableFuture.completedFuture(null); |
| 73 | } | 87 | } |
| 74 | synchronized (StoragePartitionClient.this) { | 88 | synchronized (StoragePartitionClient.this) { |
| 75 | - client = AtomixClient.builder(partition.getMemberAddresses()) | 89 | + copycatClient = newCopycatClient(partition.getMemberAddresses(), |
| 76 | - .withResourceTypes(StoragePartition.RESOURCE_TYPES) | 90 | + transport, |
| 77 | - .withSerializer(serializer.clone()) | 91 | + serializer.clone(), |
| 78 | - .withTransport(transport) | 92 | + StoragePartition.RESOURCE_TYPES); |
| 79 | - .build(); | 93 | + copycatClient.onStateChange(state -> log.info("Client state {}", state)); |
| 94 | + client = new AtomixClient(new ResourceClient(copycatClient)); | ||
| 80 | } | 95 | } |
| 81 | return client.open().whenComplete((r, e) -> { | 96 | return client.open().whenComplete((r, e) -> { |
| 82 | if (e == null) { | 97 | if (e == null) { |
| ... | @@ -154,4 +169,30 @@ public class StoragePartitionClient implements DistributedPrimitiveCreator, Mana | ... | @@ -154,4 +169,30 @@ public class StoragePartitionClient implements DistributedPrimitiveCreator, Mana |
| 154 | public boolean isOpen() { | 169 | public boolean isOpen() { |
| 155 | return client.isOpen(); | 170 | return client.isOpen(); |
| 156 | } | 171 | } |
| 172 | + | ||
| 173 | + private CopycatClient newCopycatClient(Collection<Address> members, | ||
| 174 | + Transport transport, | ||
| 175 | + io.atomix.catalyst.serializer.Serializer serializer, | ||
| 176 | + Collection<ResourceType> resourceTypes) { | ||
| 177 | + ResourceRegistry registry = new ResourceRegistry(); | ||
| 178 | + resourceTypes.forEach(registry::register); | ||
| 179 | + CopycatClient client = CopycatClient.builder(members) | ||
| 180 | + .withServerSelectionStrategy(ServerSelectionStrategies.ANY) | ||
| 181 | + .withConnectionStrategy(ConnectionStrategies.FIBONACCI_BACKOFF) | ||
| 182 | + .withRecoveryStrategy(RecoveryStrategies.RECOVER) | ||
| 183 | + .withRetryStrategy(RetryStrategies.FIBONACCI_BACKOFF) | ||
| 184 | + .withTransport(transport) | ||
| 185 | + .withSerializer(serializer) | ||
| 186 | + .withThreadFactory(new CatalystThreadFactory(String.format("copycat-client-%s", partition.getId()))) | ||
| 187 | + .build(); | ||
| 188 | + client.serializer().resolve(new ResourceManagerTypeResolver()); | ||
| 189 | + for (ResourceType type : registry.types()) { | ||
| 190 | + try { | ||
| 191 | + type.factory().newInstance().createSerializableTypeResolver().resolve(client.serializer().registry()); | ||
| 192 | + } catch (InstantiationException | IllegalAccessException e) { | ||
| 193 | + throw new ResourceManagerException(e); | ||
| 194 | + } | ||
| 195 | + } | ||
| 196 | + return client; | ||
| 197 | + } | ||
| 157 | } | 198 | } | ... | ... |
-
Please register or login to post a comment