alibaba/canal · error · ServiceException

当前集群下存在Instance配置,无法删除

Error message

当前集群下存在Instance配置,无法删除

What it means

Thrown by CanalClusterServiceImpl.delete(id) when no servers remain but CanalInstanceConfig rows still reference clusterId. The second pre-delete guard blocks deletion to avoid orphan instance configs.

Source

Thrown at admin/admin-web/src/main/java/com/alibaba/otter/canal/admin/service/impl/CanalClusterServiceImpl.java:40

    public CanalCluster detail(Long id) {
        return CanalCluster.find.byId(id);
    }

    public void update(CanalCluster canalCluster) {
        canalCluster.update("name", "zkHosts");
    }

    public void delete(Long id) {
        // 判断集群下是否存在server信息
        int serverCnt = NodeServer.find.query().where().eq("clusterId", id).findCount();
        if (serverCnt > 0) {
            throw new ServiceException("当前集群下存在Server, 无法删除");
        }

        // 判断集群下是否存在instance信息
        int instanceCnt = CanalInstanceConfig.find.query().where().eq("clusterId", id).findCount();
        if (instanceCnt > 0) {
            throw new ServiceException("当前集群下存在Instance配置,无法删除");
        }

        CanalCluster canalCluster = CanalCluster.find.byId(id);
        if (canalCluster != null) {
            canalCluster.delete();
        }
    }

    public List<CanalCluster> findList(CanalCluster canalCluster) {
        Query<CanalCluster> query = CanalCluster.find.query();
        query.order().asc("id");
        return query.findList();
    }
}

View on GitHub (pinned to 87be50e876)

Solutions

  1. Delete or reassign all CanalInstanceConfig rows whose clusterId == id before deleting the cluster.
  2. Re-run the cluster delete once the instance count is zero.
  3. Audit for orphan instance configs via SELECT count(*) FROM canal_instance_config WHERE cluster_id = <id>.
  4. Use the instance admin UI/API to remove instances rather than direct DB deletion.
Defensive patterns

Strategy: validation

Validate before calling

int instanceCnt = CanalInstanceConfig.find.query().where().eq("clusterId", clusterId).findCount();
if (instanceCnt > 0) {
    throw new IllegalStateException("Cannot delete cluster: " + instanceCnt + " instance config(s) still attached");
}

Prevention

When it happens

Trigger: DELETE a cluster after removing its servers, but instance configs still carry clusterId == id. The instance count check throws 'cluster has Instance config(s), cannot delete'.

Common situations: Instance configs not cleaned up when their server/cluster was removed; instances migrated but clusterId not updated; manual DB edits leaving dangling references.

Related errors


AI-assisted analysis of alibaba/canal@87be50e876 (2026-08-14). Data as JSON: /api/errors/fe3574676c8166e5. Report an issue: GitHub.