Skip to content

Commit

Permalink
Direct I/O Close() shouldn't rewrite the last block (#4771)
Browse files Browse the repository at this point in the history
Summary:
In Direct I/O case, WritableFileWriter::Close() rewrites the last block again, even if there is nothing new. The reason is that, Close() flushes the buffer. For non-direct I/O case, the buffer is empty in this case so it is a no-op. However, in direct I/O case, the partial data in the last block is kept in the buffer because it needs to be rewritten for the next write. This piece of data is flushed again. This commit fixes it by skipping this write out if `pending_sync_` flag shows that there isn't new data sync last sync.
Pull Request resolved: #4771

Differential Revision: D13420426

Pulled By: siying

fbshipit-source-id: 9d39ec9a215b1425d4ed40d85e0eba1f5daa75c6
  • Loading branch information
siying authored and facebook-github-bot committed Dec 11, 2018
1 parent 49666d7 commit ae25546
Showing 1 changed file with 3 additions and 1 deletion.
4 changes: 3 additions & 1 deletion util/file_reader_writer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -327,7 +327,9 @@ Status WritableFileWriter::Flush() {
if (buf_.CurrentSize() > 0) {
if (use_direct_io()) {
#ifndef ROCKSDB_LITE
s = WriteDirect();
if (pending_sync_) {
s = WriteDirect();
}
#endif // !ROCKSDB_LITE
} else {
s = WriteBuffered(buf_.BufferStart(), buf_.CurrentSize());
Expand Down

0 comments on commit ae25546

Please sign in to comment.