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