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

  1. Wait for the in-progress health check to complete before retrying the update.
  2. Add a delay or backoff between successive health-check config changes for the same service+cluster.
  3. Check server-side logs for the stuck/slow health check and resolve the underlying cause.
  4. 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

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.