alibaba/nacos · warning · NacosException
400
400
Error message
health check is still working, service: %s@@%s, cluster: %s
What it means
Thrown by HealthOperatorV2Impl.throwHealthCheckerException with INVALID_PARAM=400 when a health check update for a service+cluster is rejected because a health check is still running for that combination. This prevents conflicting concurrent health-check configuration changes.
Source
Thrown at naming/src/main/java/com/alibaba/nacos/naming/core/HealthOperatorV2Impl.java:118
for (Class<? extends AbstractHealthChecker> clazz : classes) {
try {
AbstractHealthChecker checker = clazz.newInstance();
checkerMap.put(checker.getType(), checker);
} catch (InstantiationException | IllegalAccessException e) {
Loggers.EVT_LOG.error("checkers error ", e);
}
}
return checkerMap;
}
private void throwHealthCheckerException(String groupName, String serviceName,
String clusterName)
throws NacosException {
String errorInfo =
String.format("health check is still working, service: %s@@%s, cluster: %s", groupName,
serviceName, clusterName);
throw new NacosException(NacosException.INVALID_PARAM, errorInfo);
}
}
View on GitHub (pinned to 9b989acdf1)
Solutions
- Wait for the in-progress health check to complete before retrying the update.
- Add a delay or backoff between successive health-check config changes for the same service+cluster.
- Check server-side logs for the stuck/slow health check and resolve the underlying cause.
- Serialize health-check updates per service+cluster to avoid concurrent conflicts.
Defensive patterns
Strategy: retry
Try / catch
int maxAttempts = 3;
long delay = 1000;
for (int i = 0; i < maxAttempts; i++) {
try {
healthOperator.updateHealthCheck(...);
break;
} catch (NacosException e) {
if (e.getMessage().contains("health check is still working")) {
Thread.sleep(delay);
delay *= 2;
} else { throw e; }
}
} Prevention
- Serialize health-check config updates per service+cluster to avoid concurrent conflicts.
- Add backoff between successive health-check operations for the same cluster.
- Monitor for stuck health checks on the server side that block new updates.
When it happens
Trigger: Calling the health-check update API for a groupName/serviceName/clusterName combination that already has an in-progress health check operation. The throwHealthCheckerException is invoked when the system detects the check is still active.
Common situations: Rapid successive health-check config updates for the same service+cluster. Concurrent admin operations targeting the same cluster. A previous health-check update did not complete (stuck or slow) and a new one was attempted. Automation loop re-triggering updates too frequently.
Related errors
AI-assisted analysis of alibaba/nacos@9b989acdf1 (2026-08-14).
Data as JSON: /api/errors/38de8f0104e4d329.
Report an issue: GitHub.