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
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()
|
|
}
|