diff options
| author | Chris Lu <chris.lu@gmail.com> | 2021-02-20 09:44:17 -0800 |
|---|---|---|
| committer | Chris Lu <chris.lu@gmail.com> | 2021-02-20 09:44:17 -0800 |
| commit | 98c93ca46587795fa03a0c52bea5be31a886be87 (patch) | |
| tree | 649b70ed9a7c853e22d9e413e38b2faa53b08678 | |
| parent | 565f7a6e724cf2dca401bd699a65f5814606ebfe (diff) | |
| download | seaweedfs-98c93ca46587795fa03a0c52bea5be31a886be87.tar.xz seaweedfs-98c93ca46587795fa03a0c52bea5be31a886be87.zip | |
avoid file.Stat()
avoid one Syscall, but did not help on performance though
| -rw-r--r-- | weed/storage/backend/disk_file.go | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/weed/storage/backend/disk_file.go b/weed/storage/backend/disk_file.go index 2b04c8df2..161f4ca83 100644 --- a/weed/storage/backend/disk_file.go +++ b/weed/storage/backend/disk_file.go @@ -1,6 +1,7 @@ package backend import ( + "github.com/chrislusf/seaweedfs/weed/glog" "os" "time" ) @@ -12,12 +13,21 @@ var ( type DiskFile struct { File *os.File fullFilePath string + fileSize int64 + modTime time.Time } func NewDiskFile(f *os.File) *DiskFile { + stat, err := f.Stat() + if err != nil { + glog.Fatalf("stat file %s: %v", f.Name(), err) + } + return &DiskFile{ fullFilePath: f.Name(), File: f, + fileSize: stat.Size(), + modTime: stat.ModTime(), } } @@ -26,11 +36,24 @@ func (df *DiskFile) ReadAt(p []byte, off int64) (n int, err error) { } func (df *DiskFile) WriteAt(p []byte, off int64) (n int, err error) { - return df.File.WriteAt(p, off) + n, err = df.File.WriteAt(p, off) + if err == nil { + waterMark := off + int64(n) + if waterMark > df.fileSize { + df.fileSize = waterMark + df.modTime = time.Now() + } + } + return } func (df *DiskFile) Truncate(off int64) error { - return df.File.Truncate(off) + err := df.File.Truncate(off) + if err == nil { + df.fileSize = off + df.modTime = time.Now() + } + return err } func (df *DiskFile) Close() error { @@ -38,11 +61,7 @@ func (df *DiskFile) Close() error { } func (df *DiskFile) GetStat() (datSize int64, modTime time.Time, err error) { - stat, e := df.File.Stat() - if e == nil { - return stat.Size(), stat.ModTime(), nil - } - return 0, time.Time{}, err + return df.fileSize, df.modTime, nil } func (df *DiskFile) Name() string { |
