apache/beam · info

DNP: Reconciling missing partition

Error message

DNP: Reconciling missing partition: {}

What it means

DetectNewPartitionsAction logs 'DNP: Reconciling missing partition: {}' when computing the new watermark it finds gaps in the keyspace coverage and must reconcile (attempt to re-register) missing partitions before the watermark can advance. It is an informational reconciliation signal from the Bigtable change stream connector.

Solutions

  1. No action usually needed; the connector reconciles automatically.
  2. If the same partition is logged repeatedly, inspect the metadata table and parent partition coverage for that range.
  3. Check that new partitions' parent lists cover the same keyspace (see ProcessNewPartitionsAction) to avoid repeated reconciliation failures.
Defensive patterns

Strategy: validation

Prevention

When it happens

Trigger: getNewWatermark (via maybeWatermark) computes missingPartitions from the entire keyspace and each missing range must be reconciled against newPartitions/parent partitions.

Common situations: Ongoing split/merge operations; first runs after pipeline start; recovery after metadata inconsistency. Usually self-healing.

Understand the failure class

Background: "This is a bug, please report it": internal invariant violations, unreachable panics, and SNH errors explained — this error's family across 47 libraries.

Related errors


AI-assisted analysis of apache/beam@12126d8942 (2026-09-13). Data as JSON: /api/errors/0cf06698d47c16d7. Report an issue: GitHub.

Appendix: source

Thrown at sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigtable/changestreams/action/DetectNewPartitionsAction.java:164

      LOG.warn(
          "DNP: Updating watermark failed due to overlapping: {}",
          partitionsToString(overlappingStreamPartitions));
      return Optional.empty();
    }

    for (NewPartition newPartition : newPartitions) {
      partitions.addAll(newPartition.getParentPartitions());
      if (newPartition.getLowWatermark().compareTo(lowWatermark) < 0) {
        lowWatermark = newPartition.getLowWatermark();
      }
    }

    List<ByteStringRange> missingPartitions = getMissingPartitionsFromEntireKeySpace(partitions);
    if (missingPartitions.isEmpty()) {
      LOG.info("DNP: Updating watermark: {}", lowWatermark);
      return Optional.of(lowWatermark);
    }
    LOG.warn(
        "DNP: Updating watermark failed due to missing {} partitions : {}.",
        missingPartitions.size(),
        partitionsToString(missingPartitions));
    return Optional.empty();
  }

  /**
   * Uses PartitionReconciler to process any partitions that it has found to be missing for too long
   * and restarts them. For more details on why this is necessary see {@link PartitionReconciler}
   *
   * @param receiver used to output reconciled partitions
   * @param watermarkEstimator read the low watermark for all partitions
   */
  private void processReconcilerPartitions(
      OutputReceiver<PartitionRecord> receiver,
      ManualWatermarkEstimator<Instant> watermarkEstimator,
      Instant startTime) {
    for (PartitionRecord reconciledPartition :

View on GitHub (pinned to 12126d8942)