{"record":{"id":"a14e2dbe92ae6170","repo":"apache/druid","slug":"tier-s-does-not-exist","errorCode":null,"errorMessage":"Tier [%s] does not exist","messagePattern":"Tier \\[(.+?)\\] does not exist","errorType":"console","errorClass":null,"httpStatus":null,"severity":"info","filePath":"server/src/main/java/org/apache/druid/server/lookup/cache/LookupCoordinatorManager.java","lineNumber":356,"sourceCode":"\n  /**\n   * Try to find a lookupName spec for the specified lookupName.\n   *\n   * @param lookupName The lookupName to look for\n   *\n   * @return The lookupName spec if found or null if not found or if no lookups at all are found\n   */\n  @Nullable\n  public LookupExtractorFactoryMapContainer getLookup(final String tier, final String lookupName)\n  {\n    final Map<String, Map<String, LookupExtractorFactoryMapContainer>> prior = getKnownLookups();\n    if (prior == null) {\n      LOG.warn(\"Requested tier [%s] lookupName [%s]. But no lookups exist!\", tier, lookupName);\n      return null;\n    }\n    final Map<String, LookupExtractorFactoryMapContainer> tierLookups = prior.get(tier);\n    if (tierLookups == null) {\n      LOG.warn(\"Tier [%s] does not exist\", tier);\n      return null;\n    }\n    return tierLookups.get(lookupName);\n  }\n\n  public boolean isStarted()\n  {\n    return lifecycleLock.isStarted();\n  }\n\n  @VisibleForTesting\n  boolean awaitStarted(long waitTimeMs)\n  {\n    return lifecycleLock.awaitStarted(waitTimeMs, TimeUnit.MILLISECONDS);\n  }\n\n  // start() and stop() are synchronized so that they never run in parallel in case of ZK acting funny or druid bug and\n  // coordinator becomes leader and drops leadership in quick succession.","sourceCodeStart":338,"sourceCodeEnd":374,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/server/src/main/java/org/apache/druid/server/lookup/cache/LookupCoordinatorManager.java#L338-L374","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["List tiers via GET /druid/coordinator/v1/lookups/config and use an exact, case-sensitive tier name.","Null-check getLookup()'s return in calling code.","If the tier should exist, re-add it via POST /druid/coordinator/v1/lookups/config/{tier}.","Confirm the client targets the intended cluster (tiers often differ per environment)."],"exampleFix":"// before\nmanager.getLookup(\"default\", \"country\"); // tier never created\n// after\nmanager.getLookup(\"__default\", \"country\"); // configured tier name","handlingStrategy":"validation","validationCode":"Map<String, Map<String, Object>> config = coordinatorManager.getKnownLookups();\nif (config != null && config.containsKey(tier)) {\n  LookupExtractorFactoryMapContainer c = coordinatorManager.getLookup(tier, lookupName);\n  // c may still be null if the lookup itself is missing\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Validate tier names against GET /druid/coordinator/v1/lookups/config.","Null-check getLookup() return values.","Create missing tiers explicitly before adding/reading lookups.","Keep tier naming consistent across environments."],"tags":["lookups","coordinator","read","not-found"],"backgroundTag":"resource-not-found","analyzedSha":"9b90983fd291f26935af934383ce360473179e4d","analyzedAt":"2026-09-07T13:32:30.957Z","contentChangedAt":"2026-09-07T13:32:30.957Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}