{"record":{"id":"83a7e40b8f3796ac","repo":"apache/druid","slug":"if-configured-druid-broker-segment-ignoredtiers","errorCode":null,"errorMessage":"If configured, 'druid.broker.segment.ignoredTiers' must be non-empty","messagePattern":"If configured, 'druid\\.broker\\.segment\\.ignoredTiers' must be non-empty","errorType":"exception","errorClass":"ISE","httpStatus":null,"severity":"error","filePath":"server/src/main/java/org/apache/druid/client/BrokerServerView.java","lineNumber":247,"sourceCode":"   */\n  private void validateSegmentWatcherConfig(BrokerSegmentWatcherConfig watcherConfig)\n  {\n    if (watcherConfig.getWatchedTiers() != null\n        && watcherConfig.getIgnoredTiers() != null) {\n      throw new ISE(\n          \"At most one of 'druid.broker.segment.watchedTiers' \"\n          + \"and 'druid.broker.segment.ignoredTiers' can be configured.\"\n      );\n    }\n\n    if (watcherConfig.getWatchedTiers() != null\n        && watcherConfig.getWatchedTiers().isEmpty()) {\n      throw new ISE(\"If configured, 'druid.broker.segment.watchedTiers' must be non-empty\");\n    }\n\n    if (watcherConfig.getIgnoredTiers() != null\n        && watcherConfig.getIgnoredTiers().isEmpty()) {\n      throw new ISE(\"If configured, 'druid.broker.segment.ignoredTiers' must be non-empty\");\n    }\n  }\n\n  private QueryableDruidServer addServer(DruidServer server)\n  {\n    QueryableDruidServer retVal = druidClientFactory.make(server);\n    QueryableDruidServer exists = clients.put(server.getName(), retVal);\n    if (exists != null) {\n      log.warn(\"QueryRunner for server[%s] already exists!? Well it's getting replaced\", server);\n    }\n\n    return retVal;\n  }\n\n  private QueryableDruidServer removeServer(DruidServer server)\n  {\n    for (DataSegment segment : server.iterateAllSegments()) {\n      serverRemovedSegment(server.getMetadata(), segment);","sourceCodeStart":229,"sourceCodeEnd":265,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/server/src/main/java/org/apache/druid/client/BrokerServerView.java#L229-L265","documentation":"BrokerServerView.validateSegmentWatcherConfig() rejects an ignoredTiers config that is present but empty. Ignoring zero tiers is a no-op and indicates a misconfiguration, so the property must either be absent or list at least one tier.","triggerScenarios":"Setting druid.broker.segment.ignoredTiers= (empty value) or an empty list in broker runtime.properties, producing a non-null empty list passed to BrokerServerView.","commonSituations":"Blanking out the property after decommissioning a tier; template-generated configs emitting empty values; mixing up watchedTiers/ignoredTiers edits.","solutions":["Remove the druid.broker.segment.ignoredTiers property entirely or populate it with at least one tier, e.g. ignoredTiers=cold.","Confirm the tier names match the historicals' druid.server.tier values.","Restart the broker after the config change."],"exampleFix":"// before\ndruid.broker.segment.ignoredTiers=\n// after\ndruid.broker.segment.ignoredTiers=cold","handlingStrategy":"validation","validationCode":"List<String> ignored = getTierList(props, \"druid.broker.segment.ignoredTiers\");\nif (ignored != null && ignored.isEmpty()) {\n  throw new IllegalStateException(\"ignoredTiers configured but empty; remove it or list tiers\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Delete the property line instead of leaving an empty value.","Verify tier names against historicals' druid.server.tier values.","Validate broker configs at deploy time."],"tags":["druid","broker","configuration","segment-tiers"],"backgroundTag":"invalid-config-value","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"}