diff --git a/cmd/disk-cache-check-support_other.go b/cmd/disk-cache-check-support_other.go new file mode 100644 index 000000000..f28b09cc3 --- /dev/null +++ b/cmd/disk-cache-check-support_other.go @@ -0,0 +1,56 @@ +// +build !windows + +/* + * MinIO Cloud Storage, (C) 2019-2020 MinIO, 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. + */ + +package cmd + +import ( + "errors" + "io" + "io/ioutil" + "os" + "time" + + "github.com/djherbis/atime" +) + +// Return error if Atime is disabled on the O/S +func checkAtimeSupport(dir string) (err error) { + file, err := ioutil.TempFile(dir, "prefix") + if err != nil { + return + } + defer os.Remove(file.Name()) + defer file.Close() + finfo1, err := os.Stat(file.Name()) + if err != nil { + return + } + // add a sleep to ensure atime change is detected + time.Sleep(10 * time.Millisecond) + + if _, err = io.Copy(ioutil.Discard, file); err != nil { + return + } + + finfo2, err := os.Stat(file.Name()) + + if atime.Get(finfo2).Equal(atime.Get(finfo1)) { + return errors.New("Atime not supported") + } + return +} diff --git a/cmd/disk-cache-check-support_windows.go b/cmd/disk-cache-check-support_windows.go new file mode 100644 index 000000000..bf8ac21c7 --- /dev/null +++ b/cmd/disk-cache-check-support_windows.go @@ -0,0 +1,60 @@ +// +build windows + +/* + * MinIO Cloud Storage, (C) 2019-2020 MinIO, 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. + */ + +package cmd + +import ( + "errors" + "io/ioutil" + "os" + + "github.com/djherbis/atime" + "golang.org/x/sys/windows/registry" +) + +// Return error if Atime is disabled on the O/S +func checkAtimeSupport(dir string) (err error) { + file, err := ioutil.TempFile(dir, "prefix") + if err != nil { + return + } + defer os.Remove(file.Name()) + defer file.Close() + finfo1, err := os.Stat(file.Name()) + if err != nil { + return + } + atime.Get(finfo1) + + k, err := registry.OpenKey(registry.LOCAL_MACHINE, `SYSTEM\CurrentControlSet\Control\FileSystem`, registry.QUERY_VALUE) + if err != nil { + return + } + defer k.Close() + + setting, _, err := k.GetIntegerValue("NtfsDisableLastAccessUpdate") + if err != nil { + return + } + + lowSetting := setting & 0xFFFF + if lowSetting != uint64(0x0000) && lowSetting != uint64(0x0002) { + return errors.New("Atime not supported") + } + return +} diff --git a/cmd/disk-cache.go b/cmd/disk-cache.go index 7c407ec83..742d357e9 100644 --- a/cmd/disk-cache.go +++ b/cmd/disk-cache.go @@ -21,14 +21,11 @@ import ( "errors" "fmt" "io" - "io/ioutil" "net/http" - "os" "strings" "sync" "time" - "github.com/djherbis/atime" "github.com/minio/minio/cmd/config/cache" "github.com/minio/minio/cmd/logger" objectlock "github.com/minio/minio/pkg/bucket/object/lock" @@ -538,31 +535,6 @@ func newCache(config cache.Config) ([]*diskCache, bool, error) { return caches, migrating, nil } -// Return error if Atime is disabled on the O/S -func checkAtimeSupport(dir string) (err error) { - file, err := ioutil.TempFile(dir, "prefix") - if err != nil { - return - } - defer os.Remove(file.Name()) - finfo1, err := os.Stat(file.Name()) - if err != nil { - return - } - // add a sleep to ensure atime change is detected - time.Sleep(10 * time.Millisecond) - - if _, err = io.Copy(ioutil.Discard, file); err != nil { - return - } - - finfo2, err := os.Stat(file.Name()) - - if atime.Get(finfo2).Equal(atime.Get(finfo1)) { - return errors.New("Atime not supported") - } - return -} func (c *cacheObjects) migrateCacheFromV1toV2(ctx context.Context) { logStartupMessage(color.Blue("Cache migration initiated ...."))