修复OpenFileCache可能无法更新的Bug

This commit is contained in:
GoEdgeLab
2022-03-31 11:47:31 +08:00
parent 3ee45c8380
commit 8985e7d79c
5 changed files with 35 additions and 9 deletions

View File

@@ -14,11 +14,12 @@ type OpenFile struct {
version int64 version int64
} }
func NewOpenFile(fp *os.File, meta []byte, header []byte) *OpenFile { func NewOpenFile(fp *os.File, meta []byte, header []byte, version int64) *OpenFile {
return &OpenFile{ return &OpenFile{
fp: fp, fp: fp,
meta: meta, meta: meta,
header: header, header: header,
version: version,
} }
} }

View File

@@ -77,6 +77,7 @@ func (this *OpenFileCache) Put(filename string, file *OpenFile) {
} else { } else {
_ = this.watcher.Add(filename) _ = this.watcher.Add(filename)
pool = NewOpenFilePool(filename) pool = NewOpenFilePool(filename)
pool.version = file.version
this.poolMap[filename] = pool this.poolMap[filename] = pool
success = pool.Put(file) success = pool.Put(file)
} }

View File

@@ -45,7 +45,7 @@ func (this *OpenFilePool) Get() (*OpenFile, bool) {
} }
func (this *OpenFilePool) Put(file *OpenFile) bool { func (this *OpenFilePool) Put(file *OpenFile) bool {
if file.version > 0 && file.version != this.version { if this.version > 0 && file.version > 0 && file.version != this.version {
_ = file.Close() _ = file.Close()
return false return false
} }

View File

@@ -348,7 +348,7 @@ func (this *FileReader) Close() error {
if this.openFile != nil { if this.openFile != nil {
this.openFileCache.Put(this.fp.Name(), this.openFile) this.openFileCache.Put(this.fp.Name(), this.openFile)
} else { } else {
this.openFileCache.Put(this.fp.Name(), NewOpenFile(this.fp, this.meta, this.header)) this.openFileCache.Put(this.fp.Name(), NewOpenFile(this.fp, this.meta, this.header, this.LastModified()))
} }
return nil return nil
} }
@@ -367,5 +367,12 @@ func (this *FileReader) readToBuff(fp *os.File, buf []byte) (ok bool, err error)
func (this *FileReader) discard() error { func (this *FileReader) discard() error {
_ = this.fp.Close() _ = this.fp.Close()
this.isClosed = true this.isClosed = true
// close open file cache
if this.openFileCache != nil {
this.openFileCache.Close(this.fp.Name())
}
// remove file
return os.Remove(this.fp.Name()) return os.Remove(this.fp.Name())
} }

View File

@@ -446,6 +446,13 @@ func (this *FileStorage) OpenWriter(key string, expiredAt int64, status int, siz
// 检查缓存是否已经生成 // 检查缓存是否已经生成
var cachePathName = dir + "/" + hash var cachePathName = dir + "/" + hash
var cachePath = cachePathName + ".cache" var cachePath = cachePathName + ".cache"
// 关闭OpenFileCache
var openFileCache = this.openFileCache
if openFileCache != nil {
openFileCache.Close(cachePath)
}
stat, err := os.Stat(cachePath) stat, err := os.Stat(cachePath)
if err == nil && time.Now().Sub(stat.ModTime()) <= 1*time.Second { if err == nil && time.Now().Sub(stat.ModTime()) <= 1*time.Second {
// 防止并发连续写入 // 防止并发连续写入
@@ -785,8 +792,9 @@ func (this *FileStorage) Stop() {
_ = this.list.Close() _ = this.list.Close()
if this.openFileCache != nil { var openFileCache = this.openFileCache
this.openFileCache.CloseAll() if openFileCache != nil {
openFileCache.CloseAll()
} }
this.ignoreKeys.Reset() this.ignoreKeys.Reset()
@@ -1178,12 +1186,21 @@ func (this *FileStorage) increaseHit(key string, hash string, reader Reader) {
// 删除缓存文件 // 删除缓存文件
func (this *FileStorage) removeCacheFile(path string) error { func (this *FileStorage) removeCacheFile(path string) error {
var openFileCache = this.openFileCache
if openFileCache != nil {
openFileCache.Close(path)
}
var err = os.Remove(path) var err = os.Remove(path)
if err == nil || os.IsNotExist(err) { if err == nil || os.IsNotExist(err) {
err = nil err = nil
// 删除Partial相关 // 删除Partial相关
_ = os.Remove(partialRangesFilePath(path)) var partialPath = partialRangesFilePath(path)
if openFileCache != nil {
openFileCache.Close(partialPath)
}
_ = os.Remove(partialPath)
} }
return err return err
} }