diff --git a/internal/utils/fs/limiter.go b/internal/utils/fs/limiter.go index 040bb8b..c08bfd6 100644 --- a/internal/utils/fs/limiter.go +++ b/internal/utils/fs/limiter.go @@ -3,6 +3,7 @@ package fsutils import ( + "github.com/TeaOSLab/EdgeNode/internal/remotelogs" "runtime" "time" ) @@ -68,5 +69,13 @@ func (this *Limiter) TryAck() bool { } func (this *Limiter) Release() { - this.threads <- struct{}{} + select { + case this.threads <- struct{}{}: + default: + remotelogs.Error("FS_LIMITER", "Limiter Ack()/Release() should appeared as a pair") + } +} + +func (this *Limiter) FreeThreads() int { + return len(this.threads) } diff --git a/internal/utils/fs/limiter_test.go b/internal/utils/fs/limiter_test.go new file mode 100644 index 0000000..f54fd4d --- /dev/null +++ b/internal/utils/fs/limiter_test.go @@ -0,0 +1,54 @@ +// Copyright 2024 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn . + +package fsutils_test + +import ( + fsutils "github.com/TeaOSLab/EdgeNode/internal/utils/fs" + "github.com/iwind/TeaGo/assert" + "testing" +) + +func TestLimiter_Ack(t *testing.T) { + var a = assert.NewAssertion(t) + + { + var limiter = fsutils.NewLimiter(4) + a.IsTrue(limiter.FreeThreads() == 4) + limiter.Ack() + a.IsTrue(limiter.FreeThreads() == 3) + limiter.Ack() + a.IsTrue(limiter.FreeThreads() == 2) + limiter.Release() + a.IsTrue(limiter.FreeThreads() == 3) + limiter.Release() + a.IsTrue(limiter.FreeThreads() == 4) + } +} + +func TestLimiter_TryAck(t *testing.T) { + var a = assert.NewAssertion(t) + + { + var limiter = fsutils.NewLimiter(4) + var count = limiter.FreeThreads() + a.IsTrue(count == 4) + for i := 0; i < count; i++ { + limiter.Ack() + } + a.IsTrue(limiter.FreeThreads() == 0) + a.IsFalse(limiter.TryAck()) + a.IsTrue(limiter.FreeThreads() == 0) + } + + { + var limiter = fsutils.NewLimiter(4) + var count = limiter.FreeThreads() + a.IsTrue(count == 4) + for i := 0; i < count-1; i++ { + limiter.Ack() + } + a.IsTrue(limiter.FreeThreads() == 1) + a.IsTrue(limiter.TryAck()) + a.IsTrue(limiter.FreeThreads() == 0) + } +}