diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/Journal.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/Journal.java index eff1673edb0..df5e275d318 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/Journal.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/Journal.java @@ -365,6 +365,7 @@ public static class ForceWriteRequest { private boolean shouldClose; private long lastFlushedPosition; private long logId; + private boolean flushed; public int process() { closeFileIfNecessary(); @@ -380,13 +381,20 @@ public int process() { return forceWriteWaiters.size(); } + private void flushFileToDisk() throws IOException { + if (!flushed) { + logFile.forceWrite(false); + flushed = true; + } + } + public void closeFileIfNecessary() { // Close if shouldClose is set if (shouldClose) { // We should guard against exceptions so its // safe to call in catch blocks try { - logFile.forceWrite(false); + flushFileToDisk(); logFile.close(); // Call close only once shouldClose = false; @@ -525,7 +533,7 @@ public void run() { private void syncJournal(ForceWriteRequest lastRequest) throws IOException { long fsyncStartTime = MathUtils.nowInNano(); try { - lastRequest.logFile.forceWrite(false); + lastRequest.flushFileToDisk(); journalStats.getJournalSyncStats().registerSuccessfulEvent(MathUtils.elapsedNanos(fsyncStartTime), TimeUnit.NANOSECONDS); lastLogMark.setCurLogMark(lastRequest.logId, lastRequest.lastFlushedPosition);