diff options
Diffstat (limited to 'weed/storage/backend/disk_file.go')
| -rw-r--r-- | weed/storage/backend/disk_file.go | 40 |
1 files changed, 38 insertions, 2 deletions
diff --git a/weed/storage/backend/disk_file.go b/weed/storage/backend/disk_file.go index 2b04c8df2..aee02e7be 100644 --- a/weed/storage/backend/disk_file.go +++ b/weed/storage/backend/disk_file.go @@ -1,6 +1,8 @@ package backend import ( + "github.com/chrislusf/seaweedfs/weed/glog" + "github.com/chrislusf/seaweedfs/weed/util/buffered_writer" "os" "time" ) @@ -12,32 +14,64 @@ var ( type DiskFile struct { File *os.File fullFilePath string + bufWriterAt *buffered_writer.TimedWriteBuffer + fileSize int64 + modTime time.Time } func NewDiskFile(f *os.File) *DiskFile { + stat, e := f.Stat() + if e != nil { + glog.Fatalf("stat file %s: %v", f.Name(), e) + } + return &DiskFile{ fullFilePath: f.Name(), File: f, + bufWriterAt: buffered_writer.NewTimedWriteBuffer(f, 1*1024*1024, 200*time.Millisecond, stat.Size()), + fileSize: stat.Size(), + modTime: stat.ModTime(), } } func (df *DiskFile) ReadAt(p []byte, off int64) (n int, err error) { + n, _ = df.bufWriterAt.ReadAt(p, off) + if len(p) == n { + return + } return df.File.ReadAt(p, off) } func (df *DiskFile) WriteAt(p []byte, off int64) (n int, err error) { - return df.File.WriteAt(p, off) + n, err = df.bufWriterAt.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 { + df.bufWriterAt.Close() return df.File.Close() } 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 +84,7 @@ func (df *DiskFile) Name() string { } func (df *DiskFile) Sync() error { + df.fileSize = 0 + df.bufWriterAt.Flush() return df.File.Sync() } |
