diff --git a/CHANGES.txt b/CHANGES.txt index 0eb2acba28..f409859eea 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -7,6 +7,7 @@ * Validate existence of DCs when repairing (CASSANDRA-17407) * dropping of a materialized view creates a snapshot with dropped- prefix (CASSANDRA-17415) Merged from 3.0: + * fsync TOC and digest files (CASSANDRA-10709) * Fix URISyntaxException in nodetool with updated Java (CASSANDRA-17581) * Schema mutations may not be completed on drain (CASSANDRA-17524) * Fix data corruption in AbstractCompositeType due to static boolean byte buffers (CASSANDRA-14752) diff --git a/src/java/org/apache/cassandra/io/sstable/SSTable.java b/src/java/org/apache/cassandra/io/sstable/SSTable.java index 0382a40478..a64d086890 100644 --- a/src/java/org/apache/cassandra/io/sstable/SSTable.java +++ b/src/java/org/apache/cassandra/io/sstable/SSTable.java @@ -297,10 +297,13 @@ public abstract class SSTable protected static void appendTOC(Descriptor descriptor, Collection components) { File tocFile = new File(descriptor.filenameFor(Component.TOC)); - try (PrintWriter w = new PrintWriter(new FileWriter(tocFile, true))) + try (FileOutputStream fos = new FileOutputStream(tocFile); + PrintWriter w = new PrintWriter(fos)) { for (Component component : components) w.println(component.name); + w.flush(); + fos.getFD().sync(); } catch (IOException e) { diff --git a/src/java/org/apache/cassandra/io/util/ChecksumWriter.java b/src/java/org/apache/cassandra/io/util/ChecksumWriter.java index dc5eaea62d..50aaccbc7c 100644 --- a/src/java/org/apache/cassandra/io/util/ChecksumWriter.java +++ b/src/java/org/apache/cassandra/io/util/ChecksumWriter.java @@ -20,13 +20,11 @@ package org.apache.cassandra.io.util; import java.io.*; import java.nio.ByteBuffer; -import java.nio.file.Files; +import java.nio.charset.StandardCharsets; import java.util.zip.CRC32; import javax.annotation.Nonnull; -import com.google.common.base.Charsets; - import org.apache.cassandra.io.FSWriteError; public class ChecksumWriter @@ -90,9 +88,12 @@ public class ChecksumWriter public void writeFullChecksum(@Nonnull File digestFile) { - try (BufferedWriter out = Files.newBufferedWriter(digestFile.toPath(), Charsets.UTF_8)) + try (FileOutputStream fos = new FileOutputStream(digestFile); + DataOutputStream out = new DataOutputStream(new BufferedOutputStream(fos))) { - out.write(String.valueOf(fullChecksum.getValue())); + out.write(String.valueOf(fullChecksum.getValue()).getBytes(StandardCharsets.UTF_8)); + out.flush(); + fos.getFD().sync(); } catch (IOException e) {