Skip to content

Commit

Permalink
[Java] Resolve canonical file path when creating directories.
Browse files Browse the repository at this point in the history
  • Loading branch information
vyazelenko committed Jan 26, 2024
1 parent b8363db commit ceb99eb
Show file tree
Hide file tree
Showing 8 changed files with 186 additions and 85 deletions.
17 changes: 12 additions & 5 deletions aeron-archive/src/main/java/io/aeron/archive/Archive.java
Original file line number Diff line number Diff line change
Expand Up @@ -1069,15 +1069,22 @@ public void conclude()
{
archiveDir = new File(archiveDirectoryName);
}
else

if (null == markFileDir)
{
archiveDirectoryName = archiveDir.getAbsolutePath();
final String markFileDirPath = Configuration.markFileDir();
markFileDir = !Strings.isEmpty(markFileDirPath) ? new File(markFileDirPath) : archiveDir;
}

if (null == markFileDir)
try
{
archiveDir = archiveDir.getCanonicalFile();
archiveDirectoryName = archiveDir.getAbsolutePath();
markFileDir = markFileDir.getCanonicalFile();
}
catch (final IOException e)
{
final String dir = Configuration.markFileDir();
markFileDir = !Strings.isEmpty(dir) ? new File(dir) : archiveDir;
throw new UncheckedIOException(e);
}

if (deleteArchiveOnStart)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@
import org.agrona.concurrent.status.CountersReader;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import org.junit.jupiter.params.ParameterizedTest;
Expand Down Expand Up @@ -269,22 +268,21 @@ void configurationMarkFileDirReturnsValueSet(final String markFileDir)
}

@Test
@Disabled
void concludeShouldCreateMarkFileDirSetViaSystemProperty(final @TempDir File tempDir)
void concludeShouldCreateMarkFileDirSetViaSystemProperty(final @TempDir File tempDir) throws IOException
{
final File rootDir = new File(tempDir, "root");
final File markFileDir = new File(rootDir, "mark-file-dir");
final File markFileDir = new File(rootDir, "mark/./file/../dir");
assertFalse(markFileDir.exists());

System.setProperty(MARK_FILE_DIR_PROP_NAME, markFileDir.getAbsolutePath());
System.setProperty(MARK_FILE_DIR_PROP_NAME, markFileDir.getPath());
try
{
assertSame(context.archiveDir(), context.markFileDir());
assertNull(context.markFileDir());

context.conclude();

assertEquals(markFileDir, context.markFileDir());
assertTrue(markFileDir.exists());
assertEquals(markFileDir.getCanonicalFile(), context.markFileDir());
assertTrue(markFileDir.getCanonicalFile().exists());
}
finally
{
Expand All @@ -293,17 +291,17 @@ void concludeShouldCreateMarkFileDirSetViaSystemProperty(final @TempDir File tem
}

@Test
void concludeShouldCreateMarkFileDirSetDirectly(final @TempDir File tempDir)
void concludeShouldCreateMarkFileDirSetDirectly(final @TempDir File tempDir) throws IOException
{
final File rootDir = new File(tempDir, "root");
final File markFileDir = new File(rootDir, "mark-file-dir");
final File markFileDir = new File(rootDir, "mark/../file/./dir");
assertFalse(markFileDir.exists());
context.markFileDir(markFileDir);

context.conclude();

assertEquals(markFileDir, context.markFileDir());
assertTrue(markFileDir.exists());
assertEquals(markFileDir.getCanonicalFile(), context.markFileDir());
assertTrue(markFileDir.getCanonicalFile().exists());
}

@Test
Expand Down Expand Up @@ -900,33 +898,34 @@ void shouldNotCreateLinkToTheDefaultMarkFile(@TempDir final Path tempDir) throws

context.conclude();

assertEquals(archiveDir.toFile(), context.markFileDir());
assertEquals(archiveDir.toFile().getCanonicalFile(), context.markFileDir());
final ArchiveMarkFile archiveMarkFile = context.archiveMarkFile();
assertNotNull(archiveMarkFile);
assertEquals(archiveDir.toFile(), archiveMarkFile.parentDirectory());
assertEquals(archiveDir.toFile().getCanonicalFile(), archiveMarkFile.parentDirectory());
final Path markFile = archiveDir.resolve(ArchiveMarkFile.FILENAME);
assertTrue(Files.exists(markFile));
assertTrue(Files.notExists(linkFile));
}

@Test
void shouldCreateALinkToTheArchiveMarkFileInAnotherDirectory(
@TempDir final Path archiveDir, @TempDir final Path markFileDir) throws IOException
@TempDir final Path archiveDir, @TempDir final Path temp2) throws IOException
{
context.archiveDir(archiveDir.toFile()).markFileDir(markFileDir.toFile());
final File markFileDirectory = temp2.resolve("x/y/../z/../w").toFile();
context.archiveDir(archiveDir.toFile()).markFileDir(markFileDirectory);

context.conclude();

assertEquals(archiveDir.toFile(), context.archiveDir());
assertEquals(markFileDir.toFile(), context.markFileDir());
assertEquals(archiveDir.toFile().getCanonicalFile(), context.archiveDir());
assertEquals(markFileDirectory.getCanonicalFile(), context.markFileDir());
final ArchiveMarkFile archiveMarkFile = context.archiveMarkFile();
assertNotNull(archiveMarkFile);
assertEquals(markFileDir.toFile(), archiveMarkFile.parentDirectory());
final Path markFile = markFileDir.resolve(ArchiveMarkFile.FILENAME);
assertEquals(markFileDirectory.getCanonicalFile(), archiveMarkFile.parentDirectory());
final Path markFile = markFileDirectory.getCanonicalFile().toPath().resolve(ArchiveMarkFile.FILENAME);
assertTrue(Files.exists(markFile));
final Path linkFile = archiveDir.resolve(ArchiveMarkFile.LINK_FILENAME);
assertTrue(Files.exists(linkFile));
assertEquals(markFileDir.toFile().getCanonicalPath(), new String(Files.readAllBytes(linkFile), US_ASCII));
assertEquals(markFileDirectory.getCanonicalPath(), new String(Files.readAllBytes(linkFile), US_ASCII));
}

