apache/druid · info

Requested delete of tier

Error message

Requested delete of tier [%s] that does not exist!

What it means

LookupCoordinatorManager.deleteTier() logs this warning and returns false when a lookup config exists but does not contain the requested tier key, so removing it is a no-op. Nothing is changed or persisted.

Solutions

  1. List existing tiers via GET /druid/coordinator/v1/lookups/config and confirm the exact tier name.
  2. Treat the false return as idempotent success if the goal is 'tier must not exist'.
  3. Fix the tier name in the client/tooling (case-sensitive match required).
  4. Serialize tier management to avoid concurrent delete race conditions.

Example fix

// before
manager.deleteTier("__defaul"); // typo
// after
manager.deleteTier("__default");
Defensive patterns

Strategy: validation

Validate before calling

Map<String, Map<String, Object>> config = coordinatorManager.getKnownLookups();
if (config == null || !config.containsKey(tier)) { /* tier absent: skip or treat as success */ }

Prevention

When it happens

Trigger: deleteTier(tier) is invoked with a tier name that is absent from the current known-lookups map (updateSpec.remove(tier) == null) — e.g., typo'd tier or tier already deleted.

Common situations: DELETE requests to /druid/coordinator/v1/lookups/config/{tier} with a wrong tier name; race where another operator already removed the tier; renaming tiers between deployments.

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


AI-assisted analysis of apache/druid@9b90983fd2 (2026-09-07). Data as JSON: /api/errors/ee4364fded998e08. Report an issue: GitHub.

Appendix: source

Thrown at server/src/main/java/org/apache/druid/server/lookup/cache/LookupCoordinatorManager.java:269

  {
    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) {
      final Map<String, Map<String, LookupExtractorFactoryMapContainer>> priorSpec = getKnownLookups();
      if (priorSpec == null) {
        LOG.warn("Requested delete lookup [%s]/[%s]. But no lookups exist!", tier, lookup);
        return false;
      }
      final Map<String, Map<String, LookupExtractorFactoryMapContainer>> updateSpec = new HashMap<>(priorSpec);

View on GitHub (pinned to 9b90983fd2)