From fafc0cb17e6e6cd1ba2fca9a59758d1848a278b2 Mon Sep 17 00:00:00 2001 From: Dmytro Vyazelenko <696855+vyazelenko@users.noreply.github.com> Date: Wed, 17 Apr 2024 17:14:40 +0200 Subject: [PATCH] [Java] Fix race when reusing an `Aeron` instance that was created in `ClusterBackup.Context.conclude` and assigned to `AeronArchive.Context`. This instance has no lock and is running in the invoker mode. The net result is sharing non-thread-safe object across the threads. --- .../java/io/aeron/test/cluster/TestBackupNode.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/aeron-test-support/src/main/java/io/aeron/test/cluster/TestBackupNode.java b/aeron-test-support/src/main/java/io/aeron/test/cluster/TestBackupNode.java index 3769053aae..0950e22a12 100644 --- a/aeron-test-support/src/main/java/io/aeron/test/cluster/TestBackupNode.java +++ b/aeron-test-support/src/main/java/io/aeron/test/cluster/TestBackupNode.java @@ -143,14 +143,17 @@ TestMediaDriver mediaDriver() public long recordingLogStartPosition() { - try (RecordingLog recordingLog = new RecordingLog(clusterBackup.context().clusterDir(), false)) + try (RecordingLog recordingLog = new RecordingLog(context.clusterBackupContext.clusterDir(), false)) { final long recordingId = Objects.requireNonNull(recordingLog.findLastTerm()).recordingId; - final AeronArchive.Context ctx = clusterBackup.context().archiveContext() - .clone() - .controlResponseStreamId(ThreadLocalRandom.current().nextInt()); - try (AeronArchive aeronArchive = AeronArchive.connect(ctx)) + final AeronArchive.Context backupArchiveContext = context.clusterBackupContext.archiveContext(); + try (AeronArchive aeronArchive = AeronArchive.connect(new AeronArchive.Context() + .aeronDirectoryName(backupArchiveContext.aeronDirectoryName()) + .controlRequestChannel(backupArchiveContext.controlRequestChannel()) + .controlRequestStreamId(backupArchiveContext.controlRequestStreamId()) + .controlResponseChannel(backupArchiveContext.controlResponseChannel()) + .controlResponseStreamId(ThreadLocalRandom.current().nextInt()))) { return aeronArchive.getStartPosition(recordingId); }