You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

90 lines
1.8 KiB

package backend
import (
"github.com/chrislusf/seaweedfs/weed/glog"
"github.com/chrislusf/seaweedfs/weed/util/buffered_writer"
"os"
"time"
)
var (
_ BackendStorageFile = &DiskFile{}
)
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) {
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 {
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
}
return 0, time.Time{}, err
}
func (df *DiskFile) Name() string {
return df.fullFilePath
}
func (df *DiskFile) Sync() error {
df.fileSize = 0
df.bufWriterAt.Flush()
return df.File.Sync()
}