aboutsummaryrefslogtreecommitdiff
path: root/weed/storage/backend/disk_file.go
diff options
context:
space:
mode:
Diffstat (limited to 'weed/storage/backend/disk_file.go')
-rw-r--r--weed/storage/backend/disk_file.go40
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()
}