From cf48ebc688fca349b0eb92e1e6a37b8d3e17b5b3 Mon Sep 17 00:00:00 2001 From: GoEdgeLab Date: Sun, 6 Aug 2023 18:09:01 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BC=93=E5=AD=98=E7=AD=96=E7=95=A5=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E2=80=9C=E7=BC=93=E5=AD=98=E7=A3=81=E7=9B=98=E6=9C=80?= =?UTF-8?q?=E5=B0=8F=E7=A9=BA=E4=BD=99=E7=A9=BA=E9=97=B4=E2=80=9D=E9=80=89?= =?UTF-8?q?=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/utils/json.go | 30 +++++++++++++++++++ .../servers/components/cache/createPopup.go | 24 ++++++++++++--- .../servers/components/cache/update.go | 30 ++++++++++++++++++- .../servers/components/cache/createPopup.html | 11 +++++-- .../servers/components/cache/policy.html | 8 +++-- .../servers/components/cache/update.html | 11 +++++-- 6 files changed, 103 insertions(+), 11 deletions(-) diff --git a/internal/utils/json.go b/internal/utils/json.go index cb96b16c..5884548d 100644 --- a/internal/utils/json.go +++ b/internal/utils/json.go @@ -5,6 +5,7 @@ package utils import ( "bytes" "encoding/json" + "errors" "reflect" ) @@ -28,3 +29,32 @@ func JSONClone(v interface{}) (interface{}, error) { func JSONIsNull(jsonData []byte) bool { return len(jsonData) == 0 || bytes.Equal(jsonData, []byte("null")) } + +// JSONDecodeConfig 解码并重新编码 +// 是为了去除原有JSON中不需要的数据 +func JSONDecodeConfig(data []byte, ptr any) (encodeJSON []byte, err error) { + err = json.Unmarshal(data, ptr) + if err != nil { + return + } + + encodeJSON, err = json.Marshal(ptr) + if err != nil { + return + } + + // validate config + if ptr != nil { + config, ok := ptr.(interface { + Init() error + }) + if ok { + initErr := config.Init() + if initErr != nil { + err = errors.New("validate config failed: " + initErr.Error()) + } + } + } + + return +} diff --git a/internal/web/actions/default/servers/components/cache/createPopup.go b/internal/web/actions/default/servers/components/cache/createPopup.go index 4e9c027f..a9df413f 100644 --- a/internal/web/actions/default/servers/components/cache/createPopup.go +++ b/internal/web/actions/default/servers/components/cache/createPopup.go @@ -2,6 +2,7 @@ package cache import ( "encoding/json" + "github.com/TeaOSLab/EdgeAdmin/internal/utils" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" "github.com/TeaOSLab/EdgeCommon/pkg/langs/codes" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" @@ -34,10 +35,11 @@ func (this *CreatePopupAction) RunPost(params struct { FileMemoryCapacityJSON []byte FileOpenFileCacheMax int FileEnableSendfile bool + FileMinFreeSizeJSON []byte CapacityJSON []byte MaxSizeJSON []byte - FetchTimeoutJSON []byte + FetchTimeoutJSON []byte SyncCompressionCache bool Description string @@ -50,14 +52,14 @@ func (this *CreatePopupAction) RunPost(params struct { Require("请输入策略名称") // 校验选项 - var options interface{} + var options any switch params.Type { case serverconfigs.CachePolicyStorageFile: params.Must. Field("fileDir", params.FileDir). Require("请输入缓存目录") - memoryCapacity := &shared.SizeCapacity{} + var memoryCapacity = &shared.SizeCapacity{} if len(params.FileMemoryCapacityJSON) > 0 { err := json.Unmarshal(params.FileMemoryCapacityJSON, memoryCapacity) if err != nil { @@ -74,6 +76,19 @@ func (this *CreatePopupAction) RunPost(params struct { } } + var minFreeSize = &shared.SizeCapacity{} + var minFreeSizeJSON = params.FileMinFreeSizeJSON + if !utils.JSONIsNull(minFreeSizeJSON) { + _, err := utils.JSONDecodeConfig(minFreeSizeJSON, minFreeSize) + if err != nil { + this.ErrorPage(err) + return + } + if minFreeSize.Count < 0 { + minFreeSize.Count = 0 + } + } + options = &serverconfigs.HTTPFileCacheStorage{ Dir: params.FileDir, MemoryPolicy: &serverconfigs.HTTPCachePolicy{ @@ -81,6 +96,7 @@ func (this *CreatePopupAction) RunPost(params struct { }, OpenFileCache: openFileCacheConfig, EnableSendfile: params.FileEnableSendfile, + MinFreeSize: minFreeSize, } case serverconfigs.CachePolicyStorageMemory: options = &serverconfigs.HTTPMemoryCacheStorage{} @@ -99,7 +115,7 @@ func (this *CreatePopupAction) RunPost(params struct { Description: params.Description, CapacityJSON: params.CapacityJSON, MaxSizeJSON: params.MaxSizeJSON, - FetchTimeoutJSON: params.FetchTimeoutJSON, + FetchTimeoutJSON: params.FetchTimeoutJSON, Type: params.Type, OptionsJSON: optionsJSON, SyncCompressionCache: params.SyncCompressionCache, diff --git a/internal/web/actions/default/servers/components/cache/update.go b/internal/web/actions/default/servers/components/cache/update.go index c8d97084..49c51fff 100644 --- a/internal/web/actions/default/servers/components/cache/update.go +++ b/internal/web/actions/default/servers/components/cache/update.go @@ -2,6 +2,7 @@ package cache import ( "encoding/json" + "github.com/TeaOSLab/EdgeAdmin/internal/utils" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" "github.com/TeaOSLab/EdgeCommon/pkg/langs/codes" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" @@ -38,6 +39,18 @@ func (this *UpdateAction) RunGet(params struct { this.ErrorPage(err) return } + + // fix min free size + if cachePolicy.Type == serverconfigs.CachePolicyStorageFile && cachePolicy.Options != nil { + _, ok := cachePolicy.Options["minFreeSize"] + if !ok { + cachePolicy.Options["minFreeSize"] = &shared.SizeCapacity{ + Count: 0, + Unit: shared.SizeCapacityUnitGB, + } + } + } + this.Data["cachePolicy"] = cachePolicy // 其他选项 @@ -57,6 +70,7 @@ func (this *UpdateAction) RunPost(params struct { FileMemoryCapacityJSON []byte FileOpenFileCacheMax int FileEnableSendfile bool + FileMinFreeSizeJSON []byte CapacityJSON []byte MaxSizeJSON []byte @@ -85,7 +99,7 @@ func (this *UpdateAction) RunPost(params struct { Field("fileDir", params.FileDir). Require("请输入缓存目录") - memoryCapacity := &shared.SizeCapacity{} + var memoryCapacity = &shared.SizeCapacity{} if len(params.FileMemoryCapacityJSON) > 0 { err := json.Unmarshal(params.FileMemoryCapacityJSON, memoryCapacity) if err != nil { @@ -102,6 +116,19 @@ func (this *UpdateAction) RunPost(params struct { } } + var minFreeSize = &shared.SizeCapacity{} + var minFreeSizeJSON = params.FileMinFreeSizeJSON + if !utils.JSONIsNull(minFreeSizeJSON) { + _, err := utils.JSONDecodeConfig(minFreeSizeJSON, minFreeSize) + if err != nil { + this.ErrorPage(err) + return + } + if minFreeSize.Count < 0 { + minFreeSize.Count = 0 + } + } + options = &serverconfigs.HTTPFileCacheStorage{ Dir: params.FileDir, MemoryPolicy: &serverconfigs.HTTPCachePolicy{ @@ -109,6 +136,7 @@ func (this *UpdateAction) RunPost(params struct { }, OpenFileCache: openFileCacheConfig, EnableSendfile: params.FileEnableSendfile, + MinFreeSize: minFreeSize, } case serverconfigs.CachePolicyStorageMemory: options = &serverconfigs.HTTPMemoryCacheStorage{} diff --git a/web/views/@default/servers/components/cache/createPopup.html b/web/views/@default/servers/components/cache/createPopup.html index a6486b96..82c9c0bf 100644 --- a/web/views/@default/servers/components/cache/createPopup.html +++ b/web/views/@default/servers/components/cache/createPopup.html @@ -26,7 +26,7 @@ - 缓存硬盘最大容量 * + 缓存磁盘最大用量 *

缓存所在磁盘的最大用量,超出此用量后,将会自动尝试清理旧数据,如果为0表示没有限制。

@@ -63,6 +63,13 @@ + + 缓存磁盘最小空余空间 + + +

缓存磁盘保留的最小空余空间,如果为0表示自动限制(目前默认保留5GB)。

+ + 缓存文件句柄缓存 @@ -83,7 +90,7 @@ 同步写入压缩缓存 -

选中后,在压缩设置开启的情况下,在缓存源站内容的同时,也会同步写入压缩缓存;不选中,表示在源站内容缓存后,下一次调用才会缓存压缩内容,防止同一时间内硬盘IO负载过高。

+

选中后,在压缩设置开启的情况下,在缓存源站内容的同时,也会同步写入压缩缓存;不选中,表示在源站内容缓存后,下一次调用才会缓存压缩内容,防止同一时间内磁盘IO负载过高。

diff --git a/web/views/@default/servers/components/cache/policy.html b/web/views/@default/servers/components/cache/policy.html index 6a325790..630f0f78 100644 --- a/web/views/@default/servers/components/cache/policy.html +++ b/web/views/@default/servers/components/cache/policy.html @@ -27,10 +27,10 @@ - 缓存硬盘最大容量 + 缓存磁盘最大用量 -

单个节点上缓存目录所在硬盘允许的最大容量,如果为0表示没有限制。

+

单个节点上缓存目录所在磁盘允许的最大容量,如果为0表示没有限制。

@@ -54,6 +54,10 @@ 开启Sendfile YN + + 缓存磁盘最小空余空间 + + diff --git a/web/views/@default/servers/components/cache/update.html b/web/views/@default/servers/components/cache/update.html index 47a6c8b6..2cb6d500 100644 --- a/web/views/@default/servers/components/cache/update.html +++ b/web/views/@default/servers/components/cache/update.html @@ -28,7 +28,7 @@ - 缓存硬盘最大容量 + 缓存磁盘最大用量

缓存所在磁盘的最大用量,超出此用量后,将会自动尝试清理旧数据,如果为0表示没有限制。

@@ -70,6 +70,13 @@ + + 缓存磁盘最小空余空间 + + +

缓存磁盘保留的最小空余空间,如果为0表示使用默认(目前默认保留5GB)。

+ + 缓存文件句柄缓存 @@ -90,7 +97,7 @@ 同步写入压缩缓存 -

选中后,在压缩设置开启的情况下,在缓存源站内容的同时,也会同步写入压缩缓存;不选中,表示在源站内容缓存后,下一次调用才会缓存压缩内容,防止同一时间内硬盘IO负载过高。

+

选中后,在压缩设置开启的情况下,在缓存源站内容的同时,也会同步写入压缩缓存;不选中,表示在源站内容缓存后,下一次调用才会缓存压缩内容,防止同一时间内磁盘IO负载过高。