diff options
| author | Chris Lu <chris.lu@gmail.com> | 2021-02-18 23:22:54 -0800 |
|---|---|---|
| committer | Chris Lu <chris.lu@gmail.com> | 2021-02-18 23:22:54 -0800 |
| commit | c78409a5983145784d128c86541c6715dad3a937 (patch) | |
| tree | c6e28a105ca9a0a30d24029ae354836fc1b5358d /weed/storage/backend/disk_file.go | |
| parent | 29575dadc54b2e3780073f8b86f110d7cb7c1f20 (diff) | |
| download | seaweedfs-c78409a5983145784d128c86541c6715dad3a937.tar.xz seaweedfs-c78409a5983145784d128c86541c6715dad3a937.zip | |
volume: avoid file.stat(), file.seek() if possible during writes
Diffstat (limited to 'weed/storage/backend/disk_file.go')
| -rw-r--r-- | weed/storage/backend/disk_file.go | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/weed/storage/backend/disk_file.go b/weed/storage/backend/disk_file.go index 2b04c8df2..6a42ad8e7 100644 --- a/weed/storage/backend/disk_file.go +++ b/weed/storage/backend/disk_file.go @@ -12,6 +12,8 @@ var ( type DiskFile struct { File *os.File fullFilePath string + fileSize int64 + modTime time.Time } func NewDiskFile(f *os.File) *DiskFile { @@ -26,11 +28,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,6 +53,9 @@ func (df *DiskFile) Close() error { } func (df *DiskFile) GetStat() (datSize int64, modTime time.Time, err error) { + if df.fileSize != 0 { + return df.fileSize, df.modTime, nil + } stat, e := df.File.Stat() if e == nil { return stat.Size(), stat.ModTime(), nil @@ -50,5 +68,6 @@ func (df *DiskFile) Name() string { } func (df *DiskFile) Sync() error { + df.fileSize = 0 return df.File.Sync() } |
