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);
         }
     }
 

Reply via email to