aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXiang Li <xiangli.cs@gmail.com>2015-11-06 10:49:46 -0800
committerXiang Li <xiangli.cs@gmail.com>2015-11-06 11:03:28 -0800
commitb9869663616be4ac56a1222841265dc0b696c253 (patch)
tree05c15ec01f253b7c6872b0e695e23bb1c842fe82
parentMerge pull request #451 from Charlesworth/master (diff)
downloaddedo-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.go2
-rw-r--r--bolt_openbsd.go2
-rw-r--r--bolt_windows.go2
-rw-r--r--tx.go19
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()
diff --git a/tx.go b/tx.go
index fe6c287..e181aab 100644
--- a/tx.go
+++ b/tx.go
@@ -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.