aeron-io/aeron · error · IllegalArgumentException
IPC merging is not supported
Error message
IPC merging is not supported
What it means
ReplayMerge's constructor validates its configuration and rejects IPC channels for the subscription, replay channel, replay destination, or live destination. Replay merge requires media (UDP) transports to coordinate the replay and live endpoints, so IllegalArgumentException is thrown immediately when any URI starts with the IPC scheme 'aeron:ipc'.
Solutions
- Use a UDP channel, e.g. 'aeron:udp?endpoint=host:port', for the subscription
- Set replayDestination and liveDestination to UDP URIs, e.g. 'aeron:udp?endpoint=localhost:0'
- Switch replayChannel to a UDP URI
- If IPC-only delivery is acceptable, use plain ReplayParams/ArchiveClient.replay instead of ReplayMerge
Example fix
// before
Subscription sub = aeron.addSubscription("aeron:ipc", 1001);
new ReplayMerge(archive, sub, "aeron:ipc", "aeron:ipc", "aeron:ipc", recordingId, 0);
// after
Subscription sub = aeron.addSubscription("aeron:udp?endpoint=0.0.0.0:2000|control-mode=manual", 1001);
new ReplayMerge(archive, sub, "aeron:udp?endpoint=localhost:2000", "aeron:udp?endpoint=localhost:0", "aeron:udp?endpoint=localhost:2001", recordingId, 0); Defensive patterns
Strategy: validation
Validate before calling
if (sub.channel().startsWith("aeron:ipc") || replayChannel.startsWith("aeron:ipc")
|| replayDest.startsWith("aeron:ipc") || liveDest.startsWith("aeron:ipc")) {
throw new IllegalArgumentException("ReplayMerge requires UDP channels");
} Try / catch
try { new ReplayMerge(archive, sub, replayChannel, replayDest, liveDest, recordingId, position); }
catch (IllegalArgumentException e) { if (e.getMessage().equals("IPC merging is not supported")) { switchToUdpConfig(); } } Prevention
- Always use UDP URIs for ReplayMerge inputs
- Validate channel URIs at config load time
- Document that local IPC setups need UDP endpoints for merge
When it happens
Trigger: Creating a ReplayMerge where subscription.channel(), replayChannel, replayDestination, or liveDestination starts with 'aeron:ipc'.
Common situations: Developers testing locally default everything to IPC for simplicity, then try ReplayMerge; copy-pasting a subscription from a non-merge IPC setup into a ReplayMerge.
Understand the failure class
Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.
Related errors
- Subscription URI must have 'control-mode=manual' uri=
- local archive control must be IPC
- local archive control must be IPC
- AeronCluster.Context ingressEndpoints must be null when…
- local archive control must be IPC
AI-assisted analysis of aeron-io/aeron@6d60124e15 (2026-09-12).
Data as JSON: /api/errors/36edd9a5fa396f84.
Report an issue: GitHub.
Appendix: source
Thrown at aeron-archive/src/main/java/io/aeron/archive/client/ReplayMerge.java:128
* @param mergeProgressTimeoutMs to use for progress checks.
*/
public ReplayMerge(
final Subscription subscription,
final AeronArchive archive,
final String replayChannel,
final String replayDestination,
final String liveDestination,
final long recordingId,
final long startPosition,
final EpochClock epochClock,
final long mergeProgressTimeoutMs)
{
if (subscription.channel().startsWith(IPC_CHANNEL) ||
replayChannel.startsWith(IPC_CHANNEL) ||
replayDestination.startsWith(IPC_CHANNEL) ||
liveDestination.startsWith(IPC_CHANNEL))
{
throw new IllegalArgumentException("IPC merging is not supported");
}
if (!subscription.channel().contains("control-mode=manual"))
{
throw new IllegalArgumentException(
"Subscription URI must have 'control-mode=manual' uri=" + subscription.channel());
}
this.archive = archive;
this.subscription = subscription;
this.epochClock = epochClock;
this.replayDestination = replayDestination;
this.liveDestination = liveDestination;
this.recordingId = recordingId;
this.startPosition = startPosition;
this.mergeProgressTimeoutMs = mergeProgressTimeoutMs;
replayChannelUri = ChannelUri.parse(replayChannel);View on GitHub (pinned to 6d60124e15)