apache/druid · info

Tier [ ] does not exist

Error message

Tier [%s] does not exist

What it means

LookupCoordinatorManager.getLookup() logs this warning and returns null when the lookup config exists but the requested tier is not in it. The lookup therefore cannot be resolved; callers must handle the null return.

Solutions

  1. List tiers via GET /druid/coordinator/v1/lookups/config and use an exact, case-sensitive tier name.
  2. Null-check getLookup()'s return in calling code.
  3. If the tier should exist, re-add it via POST /druid/coordinator/v1/lookups/config/{tier}.
  4. Confirm the client targets the intended cluster (tiers often differ per environment).

Example fix

// before
manager.getLookup("default", "country"); // tier never created
// after
manager.getLookup("__default", "country"); // configured tier name
Defensive patterns

Strategy: validation

Validate before calling

Map<String, Map<String, Object>> config = coordinatorManager.getKnownLookups();
if (config != null && config.containsKey(tier)) {
  LookupExtractorFactoryMapContainer c = coordinatorManager.getLookup(tier, lookupName);
  // c may still be null if the lookup itself is missing
}

Prevention

When it happens

Trigger: getLookup(tier, lookupName) is called with a tier name absent from the known-lookups map (prior.get(tier) == null) — wrong tier name, tier deleted, or lookup registered on another tier.

Common situations: API calls to /druid/coordinator/v1/lookups/{tier}/{lookup} with a nonexistent tier; environment drift where tiers differ between dev and prod; clients assuming the implicit '__default' tier that was never configured.

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/a14e2dbe92ae6170. Report an issue: GitHub.

Appendix: source

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

  /**
   * Try to find a lookupName spec for the specified lookupName.
   *
   * @param lookupName The lookupName to look for
   *
   * @return The lookupName spec if found or null if not found or if no lookups at all are found
   */
  @Nullable
  public LookupExtractorFactoryMapContainer getLookup(final String tier, final String lookupName)
  {
    final Map<String, Map<String, LookupExtractorFactoryMapContainer>> prior = getKnownLookups();
    if (prior == null) {
      LOG.warn("Requested tier [%s] lookupName [%s]. But no lookups exist!", tier, lookupName);
      return null;
    }
    final Map<String, LookupExtractorFactoryMapContainer> tierLookups = prior.get(tier);
    if (tierLookups == null) {
      LOG.warn("Tier [%s] does not exist", tier);
      return null;
    }
    return tierLookups.get(lookupName);
  }

  public boolean isStarted()
  {
    return lifecycleLock.isStarted();
  }

  @VisibleForTesting
  boolean awaitStarted(long waitTimeMs)
  {
    return lifecycleLock.awaitStarted(waitTimeMs, TimeUnit.MILLISECONDS);
  }

  // start() and stop() are synchronized so that they never run in parallel in case of ZK acting funny or druid bug and
  // coordinator becomes leader and drops leadership in quick succession.

View on GitHub (pinned to 9b90983fd2)