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));
}
@OverrideView on GitHub (pinned to 55bb57d202)
Solutions
- End the existing block with endBlock(blockName, annotation) before calling startBlock again
- Use a unique block name (append a counter, iteration index, or UUID) for repeated blocks
- Review instrumentation call sites flagged by the tracer to find the duplicate startBlock
- 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
- Generate unique block names for repeated or looped instrumentation
- Always pair startBlock with endBlock, including on exception paths
- Keep block names in shared constants to avoid case/typo mismatches
- Avoid calling startBlock from both a retry wrapper and the retried code
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
- Plugin-configured tracer provider ('%s') does not match syst
- Only a single plugin should set the tracer provider ('%s').
- DISTRIBUTED_TRACING_ERROR
AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04).
Data as JSON: /api/errors/ed3cb6c290eefe73.
Report an issue: GitHub.