From 08d7707661d77d341a259e5c590436de9fc5917f Mon Sep 17 00:00:00 2001 From: YIN Kangqian Date: Mon, 4 Dec 2017 10:18:31 +0800 Subject: [PATCH] Fix bug CONTROLLER-1798. Updated peer address on shard in ShardManager#updateSchemaContext for every existing peer memeber to avoid missing sending PeerAddressResolved and PeerUp to shard while UpdateSchemaContext comes after MemberUp. Change-Id: I0758e489a189f82180ca6885987ec99f1e5712c7 Signed-off-by: YIN Kangqian --- .../cluster/datastore/shardmanager/ShardManager.java | 11 +++++++++++ .../shardmanager/ShardPeerAddressResolver.java | 5 +++++ 2 files changed, 16 insertions(+) diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardmanager/ShardManager.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardmanager/ShardManager.java index e3d3a60409..430b3b7a85 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardmanager/ShardManager.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardmanager/ShardManager.java @@ -1137,6 +1137,17 @@ class ShardManager extends AbstractUntypedPersistentActorWithMetering { if (info.getActor() == null) { LOG.debug("Creating Shard {}", info.getShardId()); info.setActor(newShardActor(info)); + // Update peer address for every existing peer memeber to avoid missing sending + // PeerAddressResolved and PeerUp to this shard while UpdateSchemaContext comes after MemberUp. + String shardName = info.getShardName(); + for (MemberName memberName : peerAddressResolver.getPeerMembers()) { + String peerId = getShardIdentifier(memberName, shardName).toString() ; + String peerAddress = peerAddressResolver.getShardActorAddress(shardName, memberName); + info.updatePeerAddress(peerId, peerAddress, getSelf()); + info.peerUp(memberName, peerId, getSelf()); + LOG.debug("{}: updated peer {} on member {} with address {} on shard {} whose actor address is {}", + persistenceId(), peerId, memberName, peerAddress, info.getShardId(), info.getActor()); + } } else { info.getActor().tell(message, getSelf()); } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardmanager/ShardPeerAddressResolver.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardmanager/ShardPeerAddressResolver.java index a05548b1a4..468d650d4d 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardmanager/ShardPeerAddressResolver.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/shardmanager/ShardPeerAddressResolver.java @@ -12,6 +12,7 @@ import com.google.common.base.Preconditions; 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; @@ -47,6 +48,10 @@ class ShardPeerAddressResolver implements PeerAddressResolver { memberNameToAddress.remove(memberName); } + Set getPeerMembers() { + return this.memberNameToAddress.keySet(); + } + Address getPeerAddress(MemberName memberName) { return memberNameToAddress.get(memberName); } -- 2.36.6