leveldb: allows completely disable fsync (closes #103)
diff --git a/leveldb/db.go b/leveldb/db.go
index def86bc..88a3e0d 100644
--- a/leveldb/db.go
+++ b/leveldb/db.go
@@ -291,6 +291,7 @@
// We will drop corrupted table.
strict = o.GetStrict(opt.StrictRecovery)
+ noSync = o.GetNoSync()
rec = &sessionRecord{}
bpool = util.NewBufferPool(o.GetBlockSize() + 5)
@@ -328,9 +329,11 @@
if err != nil {
return
}
- err = writer.Sync()
- if err != nil {
- return
+ if !noSync {
+ err = writer.Sync()
+ if err != nil {
+ return
+ }
}
size = int64(tw.BytesLen())
return
diff --git a/leveldb/db_write.go b/leveldb/db_write.go
index 176ee89..0c39565 100644
--- a/leveldb/db_write.go
+++ b/leveldb/db_write.go
@@ -129,7 +129,7 @@
return
}
- b.init(wo.GetSync())
+ b.init(wo.GetSync() && !db.s.o.GetNoSync())
// The write happen synchronously.
select {
diff --git a/leveldb/opt/options.go b/leveldb/opt/options.go
index f9a309d..7b5d8b9 100644
--- a/leveldb/opt/options.go
+++ b/leveldb/opt/options.go
@@ -308,6 +308,11 @@
// The default is 2.
MaxMemCompationLevel int
+ // NoSync allows completely disable fsync.
+ //
+ // The default is false.
+ NoSync bool
+
// NumLevel defines number of database level. The level shouldn't changed
// between opens, or the database will panic.
//
@@ -546,6 +551,13 @@
return level
}
+func (o *Options) GetNoSync() bool {
+ if o == nil {
+ return false
+ }
+ return o.NoSync
+}
+
func (o *Options) GetNumLevel() int {
if o == nil || o.NumLevel <= 0 {
return DefaultNumLevel
diff --git a/leveldb/session_util.go b/leveldb/session_util.go
index 399a788..7ec9f86 100644
--- a/leveldb/session_util.go
+++ b/leveldb/session_util.go
@@ -240,9 +240,11 @@
if err != nil {
return
}
- err = s.manifestWriter.Sync()
- if err != nil {
- return
+ if !s.o.GetNoSync() {
+ err = s.manifestWriter.Sync()
+ if err != nil {
+ return
+ }
}
s.recordCommited(rec)
return
diff --git a/leveldb/table.go b/leveldb/table.go
index db386f3..37be47a 100644
--- a/leveldb/table.go
+++ b/leveldb/table.go
@@ -287,6 +287,7 @@
// Table operations.
type tOps struct {
s *session
+ noSync bool
cache *cache.Cache
bcache *cache.Cache
bpool *util.BufferPool
@@ -458,6 +459,7 @@
}
return &tOps{
s: s,
+ noSync: s.o.GetNoSync(),
cache: cache.NewCache(cacher),
bcache: bcache,
bpool: bpool,
@@ -505,9 +507,11 @@
if err != nil {
return
}
- err = w.w.Sync()
- if err != nil {
- return
+ if !w.t.noSync {
+ err = w.w.Sync()
+ if err != nil {
+ return
+ }
}
f = newTableFile(w.file, uint64(w.tw.BytesLen()), iKey(w.first), iKey(w.last))
return