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

Reply via email to