Skip to content

add option to disable syncing #32

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Nov 10, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 29 additions & 16 deletions flatfs/flatfs.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,14 @@ type Datastore struct {
path string
// length of the dir splay prefix, in bytes of hex digits
hexPrefixLen int

// sychronize all writes and directory changes for added safety
sync bool
}

var _ datastore.Datastore = (*Datastore)(nil)

func New(path string, prefixLen int) (*Datastore, error) {
func New(path string, prefixLen int, sync bool) (*Datastore, error) {
if prefixLen <= 0 || prefixLen > maxPrefixLen {
return nil, ErrBadPrefixLen
}
Expand Down Expand Up @@ -81,8 +84,10 @@ func (fs *Datastore) makePrefixDir(dir string) error {
// it, the creation of the prefix dir itself might not be
// durable yet. Sync the root dir after a successful mkdir of
// a prefix dir, just to be paranoid.
if err := syncDir(fs.path); err != nil {
return err
if fs.sync {
if err := syncDir(fs.path); err != nil {
return err
}
}
return nil
}
Expand Down Expand Up @@ -149,8 +154,10 @@ func (fs *Datastore) doPut(key datastore.Key, val []byte) error {
if _, err := tmp.Write(val); err != nil {
return err
}
if err := tmp.Sync(); err != nil {
return err
if fs.sync {
if err := tmp.Sync(); err != nil {
return err
}
}
if err := tmp.Close(); err != nil {
return err
Expand All @@ -163,8 +170,10 @@ func (fs *Datastore) doPut(key datastore.Key, val []byte) error {
}
removed = true

if err := syncDir(dir); err != nil {
return err
if fs.sync {
if err := syncDir(dir); err != nil {
return err
}
}
return nil
}
Expand Down Expand Up @@ -214,8 +223,10 @@ func (fs *Datastore) putMany(data map[datastore.Key]interface{}) error {
// Now we sync everything
// sync and close files
for fi, _ := range files {
if err := fi.Sync(); err != nil {
return err
if fs.sync {
if err := fi.Sync(); err != nil {
return err
}
}

if err := fi.Close(); err != nil {
Expand All @@ -237,15 +248,17 @@ func (fs *Datastore) putMany(data map[datastore.Key]interface{}) error {
}

// now sync the dirs for those files
for _, dir := range dirsToSync {
if err := syncDir(dir); err != nil {
return err
if fs.sync {
for _, dir := range dirsToSync {
if err := syncDir(dir); err != nil {
return err
}
}
}

// sync top flatfs dir
if err := syncDir(fs.path); err != nil {
return err
// sync top flatfs dir
if err := syncDir(fs.path); err != nil {
return err
}
}

return nil
Expand Down
32 changes: 16 additions & 16 deletions flatfs/flatfs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ func TestBadPrefixLen(t *testing.T) {
defer cleanup()

for i := 0; i > -3; i-- {
_, err := flatfs.New(temp, 0)
_, err := flatfs.New(temp, i, false)
if g, e := err, flatfs.ErrBadPrefixLen; g != e {
t.Errorf("expected ErrBadPrefixLen, got: %v", g)
}
Expand All @@ -46,7 +46,7 @@ func TestPutBadValueType(t *testing.T) {
temp, cleanup := tempdir(t)
defer cleanup()

fs, err := flatfs.New(temp, 2)
fs, err := flatfs.New(temp, 2, false)
if err != nil {
t.Fatalf("New fail: %v\n", err)
}
Expand All @@ -61,7 +61,7 @@ func TestPut(t *testing.T) {
temp, cleanup := tempdir(t)
defer cleanup()

fs, err := flatfs.New(temp, 2)
fs, err := flatfs.New(temp, 2, false)
if err != nil {
t.Fatalf("New fail: %v\n", err)
}
Expand All @@ -76,7 +76,7 @@ func TestGet(t *testing.T) {
temp, cleanup := tempdir(t)
defer cleanup()

fs, err := flatfs.New(temp, 2)
fs, err := flatfs.New(temp, 2, false)
if err != nil {
t.Fatalf("New fail: %v\n", err)
}
Expand Down Expand Up @@ -104,7 +104,7 @@ func TestPutOverwrite(t *testing.T) {
temp, cleanup := tempdir(t)
defer cleanup()

fs, err := flatfs.New(temp, 2)
fs, err := flatfs.New(temp, 2, false)
if err != nil {
t.Fatalf("New fail: %v\n", err)
}
Expand Down Expand Up @@ -136,7 +136,7 @@ func TestGetNotFoundError(t *testing.T) {
temp, cleanup := tempdir(t)
defer cleanup()

fs, err := flatfs.New(temp, 2)
fs, err := flatfs.New(temp, 2, false)
if err != nil {
t.Fatalf("New fail: %v\n", err)
}
Expand All @@ -154,7 +154,7 @@ func TestStorage(t *testing.T) {
const prefixLen = 2
const prefix = "7175"
const target = prefix + string(os.PathSeparator) + "71757578.data"
fs, err := flatfs.New(temp, prefixLen)
fs, err := flatfs.New(temp, prefixLen, false)
if err != nil {
t.Fatalf("New fail: %v\n", err)
}
Expand Down Expand Up @@ -209,7 +209,7 @@ func TestHasNotFound(t *testing.T) {
temp, cleanup := tempdir(t)
defer cleanup()

fs, err := flatfs.New(temp, 2)
fs, err := flatfs.New(temp, 2, false)
if err != nil {
t.Fatalf("New fail: %v\n", err)
}
Expand All @@ -227,7 +227,7 @@ func TestHasFound(t *testing.T) {
temp, cleanup := tempdir(t)
defer cleanup()

fs, err := flatfs.New(temp, 2)
fs, err := flatfs.New(temp, 2, false)
if err != nil {
t.Fatalf("New fail: %v\n", err)
}
Expand All @@ -249,7 +249,7 @@ func TestDeleteNotFound(t *testing.T) {
temp, cleanup := tempdir(t)
defer cleanup()

fs, err := flatfs.New(temp, 2)
fs, err := flatfs.New(temp, 2, false)
if err != nil {
t.Fatalf("New fail: %v\n", err)
}
Expand All @@ -264,7 +264,7 @@ func TestDeleteFound(t *testing.T) {
temp, cleanup := tempdir(t)
defer cleanup()

fs, err := flatfs.New(temp, 2)
fs, err := flatfs.New(temp, 2, false)
if err != nil {
t.Fatalf("New fail: %v\n", err)
}
Expand All @@ -289,7 +289,7 @@ func TestQuerySimple(t *testing.T) {
temp, cleanup := tempdir(t)
defer cleanup()

fs, err := flatfs.New(temp, 2)
fs, err := flatfs.New(temp, 2, false)
if err != nil {
t.Fatalf("New fail: %v\n", err)
}
Expand Down Expand Up @@ -325,7 +325,7 @@ func TestBatchPut(t *testing.T) {
temp, cleanup := tempdir(t)
defer cleanup()

fs, err := flatfs.New(temp, 2)
fs, err := flatfs.New(temp, 2, false)
if err != nil {
t.Fatalf("New fail: %v\n", err)
}
Expand All @@ -337,7 +337,7 @@ func TestBatchDelete(t *testing.T) {
temp, cleanup := tempdir(t)
defer cleanup()

fs, err := flatfs.New(temp, 2)
fs, err := flatfs.New(temp, 2, false)
if err != nil {
t.Fatalf("New fail: %v\n", err)
}
Expand All @@ -360,7 +360,7 @@ func BenchmarkConsecutivePut(b *testing.B) {
temp, cleanup := tempdir(b)
defer cleanup()

fs, err := flatfs.New(temp, 2)
fs, err := flatfs.New(temp, 2, false)
if err != nil {
b.Fatalf("New fail: %v\n", err)
}
Expand Down Expand Up @@ -390,7 +390,7 @@ func BenchmarkBatchedPut(b *testing.B) {
temp, cleanup := tempdir(b)
defer cleanup()

fs, err := flatfs.New(temp, 2)
fs, err := flatfs.New(temp, 2, false)
if err != nil {
b.Fatalf("New fail: %v\n", err)
}
Expand Down