diff --git a/core/src/main/java/com/alibaba/nacos/core/cluster/MemberMetaDataConstants.java b/core/src/main/java/com/alibaba/nacos/core/cluster/MemberMetaDataConstants.java index 7ed2a9fe792..1d93db64348 100644 --- a/core/src/main/java/com/alibaba/nacos/core/cluster/MemberMetaDataConstants.java +++ b/core/src/main/java/com/alibaba/nacos/core/cluster/MemberMetaDataConstants.java @@ -39,6 +39,8 @@ public class MemberMetaDataConstants { public static final String VERSION = "version"; public static final String[] META_KEY_LIST = new String[] {SITE_KEY, AD_WEIGHT, RAFT_PORT, WEIGHT, - LAST_REFRESH_TIME, VERSION}; + LAST_REFRESH_TIME, VERSION}; + public static final String[] META_KEY_LIST_WITHOUT_LAST_REFRESH_TIME = new String[] {SITE_KEY, AD_WEIGHT, RAFT_PORT, + WEIGHT, VERSION}; } diff --git a/core/src/main/java/com/alibaba/nacos/core/cluster/MemberUtils.java b/core/src/main/java/com/alibaba/nacos/core/cluster/MemberUtils.java index b089d9c39a4..fa88a160306 100644 --- a/core/src/main/java/com/alibaba/nacos/core/cluster/MemberUtils.java +++ b/core/src/main/java/com/alibaba/nacos/core/cluster/MemberUtils.java @@ -118,10 +118,12 @@ public static Collection multiParse(Collection addresses) { * @param member {@link Member} */ public static void onSuccess(Member member) { + Member cloneMember = new Member(); + copy(member, cloneMember); manager.getMemberAddressInfos().add(member.getAddress()); - member.setState(NodeState.UP); - member.setFailAccessCnt(0); - manager.update(member); + cloneMember.setState(NodeState.UP); + cloneMember.setFailAccessCnt(0); + manager.update(cloneMember); } public static void onFail(Member member) { @@ -135,18 +137,20 @@ public static void onFail(Member member) { * @param ex {@link Throwable} */ public static void onFail(Member member, Throwable ex) { + Member cloneMember = new Member(); + copy(member, cloneMember); manager.getMemberAddressInfos().remove(member.getAddress()); - member.setState(NodeState.SUSPICIOUS); - member.setFailAccessCnt(member.getFailAccessCnt() + 1); + cloneMember.setState(NodeState.SUSPICIOUS); + cloneMember.setFailAccessCnt(member.getFailAccessCnt() + 1); int maxFailAccessCnt = ApplicationUtils.getProperty("nacos.core.member.fail-access-cnt", Integer.class, 3); // If the number of consecutive failures to access the target node reaches // a maximum, or the link request is rejected, the state is directly down - if (member.getFailAccessCnt() > maxFailAccessCnt || StringUtils + if (cloneMember.getFailAccessCnt() > maxFailAccessCnt || StringUtils .containsIgnoreCase(ex.getMessage(), TARGET_MEMBER_CONNECT_REFUSE_ERRMSG)) { - member.setState(NodeState.DOWN); + cloneMember.setState(NodeState.DOWN); } - manager.update(member); + manager.update(cloneMember); } /** @@ -209,13 +213,63 @@ public static Collection readServerConf(Collection members) { return nodes; } + /** + * Select target members with filter. + * + * @param members original members + * @param filter filter + * @return target members + */ public static Set selectTargetMembers(Collection members, Predicate filter) { return members.stream().filter(filter).collect(Collectors.toSet()); } + /** + * Get address list of members. + * + * @param members members + * @return address list + */ public static List simpleMembers(Collection members) { return members.stream().map(Member::getAddress).sorted() .collect(ArrayList::new, ArrayList::add, ArrayList::addAll); } + /** + * Judge whether two member is full equals. + * + * @param actual actual member + * @param expected expected member + * @return true if all content is same, otherwise false + */ + public static boolean fullEquals(Member actual, Member expected) { + if (null == expected) { + return null == actual; + } + if (!expected.getIp().equals(actual.getIp())) { + return false; + } + if (expected.getPort() != actual.getPort()) { + return false; + } + if (!expected.getAddress().equals(actual.getAddress())) { + return false; + } + if (!expected.getState().equals(actual.getState())) { + return false; + } + return equalsExtendInfo(expected, actual); + } + + private static boolean equalsExtendInfo(Member expected, Member actual) { + for (String each : MemberMetaDataConstants.META_KEY_LIST_WITHOUT_LAST_REFRESH_TIME) { + if (expected.getExtendInfo().containsKey(each) != actual.getExtendInfo().containsKey(each)) { + return false; + } + if (null != expected.getExtendVal(each) && !expected.getExtendVal(each).equals(actual.getExtendVal(each))) { + return false; + } + } + return true; + } } diff --git a/core/src/main/java/com/alibaba/nacos/core/cluster/ServerMemberManager.java b/core/src/main/java/com/alibaba/nacos/core/cluster/ServerMemberManager.java index 2fe02c28525..21db5710e40 100644 --- a/core/src/main/java/com/alibaba/nacos/core/cluster/ServerMemberManager.java +++ b/core/src/main/java/com/alibaba/nacos/core/cluster/ServerMemberManager.java @@ -201,8 +201,6 @@ public boolean update(Member newMember) { Loggers.CLUSTER.debug("member information update : {}", newMember); String address = newMember.getAddress(); - newMember.setExtendVal(MemberMetaDataConstants.LAST_REFRESH_TIME, System.currentTimeMillis()); - if (!serverList.containsKey(address)) { return false; } @@ -211,15 +209,15 @@ public boolean update(Member newMember) { if (NodeState.DOWN.equals(newMember.getState())) { memberAddressInfos.remove(newMember.getAddress()); } - MemberUtils.copy(newMember, member); + if (!MemberUtils.fullEquals(newMember, member)) { + newMember.setExtendVal(MemberMetaDataConstants.LAST_REFRESH_TIME, System.currentTimeMillis()); + MemberUtils.copy(newMember, member); + // member data changes and all listeners need to be notified + NotifyCenter.publishEvent(MembersChangeEvent.builder().members(allMembers()).build()); + } return member; }); - // member data changes and all listeners need to be notified - NotifyCenter.publishEvent(MembersChangeEvent.builder() - .members(allMembers()) - .build()); - return true; } @@ -311,9 +309,6 @@ synchronized boolean memberChange(Collection members) { tmpAddressInfo.add(address); } - Map oldList = serverList; - Set oldSet = memberAddressInfos; - serverList = tmpMap; memberAddressInfos = tmpAddressInfo; @@ -321,9 +316,6 @@ synchronized boolean memberChange(Collection members) { Loggers.CLUSTER.warn("[serverlist] updated to : {}", finalMembers); - oldList.clear(); - oldSet.clear(); - // Persist the current cluster node information to cluster.conf // need to put the event publication into a synchronized block to ensure // that the event publication is sequential diff --git a/naming/src/main/java/com/alibaba/nacos/naming/controllers/CatalogController.java b/naming/src/main/java/com/alibaba/nacos/naming/controllers/CatalogController.java index 0e67fe94efc..966b0c00f90 100644 --- a/naming/src/main/java/com/alibaba/nacos/naming/controllers/CatalogController.java +++ b/naming/src/main/java/com/alibaba/nacos/naming/controllers/CatalogController.java @@ -213,7 +213,7 @@ public Object listDetail(@RequestParam(required = false) boolean withInstances, ObjectNode result = JacksonUtils.createEmptyJsonNode(); List services = new ArrayList<>(); - + final int total = serviceManager.getPagedService(namespaceId, pageNo - 1, pageSize, param, containedInstance, services, hasIpCount); if (CollectionUtils.isEmpty(services)) { result.replace("serviceList", JacksonUtils.transferToJsonNode(Collections.emptyList())); result.put("count", 0); @@ -232,8 +232,6 @@ public Object listDetail(@RequestParam(required = false) boolean withInstances, serviceViews.add(serviceView); } - int total = serviceManager - .getPagedService(namespaceId, pageNo - 1, pageSize, param, containedInstance, services, hasIpCount); result.replace("serviceList", JacksonUtils.transferToJsonNode(serviceViews)); result.put("count", total); diff --git a/naming/src/main/java/com/alibaba/nacos/naming/core/DistroMapper.java b/naming/src/main/java/com/alibaba/nacos/naming/core/DistroMapper.java index 1ec835db7ff..68cf7f05d46 100644 --- a/naming/src/main/java/com/alibaba/nacos/naming/core/DistroMapper.java +++ b/naming/src/main/java/com/alibaba/nacos/naming/core/DistroMapper.java @@ -139,7 +139,6 @@ public void onEvent(MembersChangeEvent event) { Collection old = healthyList; healthyList = Collections.unmodifiableList(list); Loggers.SRV_LOG.info("[NACOS-DISTRO] healthy server list changed, old: {}, new: {}", old, healthyList); - old.clear(); } @Override diff --git a/pom.xml b/pom.xml index 4f4524a7fc2..f3af1f305c2 100644 --- a/pom.xml +++ b/pom.xml @@ -167,8 +167,8 @@ 7.0.59 0.30 3.4.2 - 1.3.2.beta1 - 1.3.2.beta1 + 1.3.2 + 1.3.2