[#4562] fixed dual-AZ engine disk abnormal scenario registration center intermittently delete instance problem (#4563)
diff --git a/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterManager.java b/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterManager.java
index 5b8c434..4d65465 100644
--- a/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterManager.java
+++ b/clients/config-center-client/src/main/java/org/apache/servicecomb/config/center/client/ConfigCenterManager.java
@@ -64,7 +64,8 @@
public void startConfigCenterManager() {
this.startTask(new PollConfigurationTask(0));
- this.startTask(new CheckConfigCenterAddressTask());
+ schedulerCheckAddressAvailable("cc-addr-check", new CheckConfigCenterAddressTask(),
+ configCenterConfiguration.getRefreshIntervalInMillis());
}
class PollConfigurationTask implements Task {
@@ -94,9 +95,9 @@
}
}
- class CheckConfigCenterAddressTask implements Task {
+ class CheckConfigCenterAddressTask implements Runnable {
@Override
- public void execute() {
+ public void run() {
List<String> isolationAddresses = configCenterAddressManager.getIsolationAddresses();
if (isolationAddresses.isEmpty()) {
return;
@@ -104,8 +105,6 @@
for (String address : isolationAddresses) {
configCenterClient.checkAddressAvailable(queryConfigurationsRequest, address);
}
- startTask(new BackOffSleepTask(configCenterConfiguration.getRefreshIntervalInMillis(),
- new CheckConfigCenterAddressTask()));
}
}
}
diff --git a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieClient.java b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieClient.java
index e85a7c6..b44ed0b 100644
--- a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieClient.java
+++ b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieClient.java
@@ -125,7 +125,7 @@
addressManager.recoverIsolatedAddress(address);
}
} catch (IOException e) {
- LOGGER.error("check kie config isolation address {} available error!", address, e);
+ LOGGER.error("check kie config isolation address {} available error!", address);
}
}
diff --git a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieConfigManager.java b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieConfigManager.java
index bd5ff87..5927431 100644
--- a/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieConfigManager.java
+++ b/clients/config-kie-client/src/main/java/org/apache/servicecomb/config/kie/client/KieConfigManager.java
@@ -125,7 +125,8 @@
public void startConfigKieManager() {
this.configurationsRequests.forEach((t) ->
this.startTask(new PollConfigurationTask(0, t)));
- startTask(new CheckKieConfigAddressTask(configurationsRequests.get(0)));
+ schedulerCheckAddressAvailable("kie-addr-check", new CheckKieAddressTask(configurationsRequests.get(0)),
+ kieConfiguration.getRefreshIntervalInMillis());
}
class PollConfigurationTask implements Task {
@@ -161,15 +162,15 @@
}
}
- class CheckKieConfigAddressTask implements Task {
+ class CheckKieAddressTask implements Runnable {
ConfigurationsRequest configurationsRequest;
- public CheckKieConfigAddressTask(ConfigurationsRequest configurationsRequest) {
+ public CheckKieAddressTask(ConfigurationsRequest configurationsRequest) {
this.configurationsRequest = configurationsRequest;
}
@Override
- public void execute() {
+ public void run() {
List<String> isolationAddresses = kieAddressManager.getIsolationAddresses();
if (isolationAddresses.isEmpty()) {
return;
@@ -177,8 +178,6 @@
for (String address : isolationAddresses) {
configKieClient.checkAddressAvailable(this.configurationsRequest, address);
}
- startTask(new BackOffSleepTask(kieConfiguration.getRefreshIntervalInMillis(),
- new CheckKieConfigAddressTask(this.configurationsRequest)));
}
}
}
diff --git a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/AbstractAddressManager.java b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/AbstractAddressManager.java
index 59cb3e5..c5587b6 100644
--- a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/AbstractAddressManager.java
+++ b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/common/AbstractAddressManager.java
@@ -198,7 +198,7 @@
recordSuccessState(address);
if (addressAutoRefreshed) {
if (isolationZoneAddress.remove(address)) {
- LOGGER.warn("restore default address [{}]", address);
+ LOGGER.warn("restore same region address [{}]", address);
if (eventBus != null && availableZone.isEmpty()) {
eventBus.post(new EngineConnectChangedEvent());
}
@@ -212,7 +212,7 @@
return;
}
if (defaultIsolationAddress.remove(address)) {
- LOGGER.warn("restore same region address [{}]", address);
+ LOGGER.warn("restore default address [{}]", address);
addresses.add(address);
}
}
diff --git a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/task/AbstractTask.java b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/task/AbstractTask.java
index deba2d8..a252714 100644
--- a/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/task/AbstractTask.java
+++ b/clients/http-client-common/src/main/java/org/apache/servicecomb/http/client/task/AbstractTask.java
@@ -20,6 +20,7 @@
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
@@ -63,6 +64,8 @@
private volatile boolean running = true;
+ private ScheduledExecutorService addrCheckExecutor;
+
protected AbstractTask(String taskName) {
initTaskPool(taskName);
Runtime.getRuntime().addShutdownHook(new Thread(AbstractTask.this::stop, taskName + "-shutdown-hook"));
@@ -73,6 +76,13 @@
new Thread(task, taskName));
}
+ protected void schedulerCheckAddressAvailable(String taskName, Runnable task, long delayTime) {
+ if (addrCheckExecutor == null) {
+ addrCheckExecutor = Executors.newScheduledThreadPool(1, (t) -> new Thread(t, taskName));
+ }
+ addrCheckExecutor.scheduleWithFixedDelay(task, delayTime, delayTime, TimeUnit.MILLISECONDS);
+ }
+
protected void startTask(Task task) {
if (!running) {
return;
@@ -96,6 +106,10 @@
running = false;
this.taskPool.shutdown();
this.taskPool.awaitTermination(10, TimeUnit.SECONDS);
+ if (addrCheckExecutor != null) {
+ this.addrCheckExecutor.shutdown();
+ this.addrCheckExecutor.awaitTermination(10, TimeUnit.SECONDS);
+ }
} catch (InterruptedException e) {
LOGGER.warn("tasks not shutdown in time {}", e.getMessage());
}
diff --git a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterClient.java b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterClient.java
index c994861..45c4c27 100755
--- a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterClient.java
+++ b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterClient.java
@@ -555,14 +555,13 @@
}
@Override
- public void checkIsolationAddressAvailable(String serviceId, String instanceId) {
+ public void checkIsolationAddressAvailable() {
List<String> isolationAddresses = addressManager.getIsolationAddresses();
if (isolationAddresses.isEmpty()) {
return;
}
for (String address : isolationAddresses) {
- httpClient.checkServiceCenterAddressAvailable("/registry/microservices/" + serviceId + "/instances/" + instanceId +
- "/heartbeat", null, null, address);
+ httpClient.checkAddressAvailable("/registry/microservices", null, null, address);
}
}
}
diff --git a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterOperation.java b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterOperation.java
index cd91b24..f296e66 100644
--- a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterOperation.java
+++ b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterOperation.java
@@ -196,9 +196,6 @@
/**
* Check serviceCenter isolation address available
- *
- * @param serviceId serviceId
- * @param instanceId instanceId
*/
- void checkIsolationAddressAvailable(String serviceId, String instanceId);
+ void checkIsolationAddressAvailable();
}
diff --git a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterRawClient.java b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterRawClient.java
index c58e5dc..e95240b 100755
--- a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterRawClient.java
+++ b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterRawClient.java
@@ -93,15 +93,15 @@
}
}
- public void checkServiceCenterAddressAvailable(String url, Map<String, String> headers, String content,
+ public void checkAddressAvailable(String url, Map<String, String> headers, String content,
String address) {
String formatUrl = addressManager.formatUrl(url, false, address);
- HttpRequest httpRequest = buildHttpRequest(formatUrl, headers, content, HttpRequest.PUT);
+ HttpRequest httpRequest = buildHttpRequest(formatUrl, headers, content, HttpRequest.GET);
try {
httpTransport.doRequest(httpRequest);
addressManager.recoverIsolatedAddress(address);
} catch (IOException e) {
- LOGGER.error("check service center isolation address {} available error!", address, e);
+ LOGGER.error("check service center isolation address {} available error!", address);
}
}
diff --git a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterRegistration.java b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterRegistration.java
index 2a1296d..3321719 100644
--- a/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterRegistration.java
+++ b/clients/service-center-client/src/main/java/org/apache/servicecomb/service/center/client/ServiceCenterRegistration.java
@@ -104,6 +104,7 @@
public void startRegistration() {
startTask(new RegisterMicroserviceTask(0));
+ schedulerCheckAddressAvailable("sc-addr-check", new CheckAddressTask(), heartBeatInterval);
}
class RegisterMicroserviceTask implements Task {
@@ -248,7 +249,6 @@
microserviceInstance.getInstanceId());
eventBus.post(new MicroserviceInstanceRegistrationEvent(true, microservice, microserviceInstance));
startTask(new SendHeartBeatTask(0));
- startTask(new CheckServiceCenterAddressTask());
}
} catch (Exception e) {
LOGGER.error("register microservice instance failed, and will try again.", e);
@@ -294,13 +294,10 @@
}
}
- class CheckServiceCenterAddressTask implements Task {
+ class CheckAddressTask implements Runnable {
@Override
- public void execute() {
- serviceCenterClient.checkIsolationAddressAvailable(microservice.getServiceId(),
- microserviceInstance.getInstanceId());
- startTask(new BackOffSleepTask(Math.max(heartBeatInterval, heartBeatRequestTimeout),
- new CheckServiceCenterAddressTask()));
+ public void run() {
+ serviceCenterClient.checkIsolationAddressAvailable();
}
}
}