diff --git a/pkg/fileutil/sync.go b/pkg/fileutil/sync.go new file mode 100644 index 000000000..cd7fff08f --- /dev/null +++ b/pkg/fileutil/sync.go @@ -0,0 +1,26 @@ +// Copyright 2016 CoreOS, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build !linux + +package fileutil + +import "os" + +// Fdatasync is similar to fsync(), but does not flush modified metadata +// unless that metadata is needed in order to allow a subsequent data retrieval +// to be correctly handled. +func Fdatasync(f *os.File) error { + return f.Sync() +} diff --git a/pkg/fileutil/sync_linux.go b/pkg/fileutil/sync_linux.go new file mode 100644 index 000000000..14c4b4808 --- /dev/null +++ b/pkg/fileutil/sync_linux.go @@ -0,0 +1,29 @@ +// Copyright 2016 CoreOS, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build linux + +package fileutil + +import ( + "os" + "syscall" +) + +// Fdatasync is similar to fsync(), but does not flush modified metadata +// unless that metadata is needed in order to allow a subsequent data retrieval +// to be correctly handled. +func Fdatasync(f *os.File) error { + return syscall.Fdatasync(int(f.Fd())) +} diff --git a/wal/wal.go b/wal/wal.go index e42e07a70..8a61fd564 100644 --- a/wal/wal.go +++ b/wal/wal.go @@ -399,7 +399,7 @@ func (w *WAL) sync() error { } } start := time.Now() - err := w.f.Sync() + err := fileutil.Fdatasync(w.f) syncDurations.Observe(float64(time.Since(start)) / float64(time.Second)) return err }