aeron-io/aeron · error · ArchiveException
failed to send tagged replicate request
Error message
failed to send tagged replicate request
What it means
Thrown when a tagged replicate request could not be offered to the archive control publication. ArchiveProxy.taggedReplicate returned false after retries, so the archive never received the replication request carrying the replay/subscription tags. This is a transport-level failure on the control channel.
Solutions
- Reconnect the archive session (AeronArchive.connect) and retry taggedReplicate.
- Check the archive's load and control channel back-pressure counters; throttle concurrent client operations.
- Verify srcControlChannel connectivity from the destination archive host before replicating.
- Review Aeron error log for publication-level errors preceding the failure.
- Consider a dedicated control session for replication-heavy workloads to avoid contention with other clients.
Example fix
// before
archive.taggedReplicate(srcRecordingId, dstRecordingId, channelTag, subscriptionTag, srcControlStreamId, srcControlChannel, null);
// after
try {
archive.taggedReplicate(srcRecordingId, dstRecordingId, channelTag, subscriptionTag, srcControlStreamId, srcControlChannel, null);
} catch (ArchiveException e) {
if (e.message().contains("failed to send")) {
archive = AeronArchive.connect(ctx);
archive.taggedReplicate(srcRecordingId, dstRecordingId, channelTag, subscriptionTag, srcControlStreamId, srcControlChannel, null);
} else {
throw e;
}
} Defensive patterns
Strategy: try-catch
Validate before calling
if (archive == null || archive.context().isClosed()) { archive = AeronArchive.connect(ctx); } Type guard
static boolean isSendFailure(ArchiveException e) { return e.getMessage() != null && e.getMessage().contains("failed to send"); } Try / catch
try { archive.taggedReplicate(...); } catch (ArchiveException e) { if (isSendFailure(e)) { archive = AeronArchive.connect(ctx); archive.taggedReplicate(...); } else { throw e; } } Prevention
- Throttle concurrent archive operations to prevent control-channel back-pressure.
- Keep the session warm if tagged replication is issued intermittently.
- Verify source archive reachability before replication.
- Watch Aeron error logs for early publication-close signals.
When it happens
Trigger: Calling AeronArchive.taggedReplicate(srcRecordingId, dstRecordingId, channelTagId, subscriptionTagId, srcControlStreamId, srcControlChannel, liveDestination) while the control publication is closed, disconnected, or persistently back-pressured.
Common situations: Control session expired during a long catalog operation; destination archive under heavy load so the exclusive publication cannot accept offers; tags configured but the underlying session was already closed by the archive.
Understand the failure class
Background: "API request failed": what wrapped HTTP errors from external APIs mean and how to find the real cause — this error's family across 29 libraries.
Related errors
- failed to send replicate request
- failed to send stop replication request
- failed to send invalidate recording request
- failed to send list recording subscriptions request
- failed to send detach segments request
AI-assisted analysis of aeron-io/aeron@6d60124e15 (2026-09-12).
Data as JSON: /api/errors/c7c2b9df1677c455.
Report an issue: GitHub.
Appendix: source
Thrown at aeron-archive/src/main/java/io/aeron/archive/client/AeronArchive.java:1954
try
{
ensureConnected();
ensureNotReentrant();
lastCorrelationId = aeron.nextCorrelationId();
if (!archiveProxy.taggedReplicate(
srcRecordingId,
dstRecordingId,
channelTagId,
subscriptionTagId,
srcControlStreamId,
srcControlChannel,
liveDestination,
lastCorrelationId,
controlSessionId))
{
throw new ArchiveException("failed to send tagged replicate request");
}
return pollForResponse(lastCorrelationId);
}
finally
{
lock.unlock();
}
}
/**
* Replicate a recording from a source archive to a destination which can be considered a backup for a primary
* archive. The source recording will be replayed via the provided replay channel and use the original stream id.
* If the destination recording id is {@link io.aeron.Aeron#NULL_VALUE} then a new destination recording is created,
* otherwise the provided destination recording id will be extended. The details of the source recording
* descriptor will be replicated. The subscription used in the archive will be tagged with the provided tags.
* <p>
* For a source recording that is still active the replay can merge with the live stream and then follow itView on GitHub (pinned to 6d60124e15)