diff options
author | Xiang Li <xiangli.cs@gmail.com> | 2015-11-06 10:49:46 -0800 |
---|---|---|
committer | Xiang Li <xiangli.cs@gmail.com> | 2015-11-06 11:03:28 -0800 |
commit | b9869663616be4ac56a1222841265dc0b696c253 (patch) | |
tree | 05c15ec01f253b7c6872b0e695e23bb1c842fe82 | |
parent | Merge pull request #451 from Charlesworth/master (diff) | |
download | dedo-b9869663616be4ac56a1222841265dc0b696c253.tar.gz dedo-b9869663616be4ac56a1222841265dc0b696c253.tar.xz |
add WriteToFlag to Tx
For in memory workload, it does not make sense to use
o_direct to copy the file. Adding a option to clear out
o_direct and for other future cases.
-rw-r--r-- | bolt_linux.go | 2 | ||||
-rw-r--r-- | bolt_openbsd.go | 2 | ||||
-rw-r--r-- | bolt_windows.go | 2 | ||||
-rw-r--r-- | tx.go | 19 |
4 files changed, 13 insertions, 12 deletions
diff --git a/bolt_linux.go b/bolt_linux.go index e9d1c90..2b67666 100644 --- a/bolt_linux.go +++ b/bolt_linux.go @@ -4,8 +4,6 @@ import ( "syscall" ) -var odirect = syscall.O_DIRECT - // fdatasync flushes written data to a file descriptor. func fdatasync(db *DB) error { return syscall.Fdatasync(int(db.file.Fd())) diff --git a/bolt_openbsd.go b/bolt_openbsd.go index 7c1bef1..7058c3d 100644 --- a/bolt_openbsd.go +++ b/bolt_openbsd.go @@ -11,8 +11,6 @@ const ( msInvalidate // invalidate cached data ) -var odirect int - func msync(db *DB) error { _, _, errno := syscall.Syscall(syscall.SYS_MSYNC, uintptr(unsafe.Pointer(db.data)), uintptr(db.datasz), msInvalidate) if errno != 0 { diff --git a/bolt_windows.go b/bolt_windows.go index f048365..91c4968 100644 --- a/bolt_windows.go +++ b/bolt_windows.go @@ -40,8 +40,6 @@ func unlockFileEx(h syscall.Handle, reserved, locklow, lockhigh uint32, ol *sysc return nil } -var odirect int - // fdatasync flushes written data to a file descriptor. func fdatasync(db *DB) error { return db.file.Sync() @@ -29,6 +29,16 @@ type Tx struct { pages map[pgid]*page stats TxStats commitHandlers []func() + + // WriteFlag specifies the flag for write related methods + // like WriteTo. + // Tx opens the database file with the specified + // flag to copy the data. + // + // By default, the flag is set to empty for in-memory workload. + // To avoid cache trashing for large on disk workload, set this + // flag with o_direct. + WriteFlag int } // init initializes the transaction. @@ -272,13 +282,10 @@ func (tx *Tx) Copy(w io.Writer) error { // WriteTo writes the entire database to a writer. // If err == nil then exactly tx.Size() bytes will be written into the writer. func (tx *Tx) WriteTo(w io.Writer) (n int64, err error) { - // Attempt to open reader directly. + // Attempt to open reader with WriteFlag var f *os.File - if f, err = os.OpenFile(tx.db.path, os.O_RDONLY|odirect, 0); err != nil { - // Fallback to a regular open if that doesn't work. - if f, err = os.OpenFile(tx.db.path, os.O_RDONLY, 0); err != nil { - return 0, err - } + if f, err = os.OpenFile(tx.db.path, os.O_RDONLY|tx.WriteFlag, 0); err != nil { + return 0, err } // Copy the meta pages. |