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
- Guard registration: only register when the type is not yet present.
- Register providers once during single-time initialization (e.g. static/singleton setup).
- 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
- Register providers exactly once (static init or singleton).
- Track registered types in your own set for idempotency.
- Use unique getTableType() names for custom providers.
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
- Duplicate table name
- Duplicate table: from provider
- No such table
- No such table
- No TableProvider registered for table type
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);
}
@OverrideView on GitHub (pinned to 12126d8942)