Merge pull request #231 from MichaelEischer/fix-fsync-warning

Fix inverted condition for fsync warning
This commit is contained in:
Michael Eischer 2023-05-18 16:36:04 +02:00 committed by GitHub
commit 0cd077f4ab
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 18 additions and 6 deletions

View file

@ -0,0 +1,9 @@
Bugfix: Fix erroneous warnings about unsupported fsync
Due to a regression in rest-server 0.12.0, it continuously printed
`WARNING: fsync is not supported by the data storage. This can lead to data loss,
if the system crashes or the storage is unexpectedly disconnected.` for systems
that support fsync. We have fixed the warning.
https://github.com/restic/rest-server/issues/230
https://github.com/restic/rest-server/pull/231

View file

@ -7,6 +7,7 @@ import (
"path" "path"
"path/filepath" "path/filepath"
"strings" "strings"
"sync"
"github.com/restic/rest-server/quota" "github.com/restic/rest-server/quota"
"github.com/restic/rest-server/repo" "github.com/restic/rest-server/repo"
@ -34,6 +35,7 @@ type Server struct {
htpasswdFile *HtpasswdFile htpasswdFile *HtpasswdFile
quotaManager *quota.Manager quotaManager *quota.Manager
fsyncWarning sync.Once
} }
// MaxFolderDepth is the maxDepth param passed to splitURLPath. // MaxFolderDepth is the maxDepth param passed to splitURLPath.
@ -91,6 +93,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
QuotaManager: s.quotaManager, // may be nil QuotaManager: s.quotaManager, // may be nil
PanicOnError: s.PanicOnError, PanicOnError: s.PanicOnError,
NoVerifyUpload: s.NoVerifyUpload, NoVerifyUpload: s.NoVerifyUpload,
FsyncWarning: &s.fsyncWarning,
} }
if s.Prometheus { if s.Prometheus {
opt.BlobMetricFunc = makeBlobMetricFunc(username, folderPath) opt.BlobMetricFunc = makeBlobMetricFunc(username, folderPath)

View file

@ -39,6 +39,7 @@ type Options struct {
BlobMetricFunc BlobMetricFunc BlobMetricFunc BlobMetricFunc
QuotaManager *quota.Manager QuotaManager *quota.Manager
FsyncWarning *sync.Once
} }
// DefaultDirMode is the file mode used for directory creation if not // DefaultDirMode is the file mode used for directory creation if not
@ -74,8 +75,6 @@ func New(path string, opt Options) (*Handler, error) {
type Handler struct { type Handler struct {
path string // filesystem path of repo path string // filesystem path of repo
opt Options opt Options
fsyncWarning sync.Once
} }
// httpDefaultError write a HTTP error with the default description // httpDefaultError write a HTTP error with the default description
@ -638,15 +637,16 @@ func (h *Handler) saveBlob(w http.ResponseWriter, r *http.Request) {
return return
} }
if !syncNotSup { if syncNotSup {
h.opt.FsyncWarning.Do(func() {
log.Print("WARNING: fsync is not supported by the data storage. This can lead to data loss, if the system crashes or the storage is unexpectedly disconnected.")
})
} else {
if err := syncDir(filepath.Dir(path)); err != nil { if err := syncDir(filepath.Dir(path)); err != nil {
// Don't call os.Remove(path) as this is prone to race conditions with parallel upload retries // Don't call os.Remove(path) as this is prone to race conditions with parallel upload retries
h.internalServerError(w, err) h.internalServerError(w, err)
return return
} }
h.fsyncWarning.Do(func() {
log.Print("WARNING: fsync is not supported by the data storage. This can lead to data loss, if the system crashes or the storage is unexpectedly disconnected.")
})
} }
h.sendMetric(objectType, BlobWrite, uint64(written)) h.sendMetric(objectType, BlobWrite, uint64(written))