add option for O_SYNC writes for standalone FS backend (#9581)

master
Krishna Srinivas 5 years ago committed by GitHub
parent c045ae15e7
commit 94f1a1dea3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 5
      cmd/common-main.go
  2. 1
      cmd/config/constants.go
  3. 6
      cmd/config/errors.go
  4. 6
      cmd/fs-v1-helpers.go
  5. 4
      cmd/fs-v1-multipart.go
  6. 2
      cmd/globals.go
  7. 8
      pkg/ioutil/append-file_nix.go
  8. 2
      pkg/ioutil/append-file_windows.go
  9. 2
      pkg/ioutil/ioutil_test.go

@ -186,6 +186,11 @@ func handleCommonEnvVars() {
logger.Fatal(config.ErrInvalidBrowserValue(err), "Invalid MINIO_BROWSER value in environment variable") logger.Fatal(config.ErrInvalidBrowserValue(err), "Invalid MINIO_BROWSER value in environment variable")
} }
globalFSOSync, err = config.ParseBool(env.Get(config.EnvFSOSync, config.EnableOff))
if err != nil {
logger.Fatal(config.ErrInvalidFSOSyncValue(err), "Invalid MINIO_FS_OSYNC value in environment variable")
}
domains := env.Get(config.EnvDomain, "") domains := env.Get(config.EnvDomain, "")
if len(domains) != 0 { if len(domains) != 0 {
for _, domainName := range strings.Split(domains, config.ValueSeparator) { for _, domainName := range strings.Split(domains, config.ValueSeparator) {

@ -32,6 +32,7 @@ const (
EnvRegionName = "MINIO_REGION_NAME" EnvRegionName = "MINIO_REGION_NAME"
EnvPublicIPs = "MINIO_PUBLIC_IPS" EnvPublicIPs = "MINIO_PUBLIC_IPS"
EnvEndpoints = "MINIO_ENDPOINTS" EnvEndpoints = "MINIO_ENDPOINTS"
EnvFSOSync = "MINIO_FS_OSYNC"
// API sub-system // API sub-system
EnvAPIRequestsMax = "MINIO_API_REQUESTS_MAX" EnvAPIRequestsMax = "MINIO_API_REQUESTS_MAX"

@ -24,6 +24,12 @@ var (
"Browser can only accept `on` and `off` values. To disable web browser access, set this value to `off`", "Browser can only accept `on` and `off` values. To disable web browser access, set this value to `off`",
) )
ErrInvalidFSOSyncValue = newErrFn(
"Invalid O_SYNC value",
"Please check the passed value",
"Can only accept `on` and `off` values. To enable O_SYNC for fs backend, set this value to `on`",
)
ErrInvalidDomainValue = newErrFn( ErrInvalidDomainValue = newErrFn(
"Invalid domain value", "Invalid domain value",
"Please check the passed value", "Please check the passed value",

@ -321,7 +321,11 @@ func fsCreateFile(ctx context.Context, filePath string, reader io.Reader, buf []
return 0, err return 0, err
} }
writer, err := lock.Open(filePath, os.O_CREATE|os.O_WRONLY, 0666) flags := os.O_CREATE | os.O_WRONLY
if globalFSOSync {
flags = flags | os.O_SYNC
}
writer, err := lock.Open(filePath, flags, 0666)
if err != nil { if err != nil {
return 0, osErrToFSFileErr(err) return 0, osErrToFSFileErr(err)
} }

@ -112,7 +112,7 @@ func (fs *FSObjects) backgroundAppend(ctx context.Context, bucket, object, uploa
} }
partPath := pathJoin(uploadIDDir, entry) partPath := pathJoin(uploadIDDir, entry)
err = mioutil.AppendFile(file.filePath, partPath) err = mioutil.AppendFile(file.filePath, partPath, globalFSOSync)
if err != nil { if err != nil {
reqInfo := logger.GetReqInfo(ctx).AppendTags("partPath", partPath) reqInfo := logger.GetReqInfo(ctx).AppendTags("partPath", partPath)
reqInfo.AppendTags("filepath", file.filePath) reqInfo.AppendTags("filepath", file.filePath)
@ -638,7 +638,7 @@ func (fs *FSObjects) CompleteMultipartUpload(ctx context.Context, bucket string,
} }
for _, part := range parts { for _, part := range parts {
partPath := getPartFile(entries, part.PartNumber, part.ETag) partPath := getPartFile(entries, part.PartNumber, part.ETag)
if err = mioutil.AppendFile(appendFilePath, pathJoin(uploadIDDir, partPath)); err != nil { if err = mioutil.AppendFile(appendFilePath, pathJoin(uploadIDDir, partPath), globalFSOSync); err != nil {
logger.LogIf(ctx, err) logger.LogIf(ctx, err)
return oi, toObjectErr(err) return oi, toObjectErr(err)
} }

@ -280,6 +280,8 @@ var (
// fix the system. // fix the system.
globalSafeMode bool globalSafeMode bool
// If writes to FS backend should be O_SYNC.
globalFSOSync bool
// Add new variable global values here. // Add new variable global values here.
) )

@ -24,8 +24,12 @@ import (
) )
// AppendFile - appends the file "src" to the file "dst" // AppendFile - appends the file "src" to the file "dst"
func AppendFile(dst string, src string) error { func AppendFile(dst string, src string, osync bool) error {
appendFile, err := os.OpenFile(dst, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666) flags := os.O_WRONLY | os.O_APPEND | os.O_CREATE
if osync {
flags = flags | os.O_SYNC
}
appendFile, err := os.OpenFile(dst, flags, 0666)
if err != nil { if err != nil {
return err return err
} }

@ -24,7 +24,7 @@ import (
) )
// AppendFile - appends the file "src" to the file "dst" // AppendFile - appends the file "src" to the file "dst"
func AppendFile(dst string, src string) error { func AppendFile(dst string, src string, osync bool) error {
appendFile, err := lock.Open(dst, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644) appendFile, err := lock.Open(dst, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644)
if err != nil { if err != nil {
return err return err

@ -61,7 +61,7 @@ func TestAppendFile(t *testing.T) {
f.WriteString("bbbbbbbbbb") f.WriteString("bbbbbbbbbb")
f.Close() f.Close()
if err = AppendFile(name1, name2); err != nil { if err = AppendFile(name1, name2, false); err != nil {
t.Error(err) t.Error(err)
} }

Loading…
Cancel
Save