Browse Source

优化写入性能

gitlink
Sydonian 1 year ago
parent
commit
191a067d09
3 changed files with 31 additions and 34 deletions
  1. +2
    -2
      client2/internal/mount/vfs/cache/cache.go
  2. +20
    -23
      client2/internal/mount/vfs/cache/file.go
  3. +9
    -9
      client2/internal/mount/vfs/fuse_file.go

+ 2
- 2
client2/internal/mount/vfs/cache/cache.go View File

@@ -406,7 +406,7 @@ type uploadingPackage struct {
type uploadingObject struct {
pathComps []string
cache *CacheFile
reader *CacheFileReadWriter
reader *CacheFileHandle
isDeleted bool
isSuccess bool
}
@@ -646,7 +646,7 @@ func (c *Cache) doUploading(pkgs []*uploadingPackage) {
}

type cacheFileReader struct {
rw *CacheFileReadWriter
rw *CacheFileHandle
pos int64
}



+ 20
- 23
client2/internal/mount/vfs/cache/file.go View File

@@ -83,8 +83,8 @@ type CacheFile struct {
info FileInfo
remoteObj *cdssdk.Object
rwLock *sync.RWMutex
readers []*CacheFileReadWriter
writers []*CacheFileReadWriter
readers []*CacheFileHandle
writers []*CacheFileHandle
saveMetaChan chan any
noSaveMeta bool // 防止在Unload之后又保存了文件
isDeleted bool
@@ -316,7 +316,7 @@ func (f *CacheFile) Unload() {

if !f.isDeleted {
// TODO 日志
f.saveMeta()
f.saveMeta(f.info)
}

// 防止在关闭缓存后又保存了文件
@@ -397,7 +397,7 @@ func (f *CacheFile) Move(newPathComps []string) {
// 打开一个写入句柄,同时支持读取
//
// 不可在Unload状态下调用!
func (f *CacheFile) Open(flags uint32) *CacheFileReadWriter {
func (f *CacheFile) Open(flags uint32) *CacheFileHandle {
logger.Tracef("CacheFile.Open: %v, %#x", f.pathComps, flags)

f.cache.lock.Lock()
@@ -407,7 +407,7 @@ func (f *CacheFile) Open(flags uint32) *CacheFileReadWriter {
f.rwLock.Lock()
defer f.rwLock.Unlock()

h := &CacheFileReadWriter{
h := &CacheFileHandle{
file: f,
remoteLock: &sync.Mutex{},
revision: f.info.Revision,
@@ -438,13 +438,13 @@ func (f *CacheFile) Open(flags uint32) *CacheFileReadWriter {
// 打开一个读取句柄,用于同步本地文件到远端。由于此方法会在扫描缓存时调用,所以refCount增加时不需要加锁
//
// 不可在Unload状态下调用!
func (f *CacheFile) OpenReadWhenScanning() *CacheFileReadWriter {
func (f *CacheFile) OpenReadWhenScanning() *CacheFileHandle {
f.rwLock.Lock()
defer f.rwLock.Unlock()

f.state.refCount++

h := &CacheFileReadWriter{
h := &CacheFileHandle{
file: f,
remoteLock: &sync.Mutex{},
revision: f.info.Revision,
@@ -530,30 +530,29 @@ func (f *CacheFile) serving(saveMetaChan chan any) {
case <-ticker.C:
}

f.rwLock.Lock()
f.rwLock.RLock()
info := f.info.Clone()
// 如果文件已被删除,则不能再保存元数据,防止覆盖掉新创建的同名文件
if f.isDeleted {
f.rwLock.Unlock()
f.rwLock.RUnlock()
break
}

// 停止保存元数据的线程
if f.noSaveMeta {
f.rwLock.Unlock()
f.rwLock.RUnlock()
break
}
f.rwLock.RUnlock()

// TODO 错误日志
f.saveMeta()
f.saveMeta(info)
f.metaFile.Sync()

f.rwLock.Unlock()
}
}

func (f *CacheFile) saveMeta() error {
jsonData, err := serder.ObjectToJSON(f.info)
func (f *CacheFile) saveMeta(info FileInfo) error {
jsonData, err := serder.ObjectToJSON(info)
if err != nil {
return err
}
@@ -583,7 +582,7 @@ func (f *CacheFile) letSave() {
}
}

type CacheFileReadWriter struct {
type CacheFileHandle struct {
file *CacheFile
readable bool
writeable bool
@@ -592,7 +591,7 @@ type CacheFileReadWriter struct {
revision int // 打开文件时,文件的版本号
}

func (h *CacheFileReadWriter) ReadAt(buf []byte, off int64) (int, error) {
func (h *CacheFileHandle) ReadAt(buf []byte, off int64) (int, error) {
if !h.readable {
return 0, fuse.ErrPermission
}
@@ -642,8 +641,6 @@ func (h *CacheFileReadWriter) ReadAt(buf []byte, off int64) (int, error) {
return totalReadLen, fmt.Errorf("no remote file")
}

fmt.Printf("load from remote\n")

// 由于RemoteLoader的Load方法没有加锁,所以这里要加锁,防止并发Seek导致的问题
// 可以考虑在RemoteLoader里加锁,这样可以实现跨Writer共用Loader
h.remoteLock.Lock()
@@ -696,7 +693,7 @@ func (h *CacheFileReadWriter) ReadAt(buf []byte, off int64) (int, error) {
return totalReadLen, nil
}

func (h *CacheFileReadWriter) WriteAt(buf []byte, off int64) (int, error) {
func (h *CacheFileHandle) WriteAt(buf []byte, off int64) (int, error) {
if !h.writeable {
return 0, fuse.ErrPermission
}
@@ -726,11 +723,11 @@ func (h *CacheFileReadWriter) WriteAt(buf []byte, off int64) (int, error) {
return writeLen, nil
}

func (f *CacheFileReadWriter) Sync() error {
func (f *CacheFileHandle) Sync() error {
return f.file.dataFile.Sync()
}

func (f *CacheFileReadWriter) Close() error {
func (f *CacheFileHandle) Close() error {
f.Sync()

if f.remote != nil {


+ 9
- 9
client2/internal/mount/vfs/fuse_file.go View File

@@ -113,14 +113,14 @@ func (n *FuseFileNode) loadCacheFile() *cache.CacheFile {
}

type FuseFileHandle struct {
entry *FuseFileNode
readWriter *cache.CacheFileReadWriter
entry *FuseFileNode
chd *cache.CacheFileHandle
}

func newFileHandle(entry *FuseFileNode, readWriter *cache.CacheFileReadWriter) *FuseFileHandle {
func newFileHandle(entry *FuseFileNode, chd *cache.CacheFileHandle) *FuseFileHandle {
return &FuseFileHandle{
entry: entry,
readWriter: readWriter,
entry: entry,
chd: chd,
}
}

@@ -129,19 +129,19 @@ func (hd *FuseFileHandle) Entry() fuse.FsFile {
}

func (hd *FuseFileHandle) ReadAt(buf []byte, off int64) (int, error) {
return hd.readWriter.ReadAt(buf, off)
return hd.chd.ReadAt(buf, off)
}

func (hd *FuseFileHandle) WriteAt(buf []byte, off int64) (int, error) {
return hd.readWriter.WriteAt(buf, off)
return hd.chd.WriteAt(buf, off)
}

func (hd *FuseFileHandle) Sync() error {
return hd.readWriter.Sync()
return hd.chd.Sync()
}

func (hd *FuseFileHandle) Close() error {
return hd.readWriter.Close()
return hd.chd.Close()
}

func (hd *FuseFileHandle) Release() error {


Loading…
Cancel
Save