From 20cf50c6d054324503225c772256f0f91678599a Mon Sep 17 00:00:00 2001 From: Shashikant Banerjee Date: Thu, 18 Jul 2019 17:09:05 +0530 Subject: [PATCH] HDDS-1654. Ensure container state on datanode gets synced to disk whennever state change happens. Cotributed by Shashikant Banerjee. (#923) --- .../ozone/container/common/impl/ContainerDataYaml.java | 9 +++++++-- .../transport/server/ratis/ContainerStateMachine.java | 3 +++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/ContainerDataYaml.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/ContainerDataYaml.java index 15719440f39..1f9966c1a76 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/ContainerDataYaml.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/ContainerDataYaml.java @@ -80,6 +80,7 @@ public final class ContainerDataYaml { public static void createContainerFile(ContainerType containerType, ContainerData containerData, File containerFile) throws IOException { Writer writer = null; + FileOutputStream out = null; try { // Create Yaml for given container type Yaml yaml = getYamlForContainerType(containerType); @@ -87,13 +88,17 @@ public final class ContainerDataYaml { containerData.computeAndSetChecksum(yaml); // Write the ContainerData with checksum to Yaml file. - writer = new OutputStreamWriter(new FileOutputStream( - containerFile), "UTF-8"); + out = new FileOutputStream( + containerFile); + writer = new OutputStreamWriter(out, "UTF-8"); yaml.dump(containerData, writer); } finally { try { if (writer != null) { + writer.flush(); + // make sure the container metadata is synced to disk. + out.getFD().sync(); writer.close(); } } catch (IOException ex) { diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/transport/server/ratis/ContainerStateMachine.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/transport/server/ratis/ContainerStateMachine.java index 5c3fa859a69..d82d1142307 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/transport/server/ratis/ContainerStateMachine.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/transport/server/ratis/ContainerStateMachine.java @@ -262,6 +262,9 @@ public class ContainerStateMachine extends BaseStateMachine { LOG.info("{}: Taking a snapshot at:{} file {}", gid, ti, snapshotFile); try (FileOutputStream fos = new FileOutputStream(snapshotFile)) { persistContainerSet(fos); + fos.flush(); + // make sure the snapshot file is synced + fos.getFD().sync(); } catch (IOException ioe) { LOG.info("{}: Failed to write snapshot at:{} file {}", gid, ti, snapshotFile);