fix use excessively large TTL

pull/1621/head
zihenz 3 months ago
parent 444804a2fd
commit 2cb27054bd

@ -79,7 +79,6 @@ public class PolarisServiceRegistry implements ServiceRegistry<PolarisRegistrati
private final StaticMetadataManager staticMetadataManager; private final StaticMetadataManager staticMetadataManager;
private final PolarisStatProperties polarisStatProperties; private final PolarisStatProperties polarisStatProperties;
private volatile ScheduledExecutorService heartbeatExecutor;
public PolarisServiceRegistry(PolarisDiscoveryProperties polarisDiscoveryProperties, public PolarisServiceRegistry(PolarisDiscoveryProperties polarisDiscoveryProperties,
PolarisSDKContextManager polarisSDKContextManager, PolarisDiscoveryHandler polarisDiscoveryHandler, PolarisSDKContextManager polarisSDKContextManager, PolarisDiscoveryHandler polarisDiscoveryHandler,
@ -130,19 +129,15 @@ public class PolarisServiceRegistry implements ServiceRegistry<PolarisRegistrati
ProviderAPI providerClient = polarisSDKContextManager.getProviderAPI(); ProviderAPI providerClient = polarisSDKContextManager.getProviderAPI();
InstanceRegisterResponse instanceRegisterResponse; InstanceRegisterResponse instanceRegisterResponse;
// Always use registerInstance to avoid automatic heartbeat if (!polarisDiscoveryProperties.getHeartbeatEnabled()) {
instanceRegisterRequest.setTtl(polarisDiscoveryProperties.getHeartbeatEnabled() ? // Use register() when heartbeat is disabled - this doesn't start the SDK's heartbeat
polarisDiscoveryProperties.getHeartbeatInterval() : 2592000); instanceRegisterResponse = providerClient.register(instanceRegisterRequest);
instanceRegisterResponse = providerClient.registerInstance(instanceRegisterRequest);
// Only start heartbeat if explicitly enabled and health check URL is provided
if (polarisDiscoveryProperties.getHeartbeatEnabled() &&
StringUtils.isNotBlank(polarisDiscoveryProperties.getHealthCheckUrl())) {
startHeartbeat(instanceRegisterRequest, instanceRegisterResponse);
LOGGER.info("Registered instance with heartbeat enabled and health check URL.");
} else {
stopHeartbeat(); // Ensure no heartbeat is running
LOGGER.info("Registered instance without heartbeat."); LOGGER.info("Registered instance without heartbeat.");
} else {
// Use registerInstance() when heartbeat is enabled - this starts the SDK's heartbeat
instanceRegisterRequest.setTtl(polarisDiscoveryProperties.getHeartbeatInterval());
instanceRegisterResponse = providerClient.registerInstance(instanceRegisterRequest);
LOGGER.info("Registered instance with heartbeat enabled.");
} }
registration.setInstanceId(instanceRegisterResponse.getInstanceId()); registration.setInstanceId(instanceRegisterResponse.getInstanceId());
@ -196,85 +191,6 @@ public class PolarisServiceRegistry implements ServiceRegistry<PolarisRegistrati
} }
} }
private void startHeartbeat(InstanceRegisterRequest instanceRegisterRequest, InstanceRegisterResponse instanceRegisterResponse) {
// Double check heartbeat is enabled and health check URL is not blank
if (!polarisDiscoveryProperties.getHeartbeatEnabled() || StringUtils.isBlank(polarisDiscoveryProperties.getHealthCheckUrl())) {
stopHeartbeat();
LOGGER.info("Heartbeat is disabled or health check URL is blank, skipping heartbeat initialization.");
return;
}
// Stop any existing heartbeat task before starting a new one
stopHeartbeat();
heartbeatExecutor = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory("polaris-heartbeat"));
LOGGER.info("Created new heartbeat executor.");
InstanceHeartbeatRequest heartbeatRequest = new InstanceHeartbeatRequest();
BeanUtils.copyProperties(instanceRegisterRequest, heartbeatRequest);
heartbeatRequest.setInstanceID(instanceRegisterResponse.getInstanceId());
heartbeatExecutor.scheduleWithFixedDelay(() -> {
try {
// Check if heartbeat should still be running
if (!polarisDiscoveryProperties.getHeartbeatEnabled() ||
StringUtils.isBlank(polarisDiscoveryProperties.getHealthCheckUrl())) {
LOGGER.info("Heartbeat conditions no longer met, stopping heartbeat task.");
stopHeartbeat();
return;
}
// Perform health check
Map<String, String> headers = new HashMap<>(1);
headers.put(HttpHeaders.USER_AGENT, "polaris");
if (!OkHttpUtil.checkUrl(heartbeatRequest.getHost(), heartbeatRequest.getPort(),
polarisDiscoveryProperties.getHealthCheckUrl(), headers)) {
LOGGER.error("Backend service health check failed. health check endpoint = {}",
polarisDiscoveryProperties.getHealthCheckUrl());
return;
}
// Send heartbeat
polarisSDKContextManager.getProviderAPI().heartbeat(heartbeatRequest);
LOGGER.debug("Polaris heartbeat is sent successfully.");
}
catch (PolarisException e) {
LOGGER.error("Polaris heartbeat error with code [{}]", e.getCode(), e);
}
catch (Exception e) {
LOGGER.error("Polaris heartbeat runtime error", e);
}
}, polarisDiscoveryProperties.getHeartbeatInterval(), polarisDiscoveryProperties.getHeartbeatInterval(), SECONDS);
LOGGER.info("Heartbeat task scheduled with interval {} seconds.", polarisDiscoveryProperties.getHeartbeatInterval());
}
private void stopHeartbeat() {
if (heartbeatExecutor != null) {
try {
heartbeatExecutor.shutdownNow();
if (heartbeatExecutor.awaitTermination(5, SECONDS)) {
LOGGER.info("Polaris heartbeat task stopped gracefully.");
} else {
LOGGER.warn("Polaris heartbeat task did not terminate in time.");
}
} catch (InterruptedException e) {
LOGGER.warn("Interrupted while stopping heartbeat task.", e);
Thread.currentThread().interrupt();
} finally {
heartbeatExecutor = null;
}
}
}
@EventListener(RefreshScopeRefreshedEvent.class)
public void onPropertyRefreshed() {
if (!polarisDiscoveryProperties.getHeartbeatEnabled()) {
LOGGER.info("Heartbeat disabled via property refresh, stopping heartbeat task.");
stopHeartbeat();
}
}
@Override @Override
public void deregister(PolarisRegistration registration) { public void deregister(PolarisRegistration registration) {
LOGGER.info("De-registering from Polaris Server now..."); LOGGER.info("De-registering from Polaris Server now...");
@ -284,8 +200,6 @@ public class PolarisServiceRegistry implements ServiceRegistry<PolarisRegistrati
return; return;
} }
stopHeartbeat();
InstanceDeregisterRequest deRegisterRequest = new InstanceDeregisterRequest(); InstanceDeregisterRequest deRegisterRequest = new InstanceDeregisterRequest();
deRegisterRequest.setInstanceID(registration.getInstanceId()); deRegisterRequest.setInstanceID(registration.getInstanceId());
deRegisterRequest.setToken(polarisDiscoveryProperties.getToken()); deRegisterRequest.setToken(polarisDiscoveryProperties.getToken());
@ -307,7 +221,6 @@ public class PolarisServiceRegistry implements ServiceRegistry<PolarisRegistrati
@Override @Override
public void close() { public void close() {
stopHeartbeat();
} }
@Override @Override
@ -333,6 +246,5 @@ public class PolarisServiceRegistry implements ServiceRegistry<PolarisRegistrati
@Override @Override
public void destroy() { public void destroy() {
stopHeartbeat();
} }
} }

Loading…
Cancel
Save