aboutsummaryrefslogtreecommitdiff
path: root/weed/storage/backend/disk_file.go
diff options
context:
space:
mode:
authorbingoohuang <bingoo.huang@gmail.com>2021-04-26 17:19:35 +0800
committerbingoohuang <bingoo.huang@gmail.com>2021-04-26 17:19:35 +0800
commitd861cbd81b75b6684c971ac00e33685e6575b833 (patch)
tree301805fef4aa5d0096bfb1510536f7a009b661e7 /weed/storage/backend/disk_file.go
parent70da715d8d917527291b35fb069fac077d17b868 (diff)
parent4ee58922eff61a5a4ca29c0b4829b097a498549e (diff)
downloadseaweedfs-d861cbd81b75b6684c971ac00e33685e6575b833.tar.xz
seaweedfs-d861cbd81b75b6684c971ac00e33685e6575b833.zip
Merge branch 'master' of https://github.com/bingoohuang/seaweedfs
Diffstat (limited to 'weed/storage/backend/disk_file.go')
-rw-r--r--weed/storage/backend/disk_file.go46
1 files changed, 39 insertions, 7 deletions
diff --git a/weed/storage/backend/disk_file.go b/weed/storage/backend/disk_file.go
index c4b3caffb..3b42429cf 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/storage/types"
"os"
"time"
)
@@ -12,12 +14,25 @@ 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)
+ }
+ offset := stat.Size()
+ if offset%NeedlePaddingSize != 0 {
+ offset = offset + (NeedlePaddingSize - offset%NeedlePaddingSize)
+ }
+
return &DiskFile{
fullFilePath: f.Name(),
File: f,
+ fileSize: offset,
+ modTime: stat.ModTime(),
}
}
@@ -26,11 +41,28 @@ 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) Write(p []byte) (n int, err error) {
+ return df.WriteAt(p, df.fileSize)
}
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,13 +70,13 @@ 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 {
return df.fullFilePath
}
+
+func (df *DiskFile) Sync() error {
+ return df.File.Sync()
+}