From 87bc1a7e03f761f13ad55d5f79c4c45ae1ea504e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=A5=A5=E8=B6=85?= Date: Mon, 5 Dec 2022 11:16:04 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96OpenFileCache?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/caches/open_file_cache.go | 3 +++ internal/caches/open_file_pool.go | 23 +++++++++++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/internal/caches/open_file_cache.go b/internal/caches/open_file_cache.go index 54a0134..0d932d0 100644 --- a/internal/caches/open_file_cache.go +++ b/internal/caches/open_file_cache.go @@ -129,6 +129,9 @@ func (this *OpenFileCache) Close(filename string) { pool, ok := this.poolMap[filename] if ok { + // 设置关闭状态 + pool.SetClosing() + delete(this.poolMap, filename) this.poolList.Remove(pool.linkItem) _ = this.watcher.Remove(filename) diff --git a/internal/caches/open_file_pool.go b/internal/caches/open_file_pool.go index 0ac2505..bf71d9c 100644 --- a/internal/caches/open_file_pool.go +++ b/internal/caches/open_file_pool.go @@ -12,6 +12,7 @@ type OpenFilePool struct { linkItem *linkedlist.Item filename string version int64 + isClosed bool } func NewOpenFilePool(filename string) *OpenFilePool { @@ -29,6 +30,11 @@ func (this *OpenFilePool) Filename() string { } func (this *OpenFilePool) Get() (*OpenFile, bool) { + // 如果已经关闭,直接返回 + if this.isClosed { + return nil, false + } + select { case file := <-this.c: if file != nil { @@ -48,10 +54,19 @@ func (this *OpenFilePool) Get() (*OpenFile, bool) { } func (this *OpenFilePool) Put(file *OpenFile) bool { + // 如果已关闭,则不接受新的文件 + if this.isClosed { + _ = file.Close() + return false + } + + // 检查文件版本号 if this.version > 0 && file.version > 0 && file.version != this.version { _ = file.Close() return false } + + // 加入Pool select { case this.c <- file: return true @@ -66,14 +81,18 @@ func (this *OpenFilePool) Len() int { return len(this.c) } +func (this *OpenFilePool) SetClosing() { + this.isClosed = true +} + func (this *OpenFilePool) Close() { -Loop: + this.isClosed = true for { select { case file := <-this.c: _ = file.Close() default: - break Loop + return } } }