apache/seatunnel · error · IllegalArgumentException

Elasticsearch multi-table writer requires ElasticsearchMulti

Error message

Elasticsearch multi-table writer requires ElasticsearchMultiTableResourceManager

What it means

ElasticsearchSinkWriter.setMultiTableResourceManager validates that the provided MultiTableResourceManager is an ElasticsearchMultiTableResourceManager. Any other implementation cannot supply the ES clients the writer needs, so it throws IllegalArgumentException before adopting the resource.

Source

Thrown at seatunnel-connectors-v2/connector-elasticsearch/src/main/java/org/apache/seatunnel/connectors/seatunnel/elasticsearch/sink/ElasticsearchSinkWriter.java:144

        // MultiTableSinkWriter injects one shared client after constructing all table writers.
        // Standalone writers keep the existing fail-fast connection initialization behavior.
        if (!(context instanceof SinkContextProxy)) {
            initializeStandaloneClient();
        }
        context.registerFlushAction(this::timerFlush);
    }

    @Override
    public MultiTableResourceManager<EsRestClient> initMultiTableResourceManager(
            int tableSize, int queueSize) {
        return new ElasticsearchMultiTableResourceManager();
    }

    @Override
    public void setMultiTableResourceManager(
            MultiTableResourceManager<EsRestClient> multiTableResourceManager, int queueIndex) {
        if (!(multiTableResourceManager instanceof ElasticsearchMultiTableResourceManager)) {
            throw new IllegalArgumentException(
                    "Elasticsearch multi-table writer requires ElasticsearchMultiTableResourceManager");
        }
        releaseSharedClientResource();
        closeOwnedClient();
        ElasticsearchMultiTableResourceManager resourceManager =
                (ElasticsearchMultiTableResourceManager) multiTableResourceManager;
        try {
            ElasticsearchMultiTableResourceManager.ClientResource clientResource =
                    resourceManager.getOrCreateClientResource(config);
            this.esRestClient = clientResource.getEsRestClient();
            this.clusterInfo = clientResource.getClusterInfo();
            this.multiTableResourceManager = resourceManager;
            this.multiTableClientResource = clientResource;
            this.ownsEsRestClient = false;
            initializeSerializer(initialRowType);
        } catch (RuntimeException | Error e) {
            // A failed injection aborts MultiTableSinkWriter construction, whose close lifecycle
            // will not run. Close every cached connection group before propagating the failure.

View on GitHub (pinned to cf67b549a7)

Solutions

  1. Ensure the engine creates ElasticsearchMultiTableResourceManager for ES multi-table sinks
  2. Align connector and engine versions so the resource manager types match
  3. In tests, pass an actual ElasticsearchMultiTableResourceManager (with real or mocked EsRestClient) instead of a generic stub

Example fix

// before
MultiTableResourceManager<EsRestClient> rm = new GenericResourceManager<>(client);
writer.setMultiTableResourceManager(rm, 0);
// after
ElasticsearchMultiTableResourceManager rm = new ElasticsearchMultiTableResourceManager(clients);
writer.setMultiTableResourceManager(rm, 0);
Defensive patterns

Strategy: type-guard

Type guard

if (!(rm instanceof ElasticsearchMultiTableResourceManager)) {
    throw new IllegalArgumentException("Expected ElasticsearchMultiTableResourceManager, got " + rm.getClass());
}

Prevention

When it happens

Trigger: The engine/framework passes a MultiTableResourceManager<EsRestClient> that is not the Elasticsearch-specific implementation into setMultiTableResourceManager, typically in multi-table sink setups or tests exercising resource-manager wiring.

Common situations: Custom/engine changes supplying a generic resource manager; mismatched connector/engine versions where the ES resource manager class differs; unit tests passing stub implementations.

Understand the failure class

Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.

Related errors


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/dc06bf38005c75e8. Report an issue: GitHub.