2 * Copyright (c) 2015 Brocade Communications Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.controller.cluster.datastore.shardmanager;
10 import static java.util.Objects.requireNonNull;
12 import akka.actor.Address;
13 import akka.actor.AddressFromURIString;
14 import java.util.ArrayList;
15 import java.util.Collection;
18 import java.util.concurrent.ConcurrentHashMap;
19 import java.util.concurrent.ConcurrentMap;
20 import org.opendaylight.controller.cluster.access.concepts.MemberName;
21 import org.opendaylight.controller.cluster.datastore.identifiers.ShardIdentifier;
22 import org.opendaylight.controller.cluster.datastore.identifiers.ShardManagerIdentifier;
23 import org.opendaylight.controller.cluster.raft.PeerAddressResolver;
26 * Implementation PeerAddressResolver that resolves address for shard peer ids. This class is owned by the
27 * ShardMaanager and passed to Shard actors via the ConfigParams.
29 * @author Thomas Pantelis
31 class ShardPeerAddressResolver implements PeerAddressResolver {
32 // Stores a mapping between a member name and the address of the member. The map is concurrent as it
33 // will be accessed by multiple threads via the public resolve method.
34 private final ConcurrentMap<MemberName, Address> memberNameToAddress = new ConcurrentHashMap<>();
35 private final String shardManagerIdentifier;
36 private final String shardManagerType;
37 private final MemberName localMemberName;
39 ShardPeerAddressResolver(final String shardManagerType, final MemberName localMemberName) {
40 this.shardManagerIdentifier = ShardManagerIdentifier.builder().type(shardManagerType).build().toString();
41 this.shardManagerType = shardManagerType;
42 this.localMemberName = requireNonNull(localMemberName);
45 void addPeerAddress(final MemberName memberName, final Address address) {
46 memberNameToAddress.put(memberName, address);
49 void removePeerAddress(final MemberName memberName) {
50 memberNameToAddress.remove(memberName);
53 Set<MemberName> getPeerMembers() {
54 return this.memberNameToAddress.keySet();
57 Address getPeerAddress(final MemberName memberName) {
58 return memberNameToAddress.get(memberName);
61 Collection<String> getShardManagerPeerActorAddresses() {
62 Collection<String> peerAddresses = new ArrayList<>();
63 for (Map.Entry<MemberName, Address> entry: memberNameToAddress.entrySet()) {
64 if (!localMemberName.equals(entry.getKey())) {
65 peerAddresses.add(getShardManagerActorPathBuilder(entry.getValue()).toString());
72 ShardIdentifier getShardIdentifier(final MemberName memberName, final String shardName) {
73 return ShardIdentifier.create(shardName, memberName, shardManagerType);
76 String getShardActorAddress(final String shardName, final MemberName memberName) {
77 Address memberAddress = memberNameToAddress.get(memberName);
78 if (memberAddress != null) {
79 return getShardManagerActorPathBuilder(memberAddress).append("/").append(
80 getShardIdentifier(memberName, shardName)).toString();
86 StringBuilder getShardManagerActorPathBuilder(final Address address) {
87 return new StringBuilder().append(address.toString()).append("/user/").append(shardManagerIdentifier);
91 public String resolve(final String peerId) {
96 ShardIdentifier shardId = ShardIdentifier.fromShardIdString(peerId);
97 return getShardActorAddress(shardId.getShardName(), shardId.getMemberName());
101 public void setResolved(final String peerId, final String address) {
102 memberNameToAddress.put(ShardIdentifier.fromShardIdString(peerId).getMemberName(),
103 AddressFromURIString.parse(address));