优化对未知长度内容的缓存长度限制

This commit is contained in:
GoEdgeLab
2023-07-18 12:45:25 +08:00
parent ceeedf0edc
commit a4bdc90440
7 changed files with 21 additions and 13 deletions

View File

@@ -198,6 +198,9 @@ func (this *FileStorage) UpdatePolicy(newPolicy *serverconfigs.HTTPCachePolicy)
if newPolicy.PersistenceAutoPurgeInterval != this.policy.PersistenceAutoPurgeInterval { if newPolicy.PersistenceAutoPurgeInterval != this.policy.PersistenceAutoPurgeInterval {
this.initPurgeTicker() this.initPurgeTicker()
} }
// reset ignored keys
this.ignoreKeys.Reset()
} }
// Init 初始化 // Init 初始化
@@ -410,14 +413,14 @@ func (this *FileStorage) openWriter(key string, expiredAt int64, status int, hea
} }
// 是否已忽略 // 是否已忽略
if this.ignoreKeys.Has(key) { if maxSize > 0 && this.ignoreKeys.Has(types.String(maxSize)+"$"+key) {
return nil, ErrEntityTooLarge return nil, ErrEntityTooLarge
} }
// 先尝试内存缓存 // 先尝试内存缓存
// 我们限定仅小文件优先存在内存中 // 我们限定仅小文件优先存在内存中
var maxMemorySize = FileToMemoryMaxSize var maxMemorySize = FileToMemoryMaxSize
if maxSize > maxMemorySize { if maxSize > 0 && maxSize < maxMemorySize {
maxMemorySize = maxSize maxMemorySize = maxSize
} }
var memoryStorage = this.memoryStorage var memoryStorage = this.memoryStorage
@@ -642,7 +645,7 @@ func (this *FileStorage) openWriter(key string, expiredAt int64, status int, hea
sharedWritingFileKeyLocker.Unlock() sharedWritingFileKeyLocker.Unlock()
}), nil }), nil
} else { } else {
return NewFileWriter(this, writer, key, expiredAt, metaHeaderSize, metaBodySize, -1, func() { return NewFileWriter(this, writer, key, expiredAt, metaHeaderSize, metaBodySize, maxSize, func() {
sharedWritingFileKeyLocker.Lock() sharedWritingFileKeyLocker.Lock()
delete(sharedWritingFileKeyMap, key) delete(sharedWritingFileKeyMap, key)
if len(sharedWritingFileKeyMap) == 0 { if len(sharedWritingFileKeyMap) == 0 {
@@ -914,8 +917,8 @@ func (this *FileStorage) TotalMemorySize() int64 {
} }
// IgnoreKey 忽略某个Key即不缓存某个Key // IgnoreKey 忽略某个Key即不缓存某个Key
func (this *FileStorage) IgnoreKey(key string) { func (this *FileStorage) IgnoreKey(key string, maxSize int64) {
this.ignoreKeys.Push(key) this.ignoreKeys.Push(types.String(maxSize) + "$" + key)
} }
// CanSendfile 是否支持Sendfile // CanSendfile 是否支持Sendfile

View File

@@ -42,7 +42,9 @@ func TestFileStorage_Init(t *testing.T) {
time.Sleep(2 * time.Second) time.Sleep(2 * time.Second)
storage.purgeLoop() storage.purgeLoop()
t.Log(storage.list.(*FileList).total, "entries left") t.Log(storage.list.(*FileList).Stat(func(hash string) bool {
return true
}))
} }
func TestFileStorage_OpenWriter(t *testing.T) { func TestFileStorage_OpenWriter(t *testing.T) {

View File

@@ -54,7 +54,7 @@ type StorageInterface interface {
AddToList(item *Item) AddToList(item *Item)
// IgnoreKey 忽略某个Key即不缓存某个Key // IgnoreKey 忽略某个Key即不缓存某个Key
IgnoreKey(key string) IgnoreKey(key string, maxSize int64)
// CanSendfile 是否支持Sendfile // CanSendfile 是否支持Sendfile
CanSendfile() bool CanSendfile() bool

View File

@@ -158,7 +158,7 @@ func (this *MemoryStorage) OpenReader(key string, useStale bool, isPartial bool)
// OpenWriter 打开缓存写入器等待写入 // OpenWriter 打开缓存写入器等待写入
func (this *MemoryStorage) OpenWriter(key string, expiredAt int64, status int, headerSize int, bodySize int64, maxSize int64, isPartial bool) (Writer, error) { func (this *MemoryStorage) OpenWriter(key string, expiredAt int64, status int, headerSize int, bodySize int64, maxSize int64, isPartial bool) (Writer, error) {
if this.ignoreKeys.Has(key) { if maxSize > 0 && this.ignoreKeys.Has(types.String(maxSize)+"$"+key) {
return nil, ErrEntityTooLarge return nil, ErrEntityTooLarge
} }
@@ -362,6 +362,9 @@ func (this *MemoryStorage) UpdatePolicy(newPolicy *serverconfigs.HTTPCachePolicy
if newPolicy.CapacityBytes() == 0 { if newPolicy.CapacityBytes() == 0 {
_ = this.CleanAll() _ = this.CleanAll()
} }
// reset ignored keys
this.ignoreKeys.Reset()
} }
// CanUpdatePolicy 检查策略是否可以更新 // CanUpdatePolicy 检查策略是否可以更新
@@ -392,8 +395,8 @@ func (this *MemoryStorage) TotalMemorySize() int64 {
} }
// IgnoreKey 忽略某个Key即不缓存某个Key // IgnoreKey 忽略某个Key即不缓存某个Key
func (this *MemoryStorage) IgnoreKey(key string) { func (this *MemoryStorage) IgnoreKey(key string, maxSize int64) {
this.ignoreKeys.Push(key) this.ignoreKeys.Push(types.String(maxSize) + "$" + key)
} }
// CanSendfile 是否支持Sendfile // CanSendfile 是否支持Sendfile

View File

@@ -79,7 +79,7 @@ func (this *FileWriter) Write(data []byte) (n int, err error) {
err = ErrEntityTooLarge err = ErrEntityTooLarge
if this.storage != nil { if this.storage != nil {
this.storage.IgnoreKey(this.key) this.storage.IgnoreKey(this.key, this.maxSize)
} }
} }

View File

@@ -59,7 +59,7 @@ func (this *MemoryWriter) Write(data []byte) (n int, err error) {
// 检查尺寸 // 检查尺寸
if this.maxSize > 0 && this.bodySize > this.maxSize { if this.maxSize > 0 && this.bodySize > this.maxSize {
err = ErrEntityTooLarge err = ErrEntityTooLarge
this.storage.IgnoreKey(this.key) this.storage.IgnoreKey(this.key, this.maxSize)
return len(data), err return len(data), err
} }

View File

@@ -25,7 +25,7 @@ func (this *TeeReaderCloser) Read(p []byte) (n int, err error) {
n, err = this.r.Read(p) n, err = this.r.Read(p)
if n > 0 { if n > 0 {
_, wErr := this.w.Write(p[:n]) _, wErr := this.w.Write(p[:n])
if err == nil && wErr != nil { if (err == nil || err == io.EOF) && wErr != nil {
err = wErr err = wErr
} }
} }