diff --git a/internal/caches/open_file.go b/internal/caches/open_file.go index 09fbb6b..e4f884c 100644 --- a/internal/caches/open_file.go +++ b/internal/caches/open_file.go @@ -14,11 +14,12 @@ type OpenFile struct { 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{ - fp: fp, - meta: meta, - header: header, + fp: fp, + meta: meta, + header: header, + version: version, } } diff --git a/internal/caches/open_file_cache.go b/internal/caches/open_file_cache.go index b01cab7..5fa7de7 100644 --- a/internal/caches/open_file_cache.go +++ b/internal/caches/open_file_cache.go @@ -77,6 +77,7 @@ func (this *OpenFileCache) Put(filename string, file *OpenFile) { } else { _ = this.watcher.Add(filename) pool = NewOpenFilePool(filename) + pool.version = file.version this.poolMap[filename] = pool success = pool.Put(file) } diff --git a/internal/caches/open_file_pool.go b/internal/caches/open_file_pool.go index ba83546..582f92b 100644 --- a/internal/caches/open_file_pool.go +++ b/internal/caches/open_file_pool.go @@ -45,7 +45,7 @@ func (this *OpenFilePool) Get() (*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() return false } diff --git a/internal/caches/reader_file.go b/internal/caches/reader_file.go index 9bdb44c..0b13a0b 100644 --- a/internal/caches/reader_file.go +++ b/internal/caches/reader_file.go @@ -348,7 +348,7 @@ func (this *FileReader) Close() error { if this.openFile != nil { this.openFileCache.Put(this.fp.Name(), this.openFile) } 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 } @@ -367,5 +367,12 @@ func (this *FileReader) readToBuff(fp *os.File, buf []byte) (ok bool, err error) func (this *FileReader) discard() error { _ = this.fp.Close() 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()) } diff --git a/internal/caches/storage_file.go b/internal/caches/storage_file.go index 8f78c57..83d8e0d 100644 --- a/internal/caches/storage_file.go +++ b/internal/caches/storage_file.go @@ -446,6 +446,13 @@ func (this *FileStorage) OpenWriter(key string, expiredAt int64, status int, siz // 检查缓存是否已经生成 var cachePathName = dir + "/" + hash var cachePath = cachePathName + ".cache" + + // 关闭OpenFileCache + var openFileCache = this.openFileCache + if openFileCache != nil { + openFileCache.Close(cachePath) + } + stat, err := os.Stat(cachePath) if err == nil && time.Now().Sub(stat.ModTime()) <= 1*time.Second { // 防止并发连续写入 @@ -785,8 +792,9 @@ func (this *FileStorage) Stop() { _ = this.list.Close() - if this.openFileCache != nil { - this.openFileCache.CloseAll() + var openFileCache = this.openFileCache + if openFileCache != nil { + openFileCache.CloseAll() } this.ignoreKeys.Reset() @@ -1178,12 +1186,21 @@ func (this *FileStorage) increaseHit(key string, hash string, reader Reader) { // 删除缓存文件 func (this *FileStorage) removeCacheFile(path string) error { + var openFileCache = this.openFileCache + if openFileCache != nil { + openFileCache.Close(path) + } + var err = os.Remove(path) if err == nil || os.IsNotExist(err) { err = nil // 删除Partial相关 - _ = os.Remove(partialRangesFilePath(path)) + var partialPath = partialRangesFilePath(path) + if openFileCache != nil { + openFileCache.Close(partialPath) + } + _ = os.Remove(partialPath) } return err }