{"record":{"id":"c174d22ab3778dba","repo":"apache/druid","slug":"asked-to-add-data-segment-that-already-exists-se","errorCode":null,"errorMessage":"Asked to add data segment that already exists!? server[%s], segment[%s]","messagePattern":"Asked to add data segment that already exists!\\? server\\[(.+?)\\], segment\\[(.+?)\\]","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"server/src/main/java/org/apache/druid/client/DruidServer.java","lineNumber":244,"sourceCode":"   * replica-reconciliation logic to consult.\n   */\n  public DruidServer addDataSegment(DataSegment segment, @Nullable PartialLoadProfile profile)\n  {\n    final long sizeToAdd = (profile != null && profile.loadedBytes() != null)\n                           ? profile.loadedBytes()\n                           : segment.getSize();\n    // ConcurrentHashMap.compute() ensures that all actions for specific dataSource are linearizable.\n    dataSources.compute(\n        segment.getDataSource(),\n        (dataSourceName, dataSource) -> {\n          if (dataSource == null) {\n            dataSource = new DruidDataSource(dataSourceName, ImmutableMap.of(\"client\", \"side\"));\n          }\n          if (dataSource.addSegmentIfAbsent(segment, profile)) {\n            currSize.addAndGet(sizeToAdd);\n            totalSegments.incrementAndGet();\n          } else {\n            log.warn(\n                \"Asked to add data segment that already exists!? server[%s], segment[%s]\",\n                getName(),\n                segment.getId()\n            );\n          }\n          return dataSource;\n        }\n    );\n    return this;\n  }\n\n  /**\n   * Returns the partial-load profile for the given segment, or {@code null} if the segment was loaded as a regular\n   * full-load (no partial-load metadata announced).\n   */\n  @Nullable\n  public PartialLoadProfile getPartialLoadProfile(SegmentId segmentId)\n  {","sourceCodeStart":226,"sourceCodeEnd":262,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/server/src/main/java/org/apache/druid/client/DruidServer.java#L226-L262","documentation":"DruidServer.addDataSegment increments currSize/totalSegments only when dataSource.addSegmentIfAbsent succeeds; when a segment with the same id already exists it logs this warning and skips. It indicates duplicate segment-add events for the same server.","triggerScenarios":"addDataSegment (or addSegment from DruidServer) invoked twice for the same DataSegment id, e.g. replayed inventory events or repeated server segment announcements.","commonSituations":"Historical re-announcing segments after reconnect, duplicate server inventory view registrations, test suites reusing a DruidServer instance across cases.","solutions":["Check why the same segment id was announced twice (historical restart loop, duplicate watchers) in historical and coordinator logs","Ensure each server inventory view instance is registered only once","Ignore if from a one-off reconnect; investigate if currSize/totalSegments deviate from expected values afterward","If in tests, use a fresh DruidServer per test or remove the segment before re-adding"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// check before re-adding\nif (server.getSegment(segment.getId()) != null) { log.info(\"already present\"); return; }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Suppress duplicate announcements from historicals (idempotent announce paths)","Register each HttpServerInventoryView exactly once","In tests, construct a fresh DruidServer per case","Track currSize deltas to detect accounting drift"],"tags":["cluster","segment-lifecycle","duplicate-event"],"backgroundTag":"internal-invariant-violation","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"}