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 akka.actor.Address;
11 import java.util.ArrayList;
12 import java.util.Collection;
14 import java.util.concurrent.ConcurrentHashMap;
15 import java.util.concurrent.ConcurrentMap;
16 import org.opendaylight.controller.cluster.datastore.identifiers.ShardIdentifier;
17 import org.opendaylight.controller.cluster.datastore.identifiers.ShardManagerIdentifier;
18 import org.opendaylight.controller.cluster.raft.PeerAddressResolver;
21 * Implementation PeerAddressResolver that resolves address for shard peer ids. This class is owned by the
22 * ShardMaanager and passed to Shard actors via the ConfigParams.
24 * @author Thomas Pantelis
26 class ShardPeerAddressResolver implements PeerAddressResolver {
27 // Stores a mapping between a member name and the address of the member. The map is concurrent as it
28 // will be accessed by multiple threads via the public resolve method.
29 private final ConcurrentMap<String, Address> memberNameToAddress = new ConcurrentHashMap<>();
30 private final String shardManagerIdentifier;
31 private final String shardManagerType;
32 private final String localMemberName;
34 public ShardPeerAddressResolver(String shardManagerType, String localMemberName) {
35 this.shardManagerIdentifier = ShardManagerIdentifier.builder().type(shardManagerType).build().toString();
36 this.shardManagerType = shardManagerType;
37 this.localMemberName = localMemberName;
40 void addPeerAddress(String memberName, Address address) {
41 memberNameToAddress.put(memberName, address);
44 void removePeerAddress(String memberName) {
45 memberNameToAddress.remove(memberName);
48 Address getPeerAddress(String memberName) {
49 return memberNameToAddress.get(memberName);
52 Collection<String> getShardManagerPeerActorAddresses() {
53 Collection<String> peerAddresses = new ArrayList<>();
54 for(Map.Entry<String, Address> entry: memberNameToAddress.entrySet()) {
55 if(!localMemberName.equals(entry.getKey())) {
56 peerAddresses.add(getShardManagerActorPathBuilder(entry.getValue()).toString());
63 ShardIdentifier getShardIdentifier(String memberName, String shardName){
64 return ShardIdentifier.builder().memberName(memberName).shardName(shardName).type(shardManagerType).build();
67 String getShardActorAddress(String shardName, String memberName) {
68 Address memberAddress = memberNameToAddress.get(memberName);
69 if(memberAddress != null) {
70 return getShardManagerActorPathBuilder(memberAddress).append("/").append(
71 getShardIdentifier(memberName, shardName)).toString();
77 StringBuilder getShardManagerActorPathBuilder(Address address) {
78 return new StringBuilder().append(address.toString()).append("/user/").append(shardManagerIdentifier);
82 public String resolve(String peerId) {
87 ShardIdentifier shardId = ShardIdentifier.builder().fromShardIdString(peerId).build();
88 return getShardActorAddress(shardId.getShardName(), shardId.getMemberName());