From bfccbb2cb5f6eb25981b8693ba8acc5e885c7cce Mon Sep 17 00:00:00 2001 From: Ben Johnson Date: Fri, 23 May 2014 11:40:05 -0600 Subject: Avoid trashing page cache on Tx.Copy(). This commit change the database copy to use O_DIRECT so that the Linux page cache is not trashed during a backup. This is only available on Linux. --- bolt.go | 6 +++++- bolt_linux.go | 2 ++ tx.go | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/bolt.go b/bolt.go index c3a1bb5..a3f1eac 100644 --- a/bolt.go +++ b/bolt.go @@ -2,7 +2,11 @@ package bolt -import "os" +import ( + "os" +) + +var odirect int func fdatasync(f *os.File) error { return f.Sync() diff --git a/bolt_linux.go b/bolt_linux.go index 351b65a..4351db5 100644 --- a/bolt_linux.go +++ b/bolt_linux.go @@ -5,6 +5,8 @@ import ( "syscall" ) +var odirect = syscall.O_DIRECT + func fdatasync(f *os.File) error { return syscall.Fdatasync(int(f.Fd())) } diff --git a/tx.go b/tx.go index 823b06d..8791adf 100644 --- a/tx.go +++ b/tx.go @@ -240,7 +240,7 @@ func (tx *Tx) close() { // Copy will write exactly tx.Size() bytes into the writer. func (tx *Tx) Copy(w io.Writer) error { // Open reader on the database. - f, err := os.Open(tx.db.path) + f, err := os.OpenFile(tx.db.path, os.O_RDONLY|odirect, 0) if err != nil { _ = tx.Rollback() return err -- cgit v1.2.3