apache/druid · info
Requested delete tier
Error message
Requested delete tier [%s]. But no lookups exist!
What it means
LookupCoordinatorManager.deleteTier() returns false and logs this warning when the lookup coordinator has no known lookup configuration at all (getKnownLookups() returns null), so there is nothing to delete the tier from. It is a no-op guard, not an exception.
Solutions
- Verify the cluster actually has lookup configs: GET /druid/coordinator/v1/lookups/config (or /status for all).
- If the tier truly should not exist, treat the false return as success and skip the call.
- If lookups were expected, check connectivity/health of the lookup config manager (druid.manager.lookups config) and its backing store.
- Update the client to handle the false return rather than assuming an exception.
Example fix
// before
boolean ok = coordinatorManager.deleteTier("__default");
// after
boolean existing = coordinatorManager.getKnownLookups() != null;
boolean ok = existing && coordinatorManager.deleteTier("__default"); Defensive patterns
Strategy: type-guard
Validate before calling
boolean hasLookups = coordinatorManager.getKnownLookups() != null;
if (!hasLookups) { /* skip deleteTier or treat as success */ } Type guard
boolean lookupsConfigured = coordinatorManager.getKnownLookups() != null;
Prevention
- Null-check getKnownLookups() before delete operations.
- Treat boolean false returns as idempotent outcomes.
- Bootstrap lookup config before running deletion jobs.
- Use GET /druid/coordinator/v1/lookups/config to verify state first.
When it happens
Trigger: deleteTier(tier) is called before any lookup config has ever been persisted; the config manager returns null for LOOKUP_CONFIG_KEY (fresh cluster, or lookup config storage empty/unavailable).
Common situations: Calling the DELETE lookup-tier API on a cluster where no lookups were ever configured; tests invoking deleteTier on an uninitialized config manager; config wiped externally in ZooKeeper/derby-backed config store.
Understand the failure class
Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.
Related errors
- Requested delete lookup
- Requested delete of lookup
- Requested delete of lookup
- Requested delete of tier
- lookup management on node
AI-assisted analysis of apache/druid@9b90983fd2 (2026-09-07).
Data as JSON: /api/errors/8b7593959e9a60c0.
Report an issue: GitHub.
Appendix: source
Thrown at server/src/main/java/org/apache/druid/server/lookup/cache/LookupCoordinatorManager.java:263
}
return configManager.set(LOOKUP_CONFIG_KEY, updatedSpec, auditInfo).isOk();
}
}
public Map<String, Map<String, LookupExtractorFactoryMapContainer>> getKnownLookups()
{
Preconditions.checkState(lifecycleLock.awaitStarted(5, TimeUnit.SECONDS), "not started");
return lookupMapConfigRef.get();
}
public boolean deleteTier(final String tier, AuditInfo auditInfo)
{
Preconditions.checkState(lifecycleLock.awaitStarted(5, TimeUnit.SECONDS), "not started");
synchronized (this) {
final Map<String, Map<String, LookupExtractorFactoryMapContainer>> priorSpec = getKnownLookups();
if (priorSpec == null) {
LOG.warn("Requested delete tier [%s]. But no lookups exist!", tier);
return false;
}
final Map<String, Map<String, LookupExtractorFactoryMapContainer>> updateSpec = new HashMap<>(priorSpec);
if (updateSpec.remove(tier) == null) {
LOG.warn("Requested delete of tier [%s] that does not exist!", tier);
return false;
}
return configManager.set(LOOKUP_CONFIG_KEY, updateSpec, auditInfo).isOk();
}
}
public boolean deleteLookup(final String tier, final String lookup, AuditInfo auditInfo)
{
Preconditions.checkState(lifecycleLock.awaitStarted(5, TimeUnit.SECONDS), "not started");
synchronized (this) {View on GitHub (pinned to 9b90983fd2)