@Test
Expand All @@ -944,8 +943,8 @@ void shouldCreateALinkToTheArchiveMarkFileWhichIsExplicitlyAssigned(

context.conclude();

assertEquals(archiveDir.toFile(), context.archiveDir());
assertEquals(markFileDir.toFile(), context.markFileDir());
assertEquals(archiveDir.toFile().getCanonicalFile(), context.archiveDir());
assertEquals(markFileDir.toFile().getCanonicalFile(), context.markFileDir());
assertSame(archiveMarkFile, context.archiveMarkFile());
assertEquals(archiveMarkFileDir.toFile(), archiveMarkFile.parentDirectory());
final Path linkFile = archiveDir.resolve(ArchiveMarkFile.LINK_FILENAME);
Expand Down Expand Up @@ -991,6 +990,17 @@ void shouldInitializeAeronDirectoryFromTheClient()
assertEquals(clientDirectory, context.aeronDirectoryName());
}

@Test
void shouldInitializeArchiveDirectoryNameFromArchiveDir(@TempDir final Path root) throws IOException
{
final File archiveDir = root.resolve("n/m/../x/./1111").toFile();
context.archiveDir(archiveDir);

context.conclude();

assertEquals(archiveDir.getCanonicalPath(), context.archiveDirectoryName());
}

private Counter mockArchiveCounter(
final long archiveId, final int typeId, final int id, final ArgumentCaptor<DirectBuffer> tempBuffer)
{
Expand Down
9 changes: 8 additions & 1 deletion aeron-client/src/main/java/io/aeron/CommonContext.java
Original file line number Diff line number Diff line change
Expand Up @@ -519,7 +519,14 @@ public CommonContext concludeAeronDirectory()
{
if (null == aeronDirectory)
{
aeronDirectory = new File(aeronDirectoryName);
try
{
aeronDirectory = new File(aeronDirectoryName).getCanonicalFile();
}
catch (final IOException e)
{
throw new UncheckedIOException(e);
}
}

return this;
Expand Down
32 changes: 32 additions & 0 deletions aeron-client/src/test/java/io/aeron/CommonContextTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -225,4 +225,36 @@ void fallbackLoggerReturnsNoOpLoggerIfConfigured()
System.clearProperty(FALLBACK_LOGGER_PROP_NAME);
}
}

@Test
void shouldConcludeAeronDirectory(@TempDir final Path tempDir) throws IOException
{
final Path aeronDirectory = tempDir.resolve("aeron.dir");
final CommonContext commonContext = new CommonContext();
commonContext.aeronDirectoryName(aeronDirectory.toString());
assertNull(commonContext.aeronDirectory());

assertSame(commonContext, commonContext.concludeAeronDirectory());

final File concludedDir = commonContext.aeronDirectory();
assertEquals(aeronDirectory.toFile().getCanonicalFile(), concludedDir);

commonContext.concludeAeronDirectory();
assertSame(concludedDir, commonContext.aeronDirectory());
}

