prestodb/presto · error · PrestoException

DISTRIBUTED_TRACING_ERROR

DISTRIBUTED_TRACING_ERROR

Error message

Duplicated block inserted: 

What it means

SimpleTracer.startBlock registers a new tracing block by name in blockMap and recorderBlockMap. Block names must be unique within the tracer; inserting a name that already exists would silently overwrite live tracing data, so it is rejected with DISTRIBUTED_TRACING_ERROR.

Source

Thrown at presto-main-base/src/main/java/com/facebook/presto/tracing/SimpleTracer.java:52

    public final String traceToken;

    public SimpleTracer(String traceToken)
    {
        this.traceToken = traceToken;
        addPoint("Start tracing");
    }

    @Override
    public void addPoint(String annotation)
    {
        pointList.add(new SimpleTracerPoint(annotation));
    }

    @Override
    public void startBlock(String blockName, String annotation)
    {
        if (blockMap.containsKey(blockName)) {
            throw new PrestoException(DISTRIBUTED_TRACING_ERROR, "Duplicated block inserted: " + blockName);
        }
        SimpleTracerBlock block = new SimpleTracerBlock(annotation);
        blockMap.put(blockName, block);
        synchronized (recorderBlockMap) {
            recorderBlockMap.put(blockName, block);
        }
    }

    @Override
    public void addPointToBlock(String blockName, String annotation)
    {
        if (!blockMap.containsKey(blockName)) {
            throw new PrestoException(DISTRIBUTED_TRACING_ERROR, "Adding point to non-existing block: " + blockName);
        }
        blockMap.get(blockName).addPoint(new SimpleTracerPoint(annotation));
    }

    @Override

View on GitHub (pinned to 55bb57d202)

Solutions

  1. End the existing block with endBlock(blockName, annotation) before calling startBlock again
  2. Use a unique block name (append a counter, iteration index, or UUID) for repeated blocks
  3. Review instrumentation call sites flagged by the tracer to find the duplicate startBlock
  4. Check for leaked blocks from earlier failures that were never ended

Example fix

// before
tracer.startBlock("query-block", annotation);
for (Stage stage : stages) {
    tracer.startBlock("stage-block", stageAnnotation); // duplicate
}
// after
for (Stage stage : stages) {
    tracer.startBlock("stage-block-" + stage.getId(), stageAnnotation);
}
Defensive patterns

Strategy: try-catch

Validate before calling

if (tracer instanceof SimpleTracer) {
    // only start if not already started
}
// prefer tracking names yourself before calling:
boolean canStart = !startedBlockNames.contains(blockName);

Type guard

boolean canStartBlock(SimpleTracer tracer, String blockName) {
    return blockName != null && !startedBlockNames.contains(blockName);
}

Try / catch

try {
    tracer.startBlock(blockName, annotation);
} catch (PrestoException e) {
    if (e.getMessage().startsWith("Duplicated block inserted")) {
        LOG.warn("Block %s already started; skipping duplicate startBlock", blockName);
    } else {
        throw e;
    }
}

Prevention

When it happens

Trigger: Calling startBlock(blockName, annotation) with a blockName that was already passed to startBlock and not yet removed by endBlock.

Common situations: Copy-pasted instrumentation code that reuses a hard-coded block name across iterations or threads; a retry path calling startBlock twice for the same logical block; forgetting endBlock before starting a same-named block.

Related errors


AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04). Data as JSON: /api/errors/ed3cb6c290eefe73. Report an issue: GitHub.