Improve segmented journal actor metrics
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / datastore / shardmanager / ShardPeerAddressResolver.java
index 4a9f144ef11159410de192bbe218d276519d5901..6c33652bb1a6cde93cad77ec48adbe4068289060 100644 (file)
@@ -7,12 +7,17 @@
  */
 package org.opendaylight.controller.cluster.datastore.shardmanager;
 
+import static java.util.Objects.requireNonNull;
+
 import akka.actor.Address;
+import akka.actor.AddressFromURIString;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
+import org.opendaylight.controller.cluster.access.concepts.MemberName;
 import org.opendaylight.controller.cluster.datastore.identifiers.ShardIdentifier;
 import org.opendaylight.controller.cluster.datastore.identifiers.ShardManagerIdentifier;
 import org.opendaylight.controller.cluster.raft.PeerAddressResolver;
@@ -26,33 +31,37 @@ import org.opendaylight.controller.cluster.raft.PeerAddressResolver;
 class ShardPeerAddressResolver implements PeerAddressResolver {
     // Stores a mapping between a member name and the address of the member. The map is concurrent as it
     // will be accessed by multiple threads via the public resolve method.
-    private final ConcurrentMap<String, Address> memberNameToAddress = new ConcurrentHashMap<>();
+    private final ConcurrentMap<MemberName, Address> memberNameToAddress = new ConcurrentHashMap<>();
     private final String shardManagerIdentifier;
     private final String shardManagerType;
-    private final String localMemberName;
+    private final MemberName localMemberName;
 
-    public ShardPeerAddressResolver(String shardManagerType, String localMemberName) {
+    ShardPeerAddressResolver(final String shardManagerType, final MemberName localMemberName) {
         this.shardManagerIdentifier = ShardManagerIdentifier.builder().type(shardManagerType).build().toString();
         this.shardManagerType = shardManagerType;
-        this.localMemberName = localMemberName;
+        this.localMemberName = requireNonNull(localMemberName);
     }
 
-    void addPeerAddress(String memberName, Address address) {
+    void addPeerAddress(final MemberName memberName, final Address address) {
         memberNameToAddress.put(memberName, address);
     }
 
-    void removePeerAddress(String memberName) {
+    void removePeerAddress(final MemberName memberName) {
         memberNameToAddress.remove(memberName);
     }
 
-    Address getPeerAddress(String memberName) {
+    Set<MemberName> getPeerMembers() {
+        return this.memberNameToAddress.keySet();
+    }
+
+    Address getPeerAddress(final MemberName memberName) {
         return memberNameToAddress.get(memberName);
     }
 
     Collection<String> getShardManagerPeerActorAddresses() {
         Collection<String> peerAddresses = new ArrayList<>();
-        for(Map.Entry<String, Address> entry: memberNameToAddress.entrySet()) {
-            if(!localMemberName.equals(entry.getKey())) {
+        for (Map.Entry<MemberName, Address> entry: memberNameToAddress.entrySet()) {
+            if (!localMemberName.equals(entry.getKey())) {
                 peerAddresses.add(getShardManagerActorPathBuilder(entry.getValue()).toString());
             }
         }
@@ -60,13 +69,13 @@ class ShardPeerAddressResolver implements PeerAddressResolver {
         return peerAddresses;
     }
 
-    ShardIdentifier getShardIdentifier(String memberName, String shardName){
-        return ShardIdentifier.builder().memberName(memberName).shardName(shardName).type(shardManagerType).build();
+    ShardIdentifier getShardIdentifier(final MemberName memberName, final String shardName) {
+        return ShardIdentifier.create(shardName, memberName, shardManagerType);
     }
 
-    String getShardActorAddress(String shardName, String memberName) {
+    String getShardActorAddress(final String shardName, final MemberName memberName) {
         Address memberAddress = memberNameToAddress.get(memberName);
-        if(memberAddress != null) {
+        if (memberAddress != null) {
             return getShardManagerActorPathBuilder(memberAddress).append("/").append(
                     getShardIdentifier(memberName, shardName)).toString();
         }
@@ -74,17 +83,23 @@ class ShardPeerAddressResolver implements PeerAddressResolver {
         return null;
     }
 
-    StringBuilder getShardManagerActorPathBuilder(Address address) {
+    StringBuilder getShardManagerActorPathBuilder(final Address address) {
         return new StringBuilder().append(address.toString()).append("/user/").append(shardManagerIdentifier);
     }
 
     @Override
-    public String resolve(String peerId) {
-        if(peerId == null) {
+    public String resolve(final String peerId) {
+        if (peerId == null) {
             return null;
         }
 
-        ShardIdentifier shardId = ShardIdentifier.builder().fromShardIdString(peerId).build();
+        ShardIdentifier shardId = ShardIdentifier.fromShardIdString(peerId);
         return getShardActorAddress(shardId.getShardName(), shardId.getMemberName());
     }
+
+    @Override
+    public void setResolved(final String peerId, final String address) {
+        memberNameToAddress.put(ShardIdentifier.fromShardIdString(peerId).getMemberName(),
+                AddressFromURIString.parse(address));
+    }
 }