This is an automated email from the ASF dual-hosted git repository.

tkalkirill 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 307bd4e972 IGNITE-19749 AccessDeniedException on Windows (#2210)
307bd4e972 is described below

commit 307bd4e9721cb22d74e5562492e41238ba794178
Author: Kirill Tkalenko <[email protected]>
AuthorDate: Mon Jun 19 14:00:28 2023 +0300

    IGNITE-19749 AccessDeniedException on Windows (#2210)
---
 .../persistence/compaction/Compactor.java          |  8 +--
 .../persistence/store/AbstractFilePageStoreIo.java | 12 ++--
 .../store/AbstractFilePageStoreIoTest.java         | 66 +++++++++++++++++++++-
 .../store/DeltaFilePageStoreIoTest.java            |  9 +--
 .../persistence/store/FilePageStoreIoTest.java     |  8 +--
 5 files changed, 84 insertions(+), 19 deletions(-)

diff --git 
a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/compaction/Compactor.java
 
b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/compaction/Compactor.java
index f0656b4618..0320202aee 100644
--- 
a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/compaction/Compactor.java
+++ 
b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/compaction/Compactor.java
@@ -397,13 +397,13 @@ public class Compactor extends IgniteWorker {
             return;
         }
 
-        boolean removed = filePageStore.removeDeltaFile(deltaFilePageStore);
-
-        assert removed : filePageStore.filePath();
-
         deltaFilePageStore.markMergedToFilePageStore();
 
         deltaFilePageStore.stop(true);
+
+        boolean removed = filePageStore.removeDeltaFile(deltaFilePageStore);
+
+        assert removed : filePageStore.filePath();
     }
 
     /**
diff --git 
a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/store/AbstractFilePageStoreIo.java
 
b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/store/AbstractFilePageStoreIo.java
index f0162ad216..7968d62b37 100644
--- 
a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/store/AbstractFilePageStoreIo.java
+++ 
b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/store/AbstractFilePageStoreIo.java
@@ -276,7 +276,7 @@ public abstract class AbstractFilePageStoreIo implements 
Closeable {
      *
      * @throws IgniteInternalCheckedException If initialization failed (IO 
error occurred).
      */
-    public void ensure() throws IgniteInternalCheckedException {
+    void ensure() throws IgniteInternalCheckedException {
         if (!initialized) {
             readWriteLock.writeLock().lock();
 
@@ -579,11 +579,11 @@ public abstract class AbstractFilePageStoreIo implements 
Closeable {
      * @throws IOException If failed.
      */
     public void renameFilePath(Path newFilePath) throws IOException {
-        initialized = false;
-
         readWriteLock.writeLock().lock();
 
         try {
+            initialized = false;
+
             Path filePath = this.filePath;
 
             if (!filePath.equals(newFilePath)) {
@@ -599,9 +599,9 @@ public abstract class AbstractFilePageStoreIo implements 
Closeable {
 
                 this.filePath = newFilePath;
 
-                if (fileIo != null) {
-                    reinit(fileIo);
-                }
+                reinit(fileIo);
+
+                initialized = true;
             }
         } finally {
             readWriteLock.writeLock().unlock();
diff --git 
a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/store/AbstractFilePageStoreIoTest.java
 
b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/store/AbstractFilePageStoreIoTest.java
index 984f353bfd..407c303f80 100644
--- 
a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/store/AbstractFilePageStoreIoTest.java
+++ 
b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/store/AbstractFilePageStoreIoTest.java
@@ -17,22 +17,33 @@
 
 package org.apache.ignite.internal.pagememory.persistence.store;
 
+import static java.nio.file.StandardOpenOption.CREATE;
+import static java.nio.file.StandardOpenOption.READ;
+import static java.nio.file.StandardOpenOption.WRITE;
 import static org.apache.ignite.internal.pagememory.io.PageIo.getCrc;
 import static 
org.apache.ignite.internal.pagememory.persistence.store.TestPageStoreUtils.createDataPageId;
 import static 
org.apache.ignite.internal.pagememory.persistence.store.TestPageStoreUtils.createPageByteBuffer;
 import static 
org.apache.ignite.internal.pagememory.persistence.store.TestPageStoreUtils.randomBytes;
+import static org.apache.ignite.internal.testframework.IgniteTestUtils.runRace;
 import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.clearInvocations;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
 
 import java.nio.ByteBuffer;
 import java.nio.file.Files;
 import java.nio.file.Path;
+import org.apache.ignite.internal.fileio.FileIo;
+import org.apache.ignite.internal.fileio.FileIoFactory;
+import org.apache.ignite.internal.fileio.RandomAccessFileIoFactory;
 import org.apache.ignite.internal.pagememory.io.PageIo;
 import org.apache.ignite.internal.testframework.WorkDirectory;
 import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
+import org.junit.jupiter.api.RepeatedTest;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 
@@ -50,8 +61,18 @@ public abstract class AbstractFilePageStoreIoTest {
      * Creates an instance of {@link AbstractFilePageStoreIo}.
      *
      * @param filePath File page store path.
+     * @param ioFactory {@link FileIo} factory.
      */
-    abstract AbstractFilePageStoreIo createFilePageStoreIo(Path filePath);
+    abstract <T extends AbstractFilePageStoreIo> T createFilePageStoreIo(Path 
filePath, FileIoFactory ioFactory);
+
+    /**
+     * Creates an instance of {@link AbstractFilePageStoreIo}.
+     *
+     * @param filePath File page store path.
+     */
+    <T extends AbstractFilePageStoreIo> T createFilePageStoreIo(Path filePath) 
{
+        return createFilePageStoreIo(filePath, new 
RandomAccessFileIoFactory());
+    }
 
     @Test
     void testStop() throws Exception {
@@ -308,4 +329,47 @@ public abstract class AbstractFilePageStoreIoTest {
             assertEquals(2 * PAGE_SIZE, Files.size(testFilePath1));
         }
     }
+
+    @Test
+    void testRenameAndEnsure() throws Exception {
+        Path filePath = workDir.resolve("test");
+
+        FileIoFactory ioFactory = spy(new RandomAccessFileIoFactory());
+
+        try (AbstractFilePageStoreIo filePageStoreIo = 
createFilePageStoreIo(filePath, ioFactory)) {
+            filePageStoreIo.ensure();
+
+            clearInvocations(ioFactory);
+
+            Path newFilePath = workDir.resolve("test0");
+
+            filePageStoreIo.renameFilePath(newFilePath);
+
+            filePageStoreIo.ensure();
+
+            verify(ioFactory).create(newFilePath, CREATE, READ, WRITE);
+        }
+    }
+
+    @RepeatedTest(100)
+    void testRenameAndEnsureRace() throws Exception {
+        Path filePath = workDir.resolve("test");
+
+        FileIoFactory ioFactory = spy(new RandomAccessFileIoFactory());
+
+        try (AbstractFilePageStoreIo filePageStoreIo = 
createFilePageStoreIo(filePath, ioFactory)) {
+            filePageStoreIo.ensure();
+
+            clearInvocations(ioFactory);
+
+            Path newFilePath = workDir.resolve("test0");
+
+            runRace(
+                    () -> filePageStoreIo.renameFilePath(newFilePath),
+                    filePageStoreIo::ensure
+            );
+
+            verify(ioFactory).create(newFilePath, CREATE, READ, WRITE);
+        }
+    }
 }
diff --git 
a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/store/DeltaFilePageStoreIoTest.java
 
b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/store/DeltaFilePageStoreIoTest.java
index 2366177025..b682aac84d 100644
--- 
a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/store/DeltaFilePageStoreIoTest.java
+++ 
b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/store/DeltaFilePageStoreIoTest.java
@@ -41,6 +41,7 @@ import java.nio.ByteBuffer;
 import java.nio.file.Path;
 import java.util.stream.IntStream;
 import org.apache.ignite.internal.fileio.FileIo;
+import org.apache.ignite.internal.fileio.FileIoFactory;
 import org.apache.ignite.internal.fileio.RandomAccessFileIo;
 import org.apache.ignite.internal.fileio.RandomAccessFileIoFactory;
 import org.junit.jupiter.api.Test;
@@ -194,16 +195,16 @@ public class DeltaFilePageStoreIoTest extends 
AbstractFilePageStoreIoTest {
         }
     }
 
-    /** {@inheritDoc} */
     @Override
-    DeltaFilePageStoreIo createFilePageStoreIo(Path filePath) {
-        return createFilePageStoreIo(
+    DeltaFilePageStoreIo createFilePageStoreIo(Path filePath, FileIoFactory 
ioFactory) {
+        return new DeltaFilePageStoreIo(
+                ioFactory,
                 filePath,
                 new DeltaFilePageStoreIoHeader(DELTA_FILE_VERSION_1, 1, 
PAGE_SIZE, arr(0, 1, 2, 3, 5, 6, 7, 8, 9))
         );
     }
 
-    private DeltaFilePageStoreIo createFilePageStoreIo(Path filePath, 
DeltaFilePageStoreIoHeader header) {
+    private static DeltaFilePageStoreIo createFilePageStoreIo(Path filePath, 
DeltaFilePageStoreIoHeader header) {
         return new DeltaFilePageStoreIo(new RandomAccessFileIoFactory(), 
filePath, header);
     }
 }
diff --git 
a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/store/FilePageStoreIoTest.java
 
b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/store/FilePageStoreIoTest.java
index c26a6a9a93..7de6628f87 100644
--- 
a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/store/FilePageStoreIoTest.java
+++ 
b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/store/FilePageStoreIoTest.java
@@ -32,6 +32,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
 import java.io.IOException;
 import java.nio.file.Path;
 import org.apache.ignite.internal.fileio.FileIo;
+import org.apache.ignite.internal.fileio.FileIoFactory;
 import org.apache.ignite.internal.fileio.RandomAccessFileIo;
 import org.apache.ignite.internal.fileio.RandomAccessFileIoFactory;
 import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
@@ -112,13 +113,12 @@ public class FilePageStoreIoTest extends 
AbstractFilePageStoreIoTest {
         }
     }
 
-    /** {@inheritDoc} */
     @Override
-    protected FilePageStoreIo createFilePageStoreIo(Path filePath) {
-        return createFilePageStoreIo(filePath, new 
FilePageStoreHeader(VERSION_1, PAGE_SIZE));
+    protected FilePageStoreIo createFilePageStoreIo(Path filePath, 
FileIoFactory ioFactory) {
+        return new FilePageStoreIo(ioFactory, filePath, new 
FilePageStoreHeader(VERSION_1, PAGE_SIZE));
     }
 
-    private FilePageStoreIo createFilePageStoreIo(Path filePath, 
FilePageStoreHeader header) {
+    private static FilePageStoreIo createFilePageStoreIo(Path filePath, 
FilePageStoreHeader header) {
         return new FilePageStoreIo(new RandomAccessFileIoFactory(), filePath, 
header);
     }
 }

Reply via email to