You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zookeeper.apache.org by fa...@apache.org on 2019/12/03 18:12:44 UTC
[zookeeper] branch master updated: ZOOKEEPER-3595: restore the
handling of the fsync parameter
This is an automated email from the ASF dual-hosted git repository.
fangmin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/zookeeper.git
The following commit(s) were added to refs/heads/master by this push:
new b0556c2 ZOOKEEPER-3595: restore the handling of the fsync parameter
b0556c2 is described below
commit b0556c20a4331de29476faf845e8fca18e8820fe
Author: Jingguo Yao <ya...@gmail.com>
AuthorDate: Tue Dec 3 10:12:30 2019 -0800
ZOOKEEPER-3595: restore the handling of the fsync parameter
Author: Jingguo Yao <ya...@gmail.com>
Reviewers: enixon@apache.org, eolivelli@apache.org, maoling199210191@sina.com, fangmin@apache.org
Closes #1146 from yaojingguo/ZOOKEEPER-3595
---
.../apache/zookeeper/server/persistence/FileSnap.java | 2 +-
.../apache/zookeeper/server/persistence/SnapStream.java | 6 ++++--
.../zookeeper/server/persistence/SnapStreamTest.java | 16 +++++++++++++---
3 files changed, 18 insertions(+), 6 deletions(-)
diff --git a/zookeeper-server/src/main/java/org/apache/zookeeper/server/persistence/FileSnap.java b/zookeeper-server/src/main/java/org/apache/zookeeper/server/persistence/FileSnap.java
index 26fc402..9cc7118 100644
--- a/zookeeper-server/src/main/java/org/apache/zookeeper/server/persistence/FileSnap.java
+++ b/zookeeper-server/src/main/java/org/apache/zookeeper/server/persistence/FileSnap.java
@@ -231,7 +231,7 @@ public class FileSnap implements SnapShot {
File snapShot,
boolean fsync) throws IOException {
if (!close) {
- try (CheckedOutputStream snapOS = SnapStream.getOutputStream(snapShot)) {
+ try (CheckedOutputStream snapOS = SnapStream.getOutputStream(snapShot, fsync)) {
OutputArchive oa = BinaryOutputArchive.getArchive(snapOS);
FileHeader header = new FileHeader(SNAP_MAGIC, VERSION, dbId);
serialize(dt, sessions, oa, header);
diff --git a/zookeeper-server/src/main/java/org/apache/zookeeper/server/persistence/SnapStream.java b/zookeeper-server/src/main/java/org/apache/zookeeper/server/persistence/SnapStream.java
index 2227096..b812aa1 100644
--- a/zookeeper-server/src/main/java/org/apache/zookeeper/server/persistence/SnapStream.java
+++ b/zookeeper-server/src/main/java/org/apache/zookeeper/server/persistence/SnapStream.java
@@ -37,6 +37,7 @@ import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import org.apache.jute.InputArchive;
import org.apache.jute.OutputArchive;
+import org.apache.zookeeper.common.AtomicFileOutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xerial.snappy.SnappyCodec;
@@ -119,11 +120,12 @@ public class SnapStream {
* Return the OutputStream based on predefined stream mode.
*
* @param file the file the OutputStream writes to
+ * @param fsync sync the file immediately after write
* @return the specific OutputStream
* @throws IOException
*/
- public static CheckedOutputStream getOutputStream(File file) throws IOException {
- FileOutputStream fos = new FileOutputStream(file);
+ public static CheckedOutputStream getOutputStream(File file, boolean fsync) throws IOException {
+ OutputStream fos = fsync ? new AtomicFileOutputStream(file) : new FileOutputStream(file);
OutputStream os;
switch (streamMode) {
case GZIP:
diff --git a/zookeeper-server/src/test/java/org/apache/zookeeper/server/persistence/SnapStreamTest.java b/zookeeper-server/src/test/java/org/apache/zookeeper/server/persistence/SnapStreamTest.java
index d884d1e..6545780 100644
--- a/zookeeper-server/src/test/java/org/apache/zookeeper/server/persistence/SnapStreamTest.java
+++ b/zookeeper-server/src/test/java/org/apache/zookeeper/server/persistence/SnapStreamTest.java
@@ -79,12 +79,17 @@ public class SnapStreamTest {
}
private void testSerializeDeserialize(StreamMode mode, String fileSuffix) throws IOException {
+ testSerializeDeserialize(mode, fileSuffix, false);
+ testSerializeDeserialize(mode, fileSuffix, true);
+ }
+
+ private void testSerializeDeserialize(StreamMode mode, String fileSuffix, boolean fsync) throws IOException {
SnapStream.setStreamMode(mode);
// serialize with gzip stream
File tmpDir = createTmpDir();
File file = new File(tmpDir, "snapshot.180000e3a2" + fileSuffix);
- CheckedOutputStream os = SnapStream.getOutputStream(file);
+ CheckedOutputStream os = SnapStream.getOutputStream(file, fsync);
OutputArchive oa = BinaryOutputArchive.getArchive(os);
FileHeader header = new FileHeader(FileSnap.SNAP_MAGIC, 2, 1);
header.serialize(oa, "fileheader");
@@ -103,20 +108,25 @@ public class SnapStreamTest {
SnapStream.checkSealIntegrity(is, ia);
}
- private void checkInvalidSnapshot(String filename) throws IOException {
+ private void checkInvalidSnapshot(String filename, boolean fsync) throws IOException {
// set the output stream mode to CHECKED
SnapStream.setStreamMode(StreamMode.CHECKED);
// serialize to CHECKED file without magic header
File tmpDir = createTmpDir();
File file = new File(tmpDir, filename);
- OutputStream os = SnapStream.getOutputStream(file);
+ OutputStream os = SnapStream.getOutputStream(file, fsync);
os.write(1);
os.flush();
os.close();
assertFalse(SnapStream.isValidSnapshot(file));
}
+ private void checkInvalidSnapshot(String filename) throws IOException {
+ checkInvalidSnapshot(filename, false);
+ checkInvalidSnapshot(filename, true);
+ }
+
@Test
public void testInvalidSnapshot() throws IOException {
assertFalse(SnapStream.isValidSnapshot(null));