rpuch commented on code in PR #6019: URL: https://github.com/apache/ignite-3/pull/6019#discussion_r2139873975
########## modules/network/src/main/java/org/apache/ignite/internal/network/scalecube/ScaleCubeTopologyService.java: ########## @@ -88,64 +88,108 @@ void onMembershipEvent(MembershipEvent event) { ClusterNode member = fromMember(event.member(), metadata); if (event.isAdded()) { - members.put(member.address(), member); - Map<UUID, ClusterNode> clusterNodes = membersByConsistentId.computeIfAbsent(member.name(), k -> new ConcurrentHashMap<>()); - clusterNodes.put(member.id(), member); - idToMemberMap.put(member.id(), member); - - LOG.info("Node joined [node={}]", member); - - fireAppearedEvent(member); + onAddedEvent(member); } else if (event.isUpdated()) { - members.put(member.address(), member); - membersByConsistentId.computeIfAbsent(member.name(), k -> new ConcurrentHashMap<>()).put(member.id(), member); - membersByConsistentIdInLogicalTopology.compute(member.name(), (consId, node) -> { - if (node != null && node.id().equals(member.id())) { - return member; - } - return node; - }); - idToMemberMap.put(member.id(), member); + onUpdatedEvent(member); } else if (event.isRemoved() || event.isLeaving()) { - // We treat LEAVING as 'node left' because the node will not be back and we don't want to wait for the suspicion timeout. + onRemovedOrLeftEvent(event, member); + } + + if (LOG.isInfoEnabled()) { + LOG.info("Topology snapshot [nodes={}]", members.values().stream().map(ClusterNode::name).collect(Collectors.toList())); + } + } + + private void onAddedEvent(ClusterNode member) { + @Nullable ClusterNode differentNodeWithSameAddress = replaceMemberByAddress(member); + + replaceMemberByConsistentId(member, differentNodeWithSameAddress); + + replaceMemberById(member, differentNodeWithSameAddress); + + LOG.info("Node joined [node={}]", member); + + fireAppearedEvent(member); + } + + private @Nullable ClusterNode replaceMemberByAddress(ClusterNode member) { + ClusterNode prevNodeWithSameAddress = members.put(member.address(), member); + return prevNodeWithSameAddress == null || prevNodeWithSameAddress.id().equals(member.id()) + ? null : prevNodeWithSameAddress; + } + + private void replaceMemberByConsistentId(ClusterNode member, @Nullable ClusterNode differentNodeWithSameAddress) { + membersByConsistentId.compute(member.name(), (name, nodesWithGivenConsistentId) -> { + if (nodesWithGivenConsistentId == null) { + nodesWithGivenConsistentId = new ConcurrentHashMap<>(); + } + + if (differentNodeWithSameAddress != null) { + nodesWithGivenConsistentId.remove(differentNodeWithSameAddress.id()); Review Comment: I tried to do it, and the code becomes more involved. This code is called rarely, we don't seem to need this tiny optimization here at this cost. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: notifications-unsubscr...@ignite.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org