Skip to content

Commit fe6e5ba

Browse files
committed
优化并发读写限制
1 parent 406d5de commit fe6e5ba

File tree

5 files changed

+59
-8
lines changed

5 files changed

+59
-8
lines changed

internal/caches/reader_file.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -314,8 +314,9 @@ func (this *FileReader) ReadBodyRange(buf []byte, start int64, end int64, callba
314314
}
315315

316316
for {
317+
var n int
317318
fsutils.ReaderLimiter.Ack()
318-
n, err := this.fp.Read(buf)
319+
n, err = this.fp.Read(buf)
319320
fsutils.ReaderLimiter.Release()
320321
if n > 0 {
321322
var n2 = int(end-offset) + 1

internal/caches/storage_file.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,7 @@ func (this *FileStorage) openReader(key string, allowMemory bool, useStale bool,
380380

381381
// 检查文件记录是否已过期
382382
var estimatedSize int64
383+
var existInList bool
383384
if !useStale {
384385
exists, filesize, err := this.list.Exist(hash)
385386
if err != nil {
@@ -389,6 +390,7 @@ func (this *FileStorage) openReader(key string, allowMemory bool, useStale bool,
389390
return nil, ErrNotFound
390391
}
391392
estimatedSize = filesize
393+
existInList = true
392394
}
393395

394396
// 尝试通过MMAP读取
@@ -412,7 +414,13 @@ func (this *FileStorage) openReader(key string, allowMemory bool, useStale bool,
412414

413415
var err error
414416
if openFile == nil {
417+
if existInList {
418+
fsutils.ReaderLimiter.Ack()
419+
}
415420
fp, err = os.OpenFile(path, os.O_RDONLY, 0444)
421+
if existInList {
422+
fsutils.ReaderLimiter.Release()
423+
}
416424
if err != nil {
417425
if !os.IsNotExist(err) {
418426
return nil, err
@@ -583,7 +591,7 @@ func (this *FileStorage) openWriter(key string, expiredAt int64, status int, hea
583591
// 数据库中是否存在
584592
existsCacheItem, _, _ := this.list.Exist(hash)
585593
if existsCacheItem {
586-
readerFp, err := os.OpenFile(tmpPath, os.O_RDONLY, 0444)
594+
readerFp, err := fsutils.OpenFile(tmpPath, os.O_RDONLY, 0444)
587595
if err == nil {
588596
var partialReader = NewPartialFileReader(readerFp)
589597
err = partialReader.Init()
@@ -616,8 +624,10 @@ func (this *FileStorage) openWriter(key string, expiredAt int64, status int, hea
616624
if isNewCreated && existsFile {
617625
flags |= os.O_TRUNC
618626
}
619-
if !isFlushing && !fsutils.WriterLimiter.TryAck() {
620-
return nil, ErrServerIsBusy
627+
if !isFlushing {
628+
if !fsutils.WriterLimiter.TryAck() {
629+
return nil, ErrServerIsBusy
630+
}
621631
}
622632
writer, err := os.OpenFile(tmpPath, flags, 0666)
623633
if !isFlushing {

internal/utils/fs/limiter.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ import (
88
)
99

1010
var maxThreads = runtime.NumCPU()
11-
var WriterLimiter = NewLimiter(max(maxThreads, 4))
12-
var ReaderLimiter = NewLimiter(max(maxThreads*2, 8))
11+
var WriterLimiter = NewLimiter(max(maxThreads, 8))
12+
var ReaderLimiter = NewLimiter(max(maxThreads, 8))
1313

1414
type Limiter struct {
1515
threads chan struct{}
@@ -60,7 +60,7 @@ func (this *Limiter) Ack() {
6060
}
6161

6262
func (this *Limiter) TryAck() bool {
63-
const timeoutDuration = 1 * time.Second
63+
const timeoutDuration = 500 * time.Millisecond
6464

6565
var timeout *time.Timer
6666
select {

internal/utils/fs/os.go

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
package fsutils
44

5-
import "os"
5+
import (
6+
"os"
7+
)
68

79
func Remove(filename string) (err error) {
810
WriterLimiter.Ack()
@@ -31,3 +33,24 @@ func WriteFile(filename string, data []byte, perm os.FileMode) (err error) {
3133
WriterLimiter.Release()
3234
return
3335
}
36+
37+
func OpenFile(name string, flag int, perm os.FileMode) (f *os.File, err error) {
38+
if flag&os.O_RDONLY == os.O_RDONLY {
39+
ReaderLimiter.Ack()
40+
}
41+
42+
f, err = os.OpenFile(name, flag, perm)
43+
44+
if flag&os.O_RDONLY == os.O_RDONLY {
45+
ReaderLimiter.Release()
46+
}
47+
48+
return
49+
}
50+
51+
func Open(name string) (f *os.File, err error) {
52+
ReaderLimiter.Ack()
53+
f, err = os.Open(name)
54+
ReaderLimiter.Release()
55+
return
56+
}

internal/utils/fs/os_test.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// Copyright 2024 GoEdge CDN [email protected]. All rights reserved. Official site: https://goedge.cn .
2+
3+
package fsutils_test
4+
5+
import (
6+
fsutils "github.com/TeaOSLab/EdgeNode/internal/utils/fs"
7+
"os"
8+
"testing"
9+
)
10+
11+
func TestOpenFile(t *testing.T) {
12+
f, err := fsutils.OpenFile("./os_test.go", os.O_RDONLY, 0444)
13+
if err != nil {
14+
t.Fatal(err)
15+
}
16+
_ = f.Close()
17+
}

0 commit comments

Comments
 (0)