diff --git a/util/env_posix.cc b/util/env_posix.cc index 80141fd58..994c45a2a 100644 --- a/util/env_posix.cc +++ b/util/env_posix.cc @@ -1121,7 +1121,7 @@ class PosixEnv : public Env { } else { int fd = fileno(f); SetFD_CLOEXEC(fd, nullptr); - result->reset(new PosixLogger(f, &PosixEnv::gettid)); + result->reset(new PosixLogger(f, &PosixEnv::gettid, this)); return Status::OK(); } } diff --git a/util/posix_logger.h b/util/posix_logger.h index ec0ad1d32..b7ad5ac14 100644 --- a/util/posix_logger.h +++ b/util/posix_logger.h @@ -33,9 +33,13 @@ class PosixLogger : public Logger { uint64_t (*gettid_)(); // Return the thread id for the current thread std::atomic_size_t log_size_; int fd_; + const static uint64_t flush_every_seconds_ = 5; + uint64_t last_flush_micros_; + Env* env_; public: - PosixLogger(FILE* f, uint64_t (*gettid)()) : - file_(f), gettid_(gettid), log_size_(0), fd_(fileno(f)) { } + PosixLogger(FILE* f, uint64_t (*gettid)(), Env* env) : + file_(f), gettid_(gettid), log_size_(0), fd_(fileno(f)), + last_flush_micros_(0), env_(env) { } virtual ~PosixLogger() { fclose(file_); } @@ -118,7 +122,11 @@ class PosixLogger : public Logger { size_t sz = fwrite(base, 1, write_size, file_); assert(sz == write_size); if (sz > 0) { - fflush(file_); + if (env_->NowMicros() - last_flush_micros_ >= + flush_every_seconds_ * 1000000) { + fflush(file_); + last_flush_micros_ = env_->NowMicros(); + } log_size_ += write_size; } if (base != buffer) {