Skip to content

Commit

Permalink
fix: fix issue alibaba#4364
Browse files Browse the repository at this point in the history
  • Loading branch information
chuntaojun committed Nov 30, 2020
1 parent 6ac6a6c commit 7833e4d
Show file tree
Hide file tree
Showing 12 changed files with 202 additions and 150 deletions.
Expand Up @@ -27,6 +27,11 @@
*/
public class ExceptionUtil {

/**
* Represents an empty exception, that is, no exception occurs, only a constant.
*/
public static final Exception NONE_EXCEPTION = new RuntimeException("");

public static String getAllExceptionMsg(Throwable e) {
Throwable cause = e;
StringBuilder strBuilder = new StringBuilder();
Expand Down
Expand Up @@ -40,14 +40,14 @@
*
* @author <a href="mailto:liaochuntao@live.com">liaochuntao</a>
*/
public class MemberUtils {
public class MemberUtil {

private static final String TARGET_MEMBER_CONNECT_REFUSE_ERRMSG = "Connection refused";
protected static final String TARGET_MEMBER_CONNECT_REFUSE_ERRMSG = "Connection refused";

private static ServerMemberManager manager;

public static void setManager(ServerMemberManager manager) {
MemberUtils.manager = manager;
MemberUtil.manager = manager;
}

/**
Expand Down Expand Up @@ -118,16 +118,15 @@ public static Collection<Member> multiParse(Collection<String> addresses) {
* @param member {@link Member}
*/
public static void onSuccess(Member member) {
Member cloneMember = new Member();
copy(member, cloneMember);
manager.getMemberAddressInfos().add(member.getAddress());
cloneMember.setState(NodeState.UP);
cloneMember.setFailAccessCnt(0);
manager.update(cloneMember);
member.setState(NodeState.UP);
member.setFailAccessCnt(0);
manager.update(member);
}

public static void onFail(Member member) {
onFail(member, null);
// To avoid null pointer judgments, pass in one NONE_EXCEPTION
onFail(member, ExceptionUtil.NONE_EXCEPTION);
}

/**
Expand All @@ -137,20 +136,18 @@ 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());
cloneMember.setState(NodeState.SUSPICIOUS);
cloneMember.setFailAccessCnt(member.getFailAccessCnt() + 1);
member.setState(NodeState.SUSPICIOUS);
member.setFailAccessCnt(member.getFailAccessCnt() + 1);
int maxFailAccessCnt = EnvUtil.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 (cloneMember.getFailAccessCnt() > maxFailAccessCnt || StringUtils
if (member.getFailAccessCnt() > maxFailAccessCnt || StringUtils
.containsIgnoreCase(ex.getMessage(), TARGET_MEMBER_CONNECT_REFUSE_ERRMSG)) {
cloneMember.setState(NodeState.DOWN);
member.setState(NodeState.DOWN);
}
manager.update(cloneMember);
manager.update(member);
}

/**
Expand Down
Expand Up @@ -124,7 +124,7 @@ public class ServerMemberManager implements ApplicationListener<WebServerInitial
public ServerMemberManager(ServletContext servletContext) throws Exception {
this.serverList = new ConcurrentSkipListMap<>();
EnvUtil.setContextPath(servletContext.getContextPath());
MemberUtils.setManager(this);
MemberUtil.setManager(this);

init();
}
Expand All @@ -133,7 +133,7 @@ protected void init() throws NacosException {
Loggers.CORE.info("Nacos-related cluster resource initialization");
this.port = EnvUtil.getProperty("server.port", Integer.class, 8848);
this.localAddress = InetUtils.getSelfIP() + ":" + port;
this.self = MemberUtils.singleParse(this.localAddress);
this.self = MemberUtil.singleParse(this.localAddress);
this.self.setExtendVal(MemberMetaDataConstants.VERSION, VersionUtils.version);
serverList.put(self.getAddress(), self);

Expand Down Expand Up @@ -210,9 +210,9 @@ public boolean update(Member newMember) {
if (NodeState.DOWN.equals(newMember.getState())) {
memberAddressInfos.remove(newMember.getAddress());
}
boolean isPublishChangeEvent = MemberUtils.isBasicInfoChanged(newMember, member);
boolean isPublishChangeEvent = MemberUtil.isBasicInfoChanged(newMember, member);
newMember.setExtendVal(MemberMetaDataConstants.LAST_REFRESH_TIME, System.currentTimeMillis());
MemberUtils.copy(newMember, member);
MemberUtil.copy(newMember, member);
if (isPublishChangeEvent) {
// member basic data changes and all listeners need to be notified
NotifyCenter.publishEvent(MembersChangeEvent.builder().members(allMembers()).build());
Expand Down Expand Up @@ -322,8 +322,8 @@ synchronized boolean memberChange(Collection<Member> members) {
// <important> need to put the event publication into a synchronized block to ensure
// that the event publication is sequential
if (hasChange) {
MemberUtils.syncToFile(finalMembers);
Set<Member> healthMembers = MemberUtils.selectTargetMembers(members, member -> {
MemberUtil.syncToFile(finalMembers);
Set<Member> healthMembers = MemberUtil.selectTargetMembers(members, member -> {
return !NodeState.DOWN.equals(member.getState());
});
Event event = MembersChangeEvent.builder().members(finalMembers).build();
Expand Down Expand Up @@ -467,12 +467,12 @@ public void onReceive(RestResult<String> result) {
return;
}
if (result.ok()) {
MemberUtils.onSuccess(target);
MemberUtil.onSuccess(target);
} else {
Loggers.CLUSTER
.warn("failed to report new info to target node : {}, result : {}",
target.getAddress(), result);
MemberUtils.onFail(target);
MemberUtil.onFail(target);
}
}

Expand All @@ -482,7 +482,7 @@ public void onError(Throwable throwable) {
.error("failed to report new info to target node : {}, error : {}",
target.getAddress(),
ExceptionUtil.getAllExceptionMsg(throwable));
MemberUtils.onFail(target, throwable);
MemberUtil.onFail(target, throwable);
}

@Override
Expand Down
Expand Up @@ -24,7 +24,7 @@
import com.alibaba.nacos.common.model.RestResult;
import com.alibaba.nacos.common.utils.ExceptionUtil;
import com.alibaba.nacos.core.cluster.AbstractMemberLookup;
import com.alibaba.nacos.core.cluster.MemberUtils;
import com.alibaba.nacos.core.cluster.MemberUtil;
import com.alibaba.nacos.core.utils.GenericType;
import com.alibaba.nacos.core.utils.GlobalExecutor;
import com.alibaba.nacos.core.utils.Loggers;
Expand Down Expand Up @@ -147,7 +147,7 @@ private void syncFromAddressUrl() throws Exception {
isAddressServerHealth = true;
Reader reader = new StringReader(result.getData());
try {
afterLookup(MemberUtils.readServerConf(EnvUtil.analyzeClusterConf(reader)));
afterLookup(MemberUtil.readServerConf(EnvUtil.analyzeClusterConf(reader)));
} catch (Throwable e) {
Loggers.CLUSTER.error("[serverlist] exception for analyzeClusterConf, error : {}",
ExceptionUtil.getAllExceptionMsg(e));
Expand Down
Expand Up @@ -19,7 +19,7 @@
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.core.cluster.AbstractMemberLookup;
import com.alibaba.nacos.core.cluster.Member;
import com.alibaba.nacos.core.cluster.MemberUtils;
import com.alibaba.nacos.core.cluster.MemberUtil;
import com.alibaba.nacos.sys.env.EnvUtil;
import com.alibaba.nacos.sys.file.FileChangeEvent;
import com.alibaba.nacos.sys.file.FileWatcher;
Expand Down Expand Up @@ -74,7 +74,7 @@ private void readClusterConfFromDisk() {
Collection<Member> tmpMembers = new ArrayList<>();
try {
List<String> tmp = EnvUtil.readClusterConf();
tmpMembers = MemberUtils.readServerConf(tmp);
tmpMembers = MemberUtil.readServerConf(tmp);
} catch (Throwable e) {
Loggers.CLUSTER
.error("nacos-XXXX [serverlist] failed to get serverlist from disk!, error : {}", e.getMessage());
Expand Down
Expand Up @@ -17,7 +17,7 @@
package com.alibaba.nacos.core.cluster.lookup;

import com.alibaba.nacos.core.cluster.AbstractMemberLookup;
import com.alibaba.nacos.core.cluster.MemberUtils;
import com.alibaba.nacos.core.cluster.MemberUtil;
import com.alibaba.nacos.sys.env.EnvUtil;
import com.alibaba.nacos.sys.utils.InetUtils;

Expand All @@ -34,7 +34,7 @@ public class StandaloneMemberLookup extends AbstractMemberLookup {
public void start() {
if (start.compareAndSet(false, true)) {
String url = InetUtils.getSelfIP() + ":" + EnvUtil.getPort();
afterLookup(MemberUtils.readServerConf(Collections.singletonList(url)));
afterLookup(MemberUtil.readServerConf(Collections.singletonList(url)));
}
}
}
Expand Up @@ -26,7 +26,7 @@
import com.alibaba.nacos.common.model.RestResultUtils;
import com.alibaba.nacos.common.utils.LoggerUtils;
import com.alibaba.nacos.core.cluster.Member;
import com.alibaba.nacos.core.cluster.MemberUtils;
import com.alibaba.nacos.core.cluster.MemberUtil;
import com.alibaba.nacos.core.cluster.NodeState;
import com.alibaba.nacos.core.cluster.ServerMemberManager;
import com.alibaba.nacos.sys.env.EnvUtil;
Expand Down Expand Up @@ -150,7 +150,7 @@ public RestResult<String> switchLookup(@RequestParam(name = "type") String type)
*/
@PostMapping("/server/leave")
public RestResult<String> leave(@RequestBody Collection<String> params) throws Exception {
Collection<Member> memberList = MemberUtils.multiParse(params);
Collection<Member> memberList = MemberUtil.multiParse(params);
memberManager.memberLeave(memberList);
final NacosAsyncRestTemplate nacosAsyncRestTemplate = HttpClientBeanHolder.getNacosAsyncRestTemplate(Loggers.CLUSTER);
final GenericType<RestResult<String>> genericType = new GenericType<RestResult<String>>() {
Expand All @@ -169,12 +169,12 @@ public void onReceive(RestResult<String> result) {
if (result.ok()) {
LoggerUtils.printIfDebugEnabled(Loggers.CLUSTER,
"The node : [{}] success to process the request", member);
MemberUtils.onSuccess(member);
MemberUtil.onSuccess(member);
} else {
Loggers.CLUSTER
.warn("The node : [{}] failed to process the request, response is : {}", member,
result);
MemberUtils.onFail(member);
MemberUtil.onFail(member);
}
} finally {
latch.countDown();
Expand All @@ -185,7 +185,7 @@ public void onReceive(RestResult<String> result) {
public void onError(Throwable throwable) {
try {
Loggers.CLUSTER.error("Failed to communicate with the node : {}", member);
MemberUtils.onFail(member);
MemberUtil.onFail(member);
} finally {
latch.countDown();
}
Expand Down
Expand Up @@ -23,7 +23,7 @@
import com.alibaba.nacos.core.cluster.Member;
import com.alibaba.nacos.core.cluster.MemberChangeListener;
import com.alibaba.nacos.core.cluster.MemberMetaDataConstants;
import com.alibaba.nacos.core.cluster.MemberUtils;
import com.alibaba.nacos.core.cluster.MemberUtil;
import com.alibaba.nacos.core.cluster.MembersChangeEvent;
import com.alibaba.nacos.core.cluster.ServerMemberManager;
import com.alibaba.nacos.core.utils.ClassUtils;
Expand Down Expand Up @@ -73,7 +73,7 @@ public static Set<String> toCPMembersInfo(Collection<Member> members) {
Set<String> nodes = new HashSet<>();
members.forEach(member -> {
final String ip = member.getIp();
final int raftPort = MemberUtils.calculateRaftPort(member);
final int raftPort = MemberUtil.calculateRaftPort(member);
nodes.add(ip + ":" + raftPort);
});
return nodes;
Expand Down

0 comments on commit 7833e4d

Please sign in to comment.