aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2021-02-18 23:22:54 -0800
committerChris Lu <chris.lu@gmail.com>2021-02-18 23:22:54 -0800
commitc78409a5983145784d128c86541c6715dad3a937 (patch)
treec6e28a105ca9a0a30d24029ae354836fc1b5358d
parent29575dadc54b2e3780073f8b86f110d7cb7c1f20 (diff)
downloadseaweedfs-c78409a5983145784d128c86541c6715dad3a937.tar.xz
seaweedfs-c78409a5983145784d128c86541c6715dad3a937.zip
volume: avoid file.stat(), file.seek() if possible during writes
-rw-r--r--weed/storage/backend/disk_file.go23
-rw-r--r--weed/storage/needle_map.go16
2 files changed, 33 insertions, 6 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()
}
diff --git a/weed/storage/needle_map.go b/weed/storage/needle_map.go
index 5b41286ea..f12198c57 100644
--- a/weed/storage/needle_map.go
+++ b/weed/storage/needle_map.go
@@ -41,6 +41,7 @@ type baseNeedleMapper struct {
indexFile *os.File
indexFileAccessLock sync.Mutex
+ indexFileOffset int64
}
func (nm *baseNeedleMapper) IndexFileSize() uint64 {
@@ -56,11 +57,18 @@ func (nm *baseNeedleMapper) appendToIndexFile(key NeedleId, offset Offset, size
nm.indexFileAccessLock.Lock()
defer nm.indexFileAccessLock.Unlock()
- if _, err := nm.indexFile.Seek(0, 2); err != nil {
- return fmt.Errorf("cannot seek end of indexfile %s: %v",
- nm.indexFile.Name(), err)
+ if nm.indexFileOffset == 0 {
+ if fileSize, err := nm.indexFile.Seek(0, 2); err != nil {
+ return fmt.Errorf("cannot seek end of indexfile %s: %v",
+ nm.indexFile.Name(), err)
+ } else {
+ nm.indexFileOffset = fileSize
+ }
+ }
+ written, err := nm.indexFile.WriteAt(bytes, nm.indexFileOffset)
+ if err == nil {
+ nm.indexFileOffset += int64(written)
}
- _, err := nm.indexFile.Write(bytes)
return err
}