@Test
void shouldCanonicalizeAeronDirectoryPath(@TempDir final Path tempDir) throws IOException
{
final Path path = tempDir.resolve("one/two/../three/four/./x/y/z");
final CommonContext commonContext = new CommonContext();
commonContext.aeronDirectoryName(path.toString());
assertNull(commonContext.aeronDirectory());

assertSame(commonContext, commonContext.concludeAeronDirectory());

assertEquals(
tempDir.resolve("one/three/four/x/y/z").toFile().getCanonicalFile(),
commonContext.aeronDirectory());
}
}
39 changes: 25 additions & 14 deletions aeron-cluster/src/main/java/io/aeron/cluster/ConsensusModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@

import java.io.File;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.util.Random;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
Expand Down Expand Up @@ -410,8 +411,8 @@ public static final class Configuration
* Property name for the comma separated list of cluster member endpoints.
* <p>
* <code>
* 0,ingress:port,consensus:port,log:port,catchup:port,archive:port| \
* 1,ingress:port,consensus:port,log:port,catchup:port,archive:port| ...
* 0,ingress:port,consensus:port,log:port,catchup:port,archive:port| \
* 1,ingress:port,consensus:port,log:port,catchup:port,archive:port| ...
* </code>
* <p>
* The ingress endpoints will be used as the endpoint substituted into the
Expand Down Expand Up @@ -456,7 +457,7 @@ public static final class Configuration
* Property name for the comma separated list of member endpoints.
* <p>
* <code>
* ingress:port,consensus:port,log:port,catchup:port,archive:port
* ingress:port,consensus:port,log:port,catchup:port,archive:port
* </code>
*
* @see #CLUSTER_MEMBERS_PROP_NAME
Expand Down Expand Up @@ -1492,14 +1493,31 @@ public void conclude()
{
clusterDir = new File(clusterDirectoryName);
}
else

if (null == markFileDir)
{
clusterDirectoryName = clusterDir.getAbsolutePath();
final String dir = ClusteredServiceContainer.Configuration.markFileDir();
markFileDir = Strings.isEmpty(dir) ? clusterDir : new File(dir);
}

if (null == clusterServicesDirectoryName)
try
{
clusterDir = clusterDir.getCanonicalFile();
clusterDirectoryName = clusterDir.getAbsolutePath();
markFileDir = markFileDir.getCanonicalFile();

if (Strings.isEmpty(clusterServicesDirectoryName))
{
clusterServicesDirectoryName = clusterDirectoryName;
}
else
{
clusterServicesDirectoryName = new File(clusterServicesDirectoryName).getCanonicalPath();
}
}
catch (final IOException e)
{
clusterServicesDirectoryName = clusterDirectoryName;
throw new UncheckedIOException(e);
}

if (null == clusterMembers)
Expand All @@ -1513,13 +1531,6 @@ public void conclude()
}

IoUtil.ensureDirectoryExists(clusterDir, "cluster");

if (null == markFileDir)
{
final String dir = ClusteredServiceContainer.Configuration.markFileDir();
markFileDir = Strings.isEmpty(dir) ? clusterDir : new File(dir);
}

IoUtil.ensureDirectoryExists(markFileDir, "mark file");

if (startupCanvassTimeoutNs / leaderHeartbeatTimeoutNs < 2)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@
import org.agrona.concurrent.status.StatusIndicator;

import java.io.File;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
Expand Down Expand Up @@ -743,19 +745,25 @@ public void conclude()
{
clusterDir = new File(clusterDirectoryName);
}
else
{
clusterDirectoryName = clusterDir.getAbsolutePath();
}

IoUtil.ensureDirectoryExists(clusterDir, "cluster");

if (null == markFileDir)
{
final String dir = Configuration.markFileDir();
markFileDir = Strings.isEmpty(dir) ? clusterDir : new File(dir);
}

try
{
clusterDir = clusterDir.getCanonicalFile();
clusterDirectoryName = clusterDir.getAbsolutePath();
markFileDir = markFileDir.getCanonicalFile();
}
catch (final IOException e)
{
throw new UncheckedIOException(e);
}

IoUtil.ensureDirectoryExists(clusterDir, "cluster");
IoUtil.ensureDirectoryExists(markFileDir, "mark file");

if (null == markFile)
Expand Down
Loading

0 comments on commit ceb99eb

Please sign in to comment.