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