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