{"record":{"id":"15ee977fa1aa127f","repo":"quarkusio/quarkus","slug":"duplicate-pool-name","errorCode":null,"errorMessage":"Duplicate pool name: ","messagePattern":"Duplicate pool name: ","errorType":"exception","errorClass":"java.lang.IllegalStateException","httpStatus":null,"severity":"error","filePath":"extensions/reactive-datasource/runtime/src/main/java/io/quarkus/reactive/datasource/runtime/ReactiveDatasourceHealthCheck.java","lineNumber":44,"sourceCode":"    private static final Logger log = Logger.getLogger(ReactiveDatasourceHealthCheck.class);\n\n    private final Map<String, PoolHealthEntry> pools = new ConcurrentHashMap<>();\n    private final String healthCheckResponseName;\n    private final String defaultHealthCheckSQL;\n\n    protected ReactiveDatasourceHealthCheck(String healthCheckResponseName, String defaultHealthCheckSQL) {\n        this.healthCheckResponseName = healthCheckResponseName;\n        this.defaultHealthCheckSQL = defaultHealthCheckSQL;\n    }\n\n    protected void addPool(String name, Pool pool) {\n        addPool(name, pool, defaultHealthCheckSQL);\n    }\n\n    protected void addPool(String name, Pool pool, String healthCheckSQL) {\n        final PoolHealthEntry previous = pools.put(name, new PoolHealthEntry(pool, healthCheckSQL));\n        if (previous != null) {\n            throw new IllegalStateException(\"Duplicate pool name: \" + name);\n        }\n    }\n\n    @Override\n    public HealthCheckResponse call() {\n        HealthCheckResponseBuilder builder = HealthCheckResponse.named(healthCheckResponseName);\n        builder.up();\n\n        for (Map.Entry<String, PoolHealthEntry> poolEntry : pools.entrySet()) {\n            final String dataSourceName = poolEntry.getKey();\n            final PoolHealthEntry entry = poolEntry.getValue();\n            try {\n                CompletableFuture<Void> databaseConnectionAttempt = new CompletableFuture<>();\n                Context context = Vertx.currentContext();\n                if (context != null) {\n                    log.debug(\"Run health check on the current Vert.x context\");\n                    context.runOnContext(v -> {\n                        entry.pool.query(entry.healthCheckSQL)","sourceCodeStart":26,"sourceCodeEnd":62,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/reactive-datasource/runtime/src/main/java/io/quarkus/reactive/datasource/runtime/ReactiveDatasourceHealthCheck.java#L26-L62","documentation":"ReactiveDatasourceHealthCheck aggregates one Vert.x pool per configured reactive datasource, keyed by datasource name. During initialization addPool() puts each pool into a map; if a second pool registers under a name already present, it throws IllegalStateException because health checks would collide and report ambiguous results.","triggerScenarios":"addPool() called twice with the same datasource name — typically two health-check instances or pool registrations for the same named datasource, or programmatic datasource creation reusing a name already registered.","commonSituations":"Registering multiple reactive datasources with duplicate quarkus.datasource.\"name\" identifiers; custom code extending ReactiveDatasourceHealthCheck and re-adding a pool; extension re-initialization after config reload.","solutions":["Check application.properties for duplicate quarkus.datasource.\"<name>\" blocks and make each datasource name unique","If creating datasources programmatically, ensure each is added to the health check only once","Review custom subclasses of ReactiveDatasourceHealthCheck for duplicate addPool calls","Quarkus version-upgrade check: remove duplicate ReactiveDatasourceHealthCheck bean registrations (e.g. @Produces plus built-in)"],"exampleFix":"// before (duplicate names)\nquarkus.datasource.\"db\".reactive.url=...\nquarkus.datasource.\"db\".reactive.url=...\n// after\nquarkus.datasource.\"orders\".reactive.url=...\nquarkus.datasource.\"users\".reactive.url=...","handlingStrategy":"validation","validationCode":"Set<String> names = new HashSet<>();\nfor (String ds : List.of(\"<ds1>\", \"<ds2>\")) {\n    if (!names.add(ds)) throw new IllegalStateException(\"Duplicate datasource name: \" + ds);\n}","typeGuard":null,"tryCatchPattern":"try {\n    healthCheck.addPool(name, pool, sql);\n} catch (IllegalStateException e) {\n    log.errorf(\"Duplicate pool registration: %s\", e.getMessage());\n    throw e; // fail fast at startup\n}","preventionTips":["Keep datasource names unique across application.properties","Never re-add an existing pool name to a health check","Watch for duplicated health check bean registrations in custom code"],"tags":["quarkus","reactive-datasource","health-check","configuration"],"backgroundTag":"duplicate-datasource-name","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}