apache/druid · warning

Found lookups for tier

Error message

Found lookups for tier [%s] in DB, but no nodes discovered for it

What it means

During the lookup management loop, the coordinator compares tiers that have lookups configured in the metadata store (DB) against tiers discovered from live lookup nodes. If a tier has lookups configured but no nodes were discovered to host them, it logs a warning. The lookups for that tier cannot be loaded anywhere until nodes join.

Solutions

  1. Verify lookup nodes for the tier are running and discoverable via service discovery.
  2. Check the tier name in lookup configuration matches the druid.lookup.lookupTier of running nodes.
  3. If the tier is intentionally empty, remove its lookups from the DB or delete the tier.

Example fix

// before (DB config)
{"tier":"__default","lookups":{"country":{"v":1,...}}}
// after: ensure nodes announce tier
// druid.lookup.lookupTier="__default" and node is up, or remove unused lookups from the tier
Defensive patterns

Strategy: validation

Validate before calling

// before relying on a tier
boolean tierHasNodes = lookupCoordinatorManager.getAllTiers().contains(tier);
if (!tierHasNodes) { LOG.warn("tier %s has no nodes; lookups will not be loaded", tier); }

Prevention

When it happens

Trigger: lookupManagementLoop runs, allLookupTiers from the DB contains a non-empty tier, and lookupNodeDiscovery.getAllTiers() does not report that tier.

Common situations: All lookup nodes of a tier are down; tier name typo between cluster configuration and DB entries; service discovery (druid.discovery) misconfiguration; nodes not yet started after fresh deployment.

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

Appendix: source

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

    final Map<String, Map<String, LookupExtractorFactoryMapContainer>> allLookupTiers = lookupMapConfigRef.get();

    if (allLookupTiers == null) {
      LOG.info("Not updating lookups because no data exists");
      return;
    }

    LOG.debug("Starting lookup sync for on all nodes.");

    try {
      List<ListenableFuture<Map.Entry>> futures = new ArrayList<>();

      Set<String> discoveredLookupTiers = lookupNodeDiscovery.getAllTiers();

      // Check and Log warnings about lookups configured by user in DB but no nodes discovered to load those.
      for (String tierInDB : allLookupTiers.keySet()) {
        if (!discoveredLookupTiers.contains(tierInDB) &&
            !allLookupTiers.getOrDefault(tierInDB, ImmutableMap.of()).isEmpty()) {
          LOG.warn("Found lookups for tier [%s] in DB, but no nodes discovered for it", tierInDB);
        }
      }

      for (String tier : discoveredLookupTiers) {

        LOG.debug("Starting lookup mgmt for tier [%s].", tier);

        final Map<String, LookupExtractorFactoryMapContainer> tierLookups = allLookupTiers.getOrDefault(tier, ImmutableMap.of());
        for (final HostAndPortWithScheme node : lookupNodeDiscovery.getNodesInTier(tier)) {

          LOG.debug(
              "Starting lookup mgmt for tier [%s] and host [%s:%s:%s].",
              tier,
              node.getScheme(),
              node.getHostText(),
              node.getPort()
          );

View on GitHub (pinned to 9b90983fd2)