|
|
|
@@ -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 { |
|
|
|
|