You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ti...@apache.org on 2023/11/21 10:47:39 UTC

(ignite) branch master updated: IGNITE-20572 BinaryMeta file atomic creation (#11055)

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

timoninmaxim pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new 78e161ad53a IGNITE-20572 BinaryMeta file atomic creation (#11055)
78e161ad53a is described below

commit 78e161ad53a7e3482ebfbb56571ec1d9a219a022
Author: Maksim Timonin <ti...@apache.org>
AuthorDate: Tue Nov 21 13:47:28 2023 +0300

    IGNITE-20572 BinaryMeta file atomic creation (#11055)
---
 .../processors/cache/binary/BinaryMetadataFileStore.java    | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/BinaryMetadataFileStore.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/BinaryMetadataFileStore.java
index db43a7a0c11..408e6f1ffc8 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/BinaryMetadataFileStore.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/BinaryMetadataFileStore.java
@@ -46,6 +46,8 @@ import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.internal.util.worker.GridWorker;
 import org.apache.ignite.thread.IgniteThread;
 
+import static java.nio.file.StandardCopyOption.ATOMIC_MOVE;
+import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
 import static org.apache.ignite.internal.processors.cache.persistence.file.FilePageStoreManager.TMP_SUFFIX;
 
 /**
@@ -150,16 +152,23 @@ class BinaryMetadataFileStore {
 
         try {
             File file = new File(metadataDir, BinaryUtils.binaryMetaFileName(binMeta.typeId()));
+            File tmpFile = new File(file.getAbsolutePath() + TMP_SUFFIX);
+
+            // TODO: delete it on Ignite start. https://issues.apache.org/jira/browse/IGNITE-20897
+            if (tmpFile.exists())
+                U.delete(tmpFile);
 
             byte[] marshalled = U.marshal(ctx, binMeta);
 
-            try (final FileIO out = fileIOFactory.create(file)) {
+            try (final FileIO out = fileIOFactory.create(tmpFile)) {
                 int left = marshalled.length;
                 while ((left -= out.writeFully(marshalled, 0, Math.min(marshalled.length, left))) > 0)
                     ;
 
                 out.force();
             }
+
+            Files.move(tmpFile.toPath(), file.toPath(), ATOMIC_MOVE, REPLACE_EXISTING);
         }
         catch (Exception e) {
             final String msg = "Failed to save metadata for typeId: " + binMeta.typeId() +
@@ -208,7 +217,7 @@ class BinaryMetadataFileStore {
         if (!enabled)
             return;
 
-        for (File file : metadataDir.listFiles())
+        for (File file : metadataDir.listFiles(BinaryUtils::notTmpFile))
             restoreMetadata(file);
     }