diff --git a/internal/utils/fs/limiter.go b/internal/utils/fs/limiter.go index c08bfd6..5206898 100644 --- a/internal/utils/fs/limiter.go +++ b/internal/utils/fs/limiter.go @@ -41,7 +41,7 @@ func (this *Limiter) Ack() { } func (this *Limiter) TryAck() bool { - const timeoutDuration = 500 * time.Millisecond + const timeoutDuration = 1 * time.Second var timeout *time.Timer select { diff --git a/internal/utils/fs/limiter_test.go b/internal/utils/fs/limiter_test.go index f54fd4d..67a1ec6 100644 --- a/internal/utils/fs/limiter_test.go +++ b/internal/utils/fs/limiter_test.go @@ -4,8 +4,10 @@ package fsutils_test import ( fsutils "github.com/TeaOSLab/EdgeNode/internal/utils/fs" + "github.com/TeaOSLab/EdgeNode/internal/utils/testutils" "github.com/iwind/TeaGo/assert" "testing" + "time" ) func TestLimiter_Ack(t *testing.T) { @@ -52,3 +54,48 @@ func TestLimiter_TryAck(t *testing.T) { a.IsTrue(limiter.FreeThreads() == 0) } } + +func TestLimiter_TryAck2(t *testing.T) { + if !testutils.IsSingleTesting() { + return + } + + var a = assert.NewAssertion(t) + + { + 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.IsFalse(limiter.TryAck()) + a.IsFalse(limiter.TryAck()) + + limiter.Release() + a.IsTrue(limiter.TryAck()) + } +} + +func TestLimiter_Timout(t *testing.T) { + var timeout = time.NewTimer(100 * time.Millisecond) + + var r = make(chan bool, 1) + r <- true + + var before = time.Now() + select { + case <-r: + case <-timeout.C: + } + t.Log(time.Since(before).Seconds()*1000, "ms") + + timeout.Stop() + + before = time.Now() + timeout.Reset(100 * time.Millisecond) + <-timeout.C + t.Log(time.Since(before).Seconds()*1000, "ms") +} diff --git a/internal/utils/fs/os.go b/internal/utils/fs/os.go index bc4e0f6..51da4fe 100644 --- a/internal/utils/fs/os.go +++ b/internal/utils/fs/os.go @@ -26,6 +26,8 @@ func ReadFile(filename string) (data []byte, err error) { } func WriteFile(filename string, data []byte, perm os.FileMode) (err error) { + WriterLimiter.Ack() err = os.WriteFile(filename, data, perm) + WriterLimiter.Release() return }