diff --git a/internal/caches/open_file_cache.go b/internal/caches/open_file_cache.go index 11ac41d..54a0134 100644 --- a/internal/caches/open_file_cache.go +++ b/internal/caches/open_file_cache.go @@ -62,6 +62,9 @@ func (this *OpenFileCache) Get(filename string) *OpenFile { if consumed { this.locker.Lock() this.count-- + + // pool如果为空,也不需要从列表中删除,避免put时需要重新创建 + this.locker.Unlock() } return file @@ -148,6 +151,7 @@ func (this *OpenFileCache) CloseAll() { this.poolMap = map[string]*OpenFilePool{} this.poolList.Reset() _ = this.watcher.Close() + this.count = 0 this.locker.Unlock() } diff --git a/internal/caches/open_file_cache_test.go b/internal/caches/open_file_cache_test.go new file mode 100644 index 0000000..c2e8a5a --- /dev/null +++ b/internal/caches/open_file_cache_test.go @@ -0,0 +1,43 @@ +// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . + +package caches_test + +import ( + "github.com/TeaOSLab/EdgeNode/internal/caches" + "testing" + "time" +) + +func TestNewOpenFileCache_Close(t *testing.T) { + cache, err := caches.NewOpenFileCache(1024) + if err != nil { + t.Fatal(err) + } + cache.Debug() + cache.Put("a.txt", caches.NewOpenFile(nil, nil, nil, 0)) + cache.Put("b.txt", caches.NewOpenFile(nil, nil, nil, 0)) + cache.Put("b.txt", caches.NewOpenFile(nil, nil, nil, 0)) + cache.Put("b.txt", caches.NewOpenFile(nil, nil, nil, 0)) + cache.Put("c.txt", caches.NewOpenFile(nil, nil, nil, 0)) + cache.Get("b.txt") + cache.Get("d.txt") + cache.Close("a.txt") + + time.Sleep(100 * time.Second) +} + +func TestNewOpenFileCache_CloseAll(t *testing.T) { + cache, err := caches.NewOpenFileCache(1024) + if err != nil { + t.Fatal(err) + } + cache.Debug() + cache.Put("a.txt", caches.NewOpenFile(nil, nil, nil, 0)) + cache.Put("b.txt", caches.NewOpenFile(nil, nil, nil, 0)) + cache.Put("c.txt", caches.NewOpenFile(nil, nil, nil, 0)) + cache.Get("b.txt") + cache.Get("d.txt") + cache.CloseAll() + + time.Sleep(6 * time.Second) +} diff --git a/internal/caches/open_file_pool_test.go b/internal/caches/open_file_pool_test.go index b27662f..ca7f8bd 100644 --- a/internal/caches/open_file_pool_test.go +++ b/internal/caches/open_file_pool_test.go @@ -4,6 +4,8 @@ package caches_test import ( "github.com/TeaOSLab/EdgeNode/internal/caches" + "github.com/iwind/TeaGo/rands" + "sync" "testing" ) @@ -15,3 +17,30 @@ func TestOpenFilePool_Get(t *testing.T) { t.Log(pool.Get()) t.Log(pool.Get()) } + +func TestOpenFilePool_Close(t *testing.T) { + var pool = caches.NewOpenFilePool("a") + pool.Put(caches.NewOpenFile(nil, nil, nil, 0)) + pool.Put(caches.NewOpenFile(nil, nil, nil, 0)) + pool.Close() +} + +func TestOpenFilePool_Concurrent(t *testing.T) { + var pool = caches.NewOpenFilePool("a") + var concurrent = 1000 + var wg = &sync.WaitGroup{} + wg.Add(concurrent) + for i := 0; i < concurrent; i++ { + go func() { + defer wg.Done() + + if rands.Int(0, 1) == 1 { + pool.Put(caches.NewOpenFile(nil, nil, nil, 0)) + } + if rands.Int(0, 1) == 0 { + pool.Get() + } + }() + } + wg.Wait() +}