mirror of
https://github.com/TeaOSLab/EdgeNode.git
synced 2025-11-13 06:50:25 +08:00
增加内存缓存队列长度,确保不会产生不在队列里的缓存对象
This commit is contained in:
@@ -436,7 +436,7 @@ func (this *FileStorage) openWriter(key string, expiredAt int64, status int, hea
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 如果队列满了,则等待
|
// 如果队列满了,则等待
|
||||||
if err == ErrWritingQueueFull {
|
if errors.Is(err, ErrWritingQueueFull) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import (
|
|||||||
"github.com/TeaOSLab/EdgeNode/internal/utils/fasttime"
|
"github.com/TeaOSLab/EdgeNode/internal/utils/fasttime"
|
||||||
fsutils "github.com/TeaOSLab/EdgeNode/internal/utils/fs"
|
fsutils "github.com/TeaOSLab/EdgeNode/internal/utils/fs"
|
||||||
setutils "github.com/TeaOSLab/EdgeNode/internal/utils/sets"
|
setutils "github.com/TeaOSLab/EdgeNode/internal/utils/sets"
|
||||||
"github.com/TeaOSLab/EdgeNode/internal/utils/sizes"
|
|
||||||
"github.com/TeaOSLab/EdgeNode/internal/zero"
|
"github.com/TeaOSLab/EdgeNode/internal/zero"
|
||||||
"github.com/cespare/xxhash"
|
"github.com/cespare/xxhash"
|
||||||
"github.com/iwind/TeaGo/types"
|
"github.com/iwind/TeaGo/types"
|
||||||
@@ -67,7 +66,7 @@ func NewMemoryStorage(policy *serverconfigs.HTTPCachePolicy, parentStorage Stora
|
|||||||
|
|
||||||
if parentStorage != nil {
|
if parentStorage != nil {
|
||||||
if queueSize <= 0 {
|
if queueSize <= 0 {
|
||||||
queueSize = 2048 + int(policy.CapacityBytes()/sizes.G)*2048
|
queueSize = utils.SystemMemoryGB() * 100_000
|
||||||
}
|
}
|
||||||
|
|
||||||
dirtyChan = make(chan string, queueSize)
|
dirtyChan = make(chan string, queueSize)
|
||||||
@@ -166,7 +165,7 @@ func (this *MemoryStorage) openWriter(key string, expiresAt int64, status int, h
|
|||||||
if isDirty &&
|
if isDirty &&
|
||||||
this.parentStorage != nil &&
|
this.parentStorage != nil &&
|
||||||
this.dirtyQueueSize > 0 &&
|
this.dirtyQueueSize > 0 &&
|
||||||
len(this.dirtyChan) == this.dirtyQueueSize { // 缓存时间过长
|
len(this.dirtyChan) >= this.dirtyQueueSize-int(fsutils.DiskMaxWrites) /** delta **/ { // 缓存时间过长
|
||||||
return nil, ErrWritingQueueFull
|
return nil, ErrWritingQueueFull
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -202,7 +201,7 @@ func (this *MemoryStorage) openWriter(key string, expiresAt int64, status int, h
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查是否超出最大值
|
// 检查是否超出容量最大值
|
||||||
var capacityBytes = this.memoryCapacityBytes()
|
var capacityBytes = this.memoryCapacityBytes()
|
||||||
if bodySize < 0 {
|
if bodySize < 0 {
|
||||||
bodySize = 0
|
bodySize = 0
|
||||||
@@ -226,8 +225,8 @@ func (this *MemoryStorage) openWriter(key string, expiresAt int64, status int, h
|
|||||||
if valueItem != nil {
|
if valueItem != nil {
|
||||||
valueItem.TotalSize = int64(len(valueItem.HeaderValue) + len(valueItem.BodyValue) + len(key) + 256 /** meta size **/)
|
valueItem.TotalSize = int64(len(valueItem.HeaderValue) + len(valueItem.BodyValue) + len(key) + 256 /** meta size **/)
|
||||||
|
|
||||||
atomic.AddInt64(&this.usedSize, valueItem.TotalSize)
|
|
||||||
runtime.SetFinalizer(valueItem, this.valueItemFinalizer)
|
runtime.SetFinalizer(valueItem, this.valueItemFinalizer)
|
||||||
|
atomic.AddInt64(&this.usedSize, valueItem.TotalSize)
|
||||||
}
|
}
|
||||||
}), nil
|
}), nil
|
||||||
}
|
}
|
||||||
@@ -516,6 +515,11 @@ func (this *MemoryStorage) flushItem(key string) {
|
|||||||
item, ok := this.valuesMap[hash]
|
item, ok := this.valuesMap[hash]
|
||||||
this.locker.RUnlock()
|
this.locker.RUnlock()
|
||||||
|
|
||||||
|
// 从内存中移除,并确保无论如何都会执行
|
||||||
|
defer func() {
|
||||||
|
_ = this.Delete(key)
|
||||||
|
}()
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -564,9 +568,6 @@ func (this *MemoryStorage) flushItem(key string) {
|
|||||||
HeaderSize: writer.HeaderSize(),
|
HeaderSize: writer.HeaderSize(),
|
||||||
BodySize: writer.BodySize(),
|
BodySize: writer.BodySize(),
|
||||||
})
|
})
|
||||||
|
|
||||||
// 从内存中移除
|
|
||||||
_ = this.Delete(key)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *MemoryStorage) memoryCapacityBytes() int64 {
|
func (this *MemoryStorage) memoryCapacityBytes() int64 {
|
||||||
|
|||||||
@@ -2,9 +2,9 @@ package caches
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"github.com/TeaOSLab/EdgeNode/internal/utils/fasttime"
|
||||||
"github.com/cespare/xxhash"
|
"github.com/cespare/xxhash"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type MemoryWriter struct {
|
type MemoryWriter struct {
|
||||||
@@ -29,7 +29,7 @@ type MemoryWriter struct {
|
|||||||
func NewMemoryWriter(memoryStorage *MemoryStorage, key string, expiredAt int64, status int, isDirty bool, expectedBodySize int64, maxSize int64, endFunc func(valueItem *MemoryItem)) *MemoryWriter {
|
func NewMemoryWriter(memoryStorage *MemoryStorage, key string, expiredAt int64, status int, isDirty bool, expectedBodySize int64, maxSize int64, endFunc func(valueItem *MemoryItem)) *MemoryWriter {
|
||||||
var valueItem = &MemoryItem{
|
var valueItem = &MemoryItem{
|
||||||
ExpiresAt: expiredAt,
|
ExpiresAt: expiredAt,
|
||||||
ModifiedAt: time.Now().Unix(),
|
ModifiedAt: fasttime.Now().Unix(),
|
||||||
Status: status,
|
Status: status,
|
||||||
}
|
}
|
||||||
if expectedBodySize > 0 {
|
if expectedBodySize > 0 {
|
||||||
@@ -120,18 +120,26 @@ func (this *MemoryWriter) Close() error {
|
|||||||
|
|
||||||
this.storage.locker.Lock()
|
this.storage.locker.Lock()
|
||||||
this.item.IsDone = true
|
this.item.IsDone = true
|
||||||
this.storage.valuesMap[this.hash] = this.item
|
var err error
|
||||||
if this.isDirty {
|
if this.isDirty {
|
||||||
if this.storage.parentStorage != nil {
|
if this.storage.parentStorage != nil {
|
||||||
select {
|
select {
|
||||||
case this.storage.dirtyChan <- this.key:
|
case this.storage.dirtyChan <- this.key:
|
||||||
|
this.storage.valuesMap[this.hash] = this.item
|
||||||
default:
|
default:
|
||||||
|
// do not add value map
|
||||||
|
err = ErrWritingQueueFull
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
err = ErrWritingQueueFull
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
this.storage.valuesMap[this.hash] = this.item
|
||||||
}
|
}
|
||||||
|
|
||||||
this.storage.locker.Unlock()
|
this.storage.locker.Unlock()
|
||||||
|
|
||||||
return nil
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Discard 丢弃
|
// Discard 丢弃
|
||||||
|
|||||||
Reference in New Issue
Block a user