This is an automated email from the ASF dual-hosted git repository.
rpuch 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 0b3eb69f8c5 IGNITE-27575 Do not re-read meta on file rename in
FilePageStoreIo (#7714)
0b3eb69f8c5 is described below
commit 0b3eb69f8c5562e2ceda364989106f4a45c1eb0b
Author: Ivan Zlenko <[email protected]>
AuthorDate: Fri Mar 6 11:54:48 2026 +0500
IGNITE-27575 Do not re-read meta on file rename in FilePageStoreIo (#7714)
---
.../persistence/store/AbstractFilePageStoreIo.java | 61 +++++++++++++---------
.../store/AbstractFilePageStoreIoTest.java | 22 ++++++++
2 files changed, 57 insertions(+), 26 deletions(-)
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 034bf123a47..e3bcf7f96cb 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
@@ -398,6 +398,33 @@ public abstract class AbstractFilePageStoreIo implements
Closeable {
}
}
+ /**
+ * Opens or reopens the file IO, handling interrupt-caused channel
closures.
+ *
+ * @return New file IO instance.
+ */
+ private FileIo reopenFileIo() throws IOException {
+ boolean interrupted = false;
+
+ while (true) {
+ try {
+ FileIo fileIo = ioFactory.create(filePath, CREATE, READ,
WRITE);
+
+ fileExists = true;
+
+ if (interrupted) {
+ Thread.currentThread().interrupt();
+ }
+
+ return fileIo;
+ } catch (ClosedByInterruptException e) {
+ interrupted = true;
+
+ Thread.interrupted();
+ }
+ }
+ }
+
/**
* Reinit page store after file channel was closed by thread interruption.
*
@@ -415,36 +442,18 @@ public abstract class AbstractFilePageStoreIo implements
Closeable {
return;
}
- try {
- boolean interrupted = false;
-
- while (true) {
- try {
- fileIo = null;
-
- fileIo = ioFactory.create(filePath, CREATE, READ,
WRITE);
-
- fileExists = true;
+ FileIo newFileIo = null;
- checkHeader(fileIo);
-
- this.fileIo = fileIo;
-
- if (interrupted) {
- Thread.currentThread().interrupt();
- }
+ try {
+ newFileIo = reopenFileIo();
- break;
- } catch (ClosedByInterruptException e) {
- interrupted = true;
+ checkHeader(newFileIo);
- Thread.interrupted();
- }
- }
+ this.fileIo = newFileIo;
} catch (IOException e) {
try {
- if (fileIo != null) {
- fileIo.close();
+ if (newFileIo != null) {
+ newFileIo.close();
}
} catch (IOException e0) {
e.addSuppressed(e0);
@@ -601,7 +610,7 @@ public abstract class AbstractFilePageStoreIo implements
Closeable {
this.filePath = newFilePath;
- reinit(fileIo);
+ this.fileIo = reopenFileIo();
initialized = true;
}
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 edbcdb4833c..f674aac2862 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
@@ -354,6 +354,28 @@ public abstract class AbstractFilePageStoreIoTest extends
BaseIgniteAbstractTest
}
}
+ @Test
+ void testRenameDoesNotReReadHeader() throws Exception {
+ Path filePath = workDir.resolve("test");
+
+ try (AbstractFilePageStoreIo filePageStoreIo =
createFilePageStoreIo(filePath)) {
+ filePageStoreIo.ensure();
+
+ // Corrupt the file header on disk.
+ // If renameFilePath were to re-read the header, it would fail
with "Invalid file signature".
+ try (FileIo rawIo = new
RandomAccessFileIoFactory().create(filePath, WRITE)) {
+ rawIo.writeFully(ByteBuffer.allocate(8), 0);
+ rawIo.force();
+ }
+
+ Path newFilePath = workDir.resolve("test0");
+
+ // Should succeed because renameFilePath does not re-read the
header.
+ assertDoesNotThrow(() ->
filePageStoreIo.renameFilePath(newFilePath));
+ assertEquals(newFilePath, filePageStoreIo.filePath());
+ }
+ }
+
@RepeatedTest(100)
void testRenameAndEnsureRace() throws Exception {
Path filePath = workDir.resolve("test");