mirror of
				https://github.com/TeaOSLab/EdgeNode.git
				synced 2025-11-04 07:40:56 +08:00 
			
		
		
		
	优化对未知长度内容的缓存长度限制
This commit is contained in:
		@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user