This is an automated email from the ASF dual-hosted git repository.
apolovtsev pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git
The following commit(s) were added to refs/heads/main by this push:
new 59fa1c88f9 IGNITE-20704 Add methods to fsync files and directories
(#2735)
59fa1c88f9 is described below
commit 59fa1c88f9d8b99a366652325d72781fd17dddaf
Author: Alexander Polovtcev <[email protected]>
AuthorDate: Sat Oct 21 15:42:08 2023 +0300
IGNITE-20704 Add methods to fsync files and directories (#2735)
---
.../internal/cli/config/ini/IniConfigManager.java | 2 +-
.../cliconfig/TestConfigManagerHelper.java | 2 +-
.../ignite/deployment/FileDeployerServiceTest.java | 8 ++---
.../apache/ignite/internal/util/IgniteUtils.java | 41 +++++++++++++++-------
.../ignite/internal}/util/OperatingSystem.java | 2 +-
.../internal/testframework/IgniteTestUtils.java | 34 ++++++++++++------
.../testframework/WorkDirectoryExtension.java | 4 +--
.../ignite/internal/deployment/DeployFile.java | 4 +--
8 files changed, 62 insertions(+), 35 deletions(-)
diff --git
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ini/IniConfigManager.java
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ini/IniConfigManager.java
index 2bb939a879..706d0ce875 100644
---
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ini/IniConfigManager.java
+++
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ini/IniConfigManager.java
@@ -46,8 +46,8 @@ import
org.apache.ignite.internal.cli.config.exception.ConfigInitializationExcep
import
org.apache.ignite.internal.cli.config.exception.ProfileNotFoundException;
import org.apache.ignite.internal.cli.core.exception.IgniteCliException;
import org.apache.ignite.internal.cli.logger.CliLoggers;
-import org.apache.ignite.internal.cli.util.OperatingSystem;
import org.apache.ignite.internal.logger.IgniteLogger;
+import org.apache.ignite.internal.util.OperatingSystem;
/**
* Implementation of {@link ConfigManager} based on {@link IniFile}.
diff --git
a/modules/cli/src/testFixtures/java/org/apache/ignite/internal/cli/commands/cliconfig/TestConfigManagerHelper.java
b/modules/cli/src/testFixtures/java/org/apache/ignite/internal/cli/commands/cliconfig/TestConfigManagerHelper.java
index ec8293a796..4a13920d99 100644
---
a/modules/cli/src/testFixtures/java/org/apache/ignite/internal/cli/commands/cliconfig/TestConfigManagerHelper.java
+++
b/modules/cli/src/testFixtures/java/org/apache/ignite/internal/cli/commands/cliconfig/TestConfigManagerHelper.java
@@ -32,7 +32,7 @@ import java.nio.file.Files;
import java.nio.file.attribute.PosixFilePermission;
import java.util.Set;
import org.apache.ignite.internal.cli.config.ConfigManager;
-import org.apache.ignite.internal.cli.util.OperatingSystem;
+import org.apache.ignite.internal.util.OperatingSystem;
/**
* Test factory for {@link ConfigManager}.
diff --git
a/modules/code-deployment/src/test/java/org/apache/ignite/deployment/FileDeployerServiceTest.java
b/modules/code-deployment/src/test/java/org/apache/ignite/deployment/FileDeployerServiceTest.java
index 7baab5e26c..deb6dfd379 100644
---
a/modules/code-deployment/src/test/java/org/apache/ignite/deployment/FileDeployerServiceTest.java
+++
b/modules/code-deployment/src/test/java/org/apache/ignite/deployment/FileDeployerServiceTest.java
@@ -35,9 +35,9 @@ import java.util.stream.Stream;
import org.apache.ignite.internal.deployunit.DeploymentUnit;
import org.apache.ignite.internal.deployunit.FileDeployerService;
import org.apache.ignite.internal.deployunit.UnitContent;
+import org.apache.ignite.internal.testframework.IgniteTestUtils;
import org.apache.ignite.internal.testframework.WorkDirectory;
import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
-import org.apache.ignite.internal.util.IgniteUtils;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -63,9 +63,9 @@ public class FileDeployerServiceTest {
file1 = workDir.resolve("file1");
file2 = workDir.resolve("file2");
file3 = workDir.resolve("file3");
- IgniteUtils.fillDummyFile(file1, 1024);
- IgniteUtils.fillDummyFile(file2, 1024);
- IgniteUtils.fillDummyFile(file3, 1024);
+ IgniteTestUtils.fillDummyFile(file1, 1024);
+ IgniteTestUtils.fillDummyFile(file2, 1024);
+ IgniteTestUtils.fillDummyFile(file3, 1024);
}
@Test
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
index fc8bd5fa4f..18c00183cc 100644
---
a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
@@ -17,8 +17,6 @@
package org.apache.ignite.internal.util;
-import static java.nio.file.StandardOpenOption.CREATE;
-import static java.nio.file.StandardOpenOption.WRITE;
import static java.util.Arrays.copyOfRange;
import static java.util.concurrent.CompletableFuture.failedFuture;
import static org.apache.ignite.lang.ErrorGroups.Common.NODE_STOPPING_ERR;
@@ -28,7 +26,7 @@ import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
-import java.nio.channels.SeekableByteChannel;
+import java.nio.channels.FileChannel;
import java.nio.file.AtomicMoveNotSupportedException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
@@ -36,6 +34,7 @@ import java.nio.file.NoSuchFileException;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.StandardCopyOption;
+import java.nio.file.StandardOpenOption;
import java.nio.file.attribute.BasicFileAttributes;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@@ -436,19 +435,35 @@ public class IgniteUtils {
}
/**
- * Generate file with dummy content with provided size.
+ * Calls fsync on a directory.
*
- * @param file File path.
- * @param fileSize File size in bytes.
- * @throws IOException if an I/O error is thrown.
+ * @param dir Path to the directory.
+ * @throws IOException If an I/O error occurs.
*/
- public static void fillDummyFile(Path file, long fileSize) throws
IOException {
- try (SeekableByteChannel channel = Files.newByteChannel(file, WRITE,
CREATE)) {
- channel.position(fileSize - 4);
+ public static void fsyncDir(Path dir) throws IOException {
+ assert Files.isDirectory(dir) : dir;
- ByteBuffer buf = ByteBuffer.allocate(4).putInt(2);
- buf.rewind();
- channel.write(buf);
+ // Fsync for directories doesn't work on Windows.
+ if (OperatingSystem.current() == OperatingSystem.WINDOWS) {
+ return;
+ }
+
+ try (FileChannel fc = FileChannel.open(dir, StandardOpenOption.READ)) {
+ fc.force(true);
+ }
+ }
+
+ /**
+ * Calls fsync on a file.
+ *
+ * @param file Path to the file.
+ * @throws IOException If an I/O error occurs.
+ */
+ public static void fsyncFile(Path file) throws IOException {
+ assert Files.isRegularFile(file) : file;
+
+ try (FileChannel fc = FileChannel.open(file,
StandardOpenOption.WRITE)) {
+ fc.force(true);
}
}
diff --git
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/util/OperatingSystem.java
b/modules/core/src/main/java/org/apache/ignite/internal/util/OperatingSystem.java
similarity index 98%
rename from
modules/cli/src/main/java/org/apache/ignite/internal/cli/util/OperatingSystem.java
rename to
modules/core/src/main/java/org/apache/ignite/internal/util/OperatingSystem.java
index d8b8a99e53..1260e42d54 100644
---
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/util/OperatingSystem.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/util/OperatingSystem.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package org.apache.ignite.internal.cli.util;
+package org.apache.ignite.internal.util;
import java.util.Locale;
diff --git
a/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/IgniteTestUtils.java
b/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/IgniteTestUtils.java
index 26acbcc8e7..1a762e37d0 100644
---
a/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/IgniteTestUtils.java
+++
b/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/IgniteTestUtils.java
@@ -18,10 +18,13 @@
package org.apache.ignite.internal.testframework;
import static java.lang.Thread.sleep;
+import static java.nio.file.StandardOpenOption.CREATE;
+import static java.nio.file.StandardOpenOption.WRITE;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.junit.jupiter.api.Assertions.fail;
+import java.io.IOException;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.VarHandle;
import java.lang.reflect.Field;
@@ -29,6 +32,9 @@ import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.net.URISyntaxException;
import java.net.URL;
+import java.nio.ByteBuffer;
+import java.nio.channels.SeekableByteChannel;
+import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
@@ -36,7 +42,6 @@ import java.util.BitSet;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
-import java.util.Locale;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.Callable;
@@ -675,9 +680,6 @@ public final class IgniteTestUtils {
/**
* Creates a unique Ignite node name for the given test.
*
- * <p>If the operating system is {@link #isWindowsOs Windows}, then the
name will be short
- * due to the fact that the length of the paths must be up to 260
characters.
- *
* @param testInfo Test info.
* @param idx Node index.
*
@@ -701,13 +703,6 @@ public final class IgniteTestUtils {
void run() throws Throwable;
}
- /**
- * Returns {@code true} if the operating system is Windows.
- */
- public static boolean isWindowsOs() {
- return
System.getProperty("os.name").toLowerCase(Locale.US).contains("win");
- }
-
/**
* Returns a short version of the method name, such as
"testShortMethodName" to "tsmn".
*
@@ -899,6 +894,23 @@ public final class IgniteTestUtils {
return path.replace("\\", "\\\\");
}
+ /**
+ * Generate file with dummy content with provided size.
+ *
+ * @param file File path.
+ * @param fileSize File size in bytes.
+ * @throws IOException if an I/O error is thrown.
+ */
+ public static void fillDummyFile(Path file, long fileSize) throws
IOException {
+ try (SeekableByteChannel channel = Files.newByteChannel(file, WRITE,
CREATE)) {
+ channel.position(fileSize - 4);
+
+ ByteBuffer buf = ByteBuffer.allocate(4).putInt(2);
+ buf.rewind();
+ channel.write(buf);
+ }
+ }
+
/**
* Predicate matcher.
*
diff --git
a/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/WorkDirectoryExtension.java
b/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/WorkDirectoryExtension.java
index b37fcc834b..c433b55c93 100644
---
a/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/WorkDirectoryExtension.java
+++
b/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/WorkDirectoryExtension.java
@@ -18,7 +18,6 @@
package org.apache.ignite.internal.testframework;
import static java.util.stream.Collectors.toSet;
-import static
org.apache.ignite.internal.testframework.IgniteTestUtils.isWindowsOs;
import static org.junit.jupiter.api.extension.ExtensionContext.Namespace;
import java.io.IOException;
@@ -39,6 +38,7 @@ import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.apache.ignite.internal.lang.IgniteSystemProperties;
import org.apache.ignite.internal.util.IgniteUtils;
+import org.apache.ignite.internal.util.OperatingSystem;
import org.jetbrains.annotations.Nullable;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.extension.AfterAllCallback;
@@ -204,7 +204,7 @@ public class WorkDirectoryExtension
.map(Method::getName)
.orElse(STATIC_FOLDER_NAME);
- if (isWindowsOs()) {
+ if (OperatingSystem.current() == OperatingSystem.WINDOWS) {
testMethodName =
IgniteTestUtils.shortTestMethodName(testMethodName);
do {
diff --git
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/deployment/DeployFile.java
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/deployment/DeployFile.java
index 5ba85fb712..071aa615a4 100644
---
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/deployment/DeployFile.java
+++
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/deployment/DeployFile.java
@@ -20,7 +20,7 @@ package org.apache.ignite.internal.deployment;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
-import org.apache.ignite.internal.util.IgniteUtils;
+import org.apache.ignite.internal.testframework.IgniteTestUtils;
class DeployFile {
private final Path file;
@@ -38,7 +38,7 @@ class DeployFile {
private void ensureExists() throws IOException {
if (!Files.exists(file)) {
- IgniteUtils.fillDummyFile(file, expectedSize);
+ IgniteTestUtils.fillDummyFile(file, expectedSize);
}
}