apache/beam · error · IllegalArgumentException

Provider is already registered for table type

Error message

Provider is already registered for table type: ${type}

What it means

InMemoryMetaStore.registerProvider rejects registering two providers for the same (lowercased) table type string with IllegalArgumentException. The type string is the map key, so duplicates would silently overwrite an existing provider.

Solutions

  1. Guard registration: only register when the type is not yet present.
  2. Register providers once during single-time initialization (e.g. static/singleton setup).
  3. Give the second provider a distinct getTableType() value.

Example fix

// before
metaStore.registerProvider(new TextTableProvider());
metaStore.registerProvider(new TextTableProvider()); // throws
// after
if (metaStore.getTables() != null && !metaStoreProvidersContains(metaStore, "text")) {
  metaStore.registerProvider(new TextTableProvider());
} // or simply register once in setup
Defensive patterns

Strategy: validation

Validate before calling

if (!registeredTypes.add(provider.getTableType().toLowerCase())) {
  return; // already registered
}
metaStore.registerProvider(provider);

Try / catch

try {
  metaStore.registerProvider(provider);
} catch (IllegalArgumentException e) {
  if (e.getMessage().startsWith("Provider is already registered")) { /* benign re-init */ }
}

Prevention

When it happens

Trigger: Calling registerProvider twice with providers whose getTableType() normalize to the same string, e.g. two TextTableProvider instances or a custom provider declaring type 'text'.

Common situations: Test suites registering providers in both @BeforeEach and constructor; app initialization paths that may run more than once; two custom providers accidentally using the same type name.

Understand the failure class

Background: Conflicting config options: "cannot be used together" — configuration validation errors across open-source libraries — this error's family across 162 libraries.

Related errors


AI-assisted analysis of apache/beam@12126d8942 (2026-09-13). Data as JSON: /api/errors/cba800c3010f625c. Report an issue: GitHub.

Appendix: source

Thrown at sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/store/InMemoryMetaStore.java:105

  protected void validateTableType(Table table) {
    if (providers.containsKey(table.getType().toLowerCase())) {
      return;
    }
    // check if there is a nested metastore that supports this table
    @Nullable InMemoryMetaStore nestedMemoryMetastore =
        (InMemoryMetaStore) providers.get(getTableType());
    if (nestedMemoryMetastore != null) {
      nestedMemoryMetastore.validateTableType(table);
    } else {
      throw new IllegalArgumentException("Table type: " + table.getType() + " not supported!");
    }
  }

  @Override
  public void registerProvider(TableProvider provider) {
    String type = provider.getTableType().toLowerCase();
    if (providers.containsKey(type)) {
      throw new IllegalArgumentException("Provider is already registered for table type: " + type);
    }

    initTablesFromProvider(provider);
    this.providers.put(type, provider);
  }

  private void initTablesFromProvider(TableProvider provider) {
    Map<String, Table> tables = provider.getTables();
    for (String tableName : tables.keySet()) {
      if (this.tables.containsKey(tableName)) {
        throw new IllegalStateException(
            "Duplicate table: " + tableName + " from provider: " + provider);
      }
    }
    this.tables.putAll(tables);
  }

  @Override

View on GitHub (pinned to 12126d8942)