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

  1. Verify the cluster actually has lookup configs: GET /druid/coordinator/v1/lookups/config (or /status for all).
  2. If the tier truly should not exist, treat the false return as success and skip the call.
  3. If lookups were expected, check connectivity/health of the lookup config manager (druid.manager.lookups config) and its backing store.
  4. 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

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


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)