mirror of
https://github.com/TeaOSLab/EdgeAdmin.git
synced 2025-11-12 19:30:26 +08:00
缓存策略增加“缓存磁盘最小空余空间”选项
This commit is contained in:
@@ -5,6 +5,7 @@ package utils
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"reflect"
|
"reflect"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -28,3 +29,32 @@ func JSONClone(v interface{}) (interface{}, error) {
|
|||||||
func JSONIsNull(jsonData []byte) bool {
|
func JSONIsNull(jsonData []byte) bool {
|
||||||
return len(jsonData) == 0 || bytes.Equal(jsonData, []byte("null"))
|
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
|
||||||
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package cache
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"github.com/TeaOSLab/EdgeAdmin/internal/utils"
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
|
"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
@@ -34,6 +35,7 @@ func (this *CreatePopupAction) RunPost(params struct {
|
|||||||
FileMemoryCapacityJSON []byte
|
FileMemoryCapacityJSON []byte
|
||||||
FileOpenFileCacheMax int
|
FileOpenFileCacheMax int
|
||||||
FileEnableSendfile bool
|
FileEnableSendfile bool
|
||||||
|
FileMinFreeSizeJSON []byte
|
||||||
|
|
||||||
CapacityJSON []byte
|
CapacityJSON []byte
|
||||||
MaxSizeJSON []byte
|
MaxSizeJSON []byte
|
||||||
@@ -50,14 +52,14 @@ func (this *CreatePopupAction) RunPost(params struct {
|
|||||||
Require("请输入策略名称")
|
Require("请输入策略名称")
|
||||||
|
|
||||||
// 校验选项
|
// 校验选项
|
||||||
var options interface{}
|
var options any
|
||||||
switch params.Type {
|
switch params.Type {
|
||||||
case serverconfigs.CachePolicyStorageFile:
|
case serverconfigs.CachePolicyStorageFile:
|
||||||
params.Must.
|
params.Must.
|
||||||
Field("fileDir", params.FileDir).
|
Field("fileDir", params.FileDir).
|
||||||
Require("请输入缓存目录")
|
Require("请输入缓存目录")
|
||||||
|
|
||||||
memoryCapacity := &shared.SizeCapacity{}
|
var memoryCapacity = &shared.SizeCapacity{}
|
||||||
if len(params.FileMemoryCapacityJSON) > 0 {
|
if len(params.FileMemoryCapacityJSON) > 0 {
|
||||||
err := json.Unmarshal(params.FileMemoryCapacityJSON, memoryCapacity)
|
err := json.Unmarshal(params.FileMemoryCapacityJSON, memoryCapacity)
|
||||||
if err != nil {
|
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{
|
options = &serverconfigs.HTTPFileCacheStorage{
|
||||||
Dir: params.FileDir,
|
Dir: params.FileDir,
|
||||||
MemoryPolicy: &serverconfigs.HTTPCachePolicy{
|
MemoryPolicy: &serverconfigs.HTTPCachePolicy{
|
||||||
@@ -81,6 +96,7 @@ func (this *CreatePopupAction) RunPost(params struct {
|
|||||||
},
|
},
|
||||||
OpenFileCache: openFileCacheConfig,
|
OpenFileCache: openFileCacheConfig,
|
||||||
EnableSendfile: params.FileEnableSendfile,
|
EnableSendfile: params.FileEnableSendfile,
|
||||||
|
MinFreeSize: minFreeSize,
|
||||||
}
|
}
|
||||||
case serverconfigs.CachePolicyStorageMemory:
|
case serverconfigs.CachePolicyStorageMemory:
|
||||||
options = &serverconfigs.HTTPMemoryCacheStorage{}
|
options = &serverconfigs.HTTPMemoryCacheStorage{}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package cache
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"github.com/TeaOSLab/EdgeAdmin/internal/utils"
|
||||||
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
|
"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
@@ -38,6 +39,18 @@ func (this *UpdateAction) RunGet(params struct {
|
|||||||
this.ErrorPage(err)
|
this.ErrorPage(err)
|
||||||
return
|
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
|
this.Data["cachePolicy"] = cachePolicy
|
||||||
|
|
||||||
// 其他选项
|
// 其他选项
|
||||||
@@ -57,6 +70,7 @@ func (this *UpdateAction) RunPost(params struct {
|
|||||||
FileMemoryCapacityJSON []byte
|
FileMemoryCapacityJSON []byte
|
||||||
FileOpenFileCacheMax int
|
FileOpenFileCacheMax int
|
||||||
FileEnableSendfile bool
|
FileEnableSendfile bool
|
||||||
|
FileMinFreeSizeJSON []byte
|
||||||
|
|
||||||
CapacityJSON []byte
|
CapacityJSON []byte
|
||||||
MaxSizeJSON []byte
|
MaxSizeJSON []byte
|
||||||
@@ -85,7 +99,7 @@ func (this *UpdateAction) RunPost(params struct {
|
|||||||
Field("fileDir", params.FileDir).
|
Field("fileDir", params.FileDir).
|
||||||
Require("请输入缓存目录")
|
Require("请输入缓存目录")
|
||||||
|
|
||||||
memoryCapacity := &shared.SizeCapacity{}
|
var memoryCapacity = &shared.SizeCapacity{}
|
||||||
if len(params.FileMemoryCapacityJSON) > 0 {
|
if len(params.FileMemoryCapacityJSON) > 0 {
|
||||||
err := json.Unmarshal(params.FileMemoryCapacityJSON, memoryCapacity)
|
err := json.Unmarshal(params.FileMemoryCapacityJSON, memoryCapacity)
|
||||||
if err != nil {
|
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{
|
options = &serverconfigs.HTTPFileCacheStorage{
|
||||||
Dir: params.FileDir,
|
Dir: params.FileDir,
|
||||||
MemoryPolicy: &serverconfigs.HTTPCachePolicy{
|
MemoryPolicy: &serverconfigs.HTTPCachePolicy{
|
||||||
@@ -109,6 +136,7 @@ func (this *UpdateAction) RunPost(params struct {
|
|||||||
},
|
},
|
||||||
OpenFileCache: openFileCacheConfig,
|
OpenFileCache: openFileCacheConfig,
|
||||||
EnableSendfile: params.FileEnableSendfile,
|
EnableSendfile: params.FileEnableSendfile,
|
||||||
|
MinFreeSize: minFreeSize,
|
||||||
}
|
}
|
||||||
case serverconfigs.CachePolicyStorageMemory:
|
case serverconfigs.CachePolicyStorageMemory:
|
||||||
options = &serverconfigs.HTTPMemoryCacheStorage{}
|
options = &serverconfigs.HTTPMemoryCacheStorage{}
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="color-border">缓存硬盘最大容量 *</td>
|
<td class="color-border">缓存磁盘最大用量 *</td>
|
||||||
<td>
|
<td>
|
||||||
<size-capacity-box :v-name="'capacityJSON'" :v-count="128" :v-unit="'gb'" :key="'capacityJSON1'"></size-capacity-box>
|
<size-capacity-box :v-name="'capacityJSON'" :v-count="128" :v-unit="'gb'" :key="'capacityJSON1'"></size-capacity-box>
|
||||||
<p class="comment">缓存所在磁盘的最大用量,超出此用量后,将会自动尝试清理旧数据,如果为0表示没有限制。</p>
|
<p class="comment">缓存所在磁盘的最大用量,超出此用量后,将会自动尝试清理旧数据,如果为0表示没有限制。</p>
|
||||||
@@ -63,6 +63,13 @@
|
|||||||
<td colspan="2"><more-options-indicator></more-options-indicator></td>
|
<td colspan="2"><more-options-indicator></more-options-indicator></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tbody v-show="moreOptionsVisible && policyType == 'file'">
|
<tbody v-show="moreOptionsVisible && policyType == 'file'">
|
||||||
|
<tr>
|
||||||
|
<td class="color-border">缓存磁盘最小空余空间</td>
|
||||||
|
<td>
|
||||||
|
<size-capacity-box :v-name="'fileMinFreeSizeJSON'" :v-count="0" :v-unit="'gb'" :key="'minFreeSizeJSON'"></size-capacity-box>
|
||||||
|
<p class="comment">缓存磁盘保留的最小空余空间,如果为0表示自动限制(目前默认保留5GB)。</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="color-border">缓存文件句柄缓存</td>
|
<td class="color-border">缓存文件句柄缓存</td>
|
||||||
<td>
|
<td>
|
||||||
@@ -83,7 +90,7 @@
|
|||||||
<td>同步写入压缩缓存</td>
|
<td>同步写入压缩缓存</td>
|
||||||
<td>
|
<td>
|
||||||
<checkbox name="syncCompressionCache"></checkbox>
|
<checkbox name="syncCompressionCache"></checkbox>
|
||||||
<p class="comment">选中后,在压缩设置开启的情况下,在缓存源站内容的同时,也会同步写入压缩缓存;不选中,表示在源站内容缓存后,下一次调用才会缓存压缩内容,防止同一时间内硬盘IO负载过高。</p>
|
<p class="comment">选中后,在压缩设置开启的情况下,在缓存源站内容的同时,也会同步写入压缩缓存;不选中,表示在源站内容缓存后,下一次调用才会缓存压缩内容,防止同一时间内磁盘IO负载过高。</p>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
|
|||||||
@@ -27,10 +27,10 @@
|
|||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="color-border">缓存硬盘最大容量</td>
|
<td class="color-border">缓存磁盘最大用量</td>
|
||||||
<td>
|
<td>
|
||||||
<size-capacity-view :v-value="cachePolicy.capacity" :v-default-text="'不限'"></size-capacity-view>
|
<size-capacity-view :v-value="cachePolicy.capacity" :v-default-text="'不限'"></size-capacity-view>
|
||||||
<p class="comment">单个节点上缓存目录所在硬盘允许的最大容量,如果为0表示没有限制。</p>
|
<p class="comment">单个节点上缓存目录所在磁盘允许的最大容量,如果为0表示没有限制。</p>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr v-if="cachePolicy.options.memoryPolicy != null && cachePolicy.options.memoryPolicy.capacity != null && cachePolicy.options.memoryPolicy.capacity.count > 0">
|
<tr v-if="cachePolicy.options.memoryPolicy != null && cachePolicy.options.memoryPolicy.capacity != null && cachePolicy.options.memoryPolicy.capacity.count > 0">
|
||||||
@@ -54,6 +54,10 @@
|
|||||||
<td class="color-border">开启Sendfile</td>
|
<td class="color-border">开启Sendfile</td>
|
||||||
<td><span v-if="cachePolicy.options.enableSendfile" class="green">Y</span><span v-else class="disabled">N</span></td>
|
<td><span v-if="cachePolicy.options.enableSendfile" class="green">Y</span><span v-else class="disabled">N</span></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr v-if="cachePolicy.options.minFreeSize != null && cachePolicy.options.minFreeSize.count > 0">
|
||||||
|
<td class="color-border">缓存磁盘最小空余空间</td>
|
||||||
|
<td><size-capacity-view :v-value="cachePolicy.options.minFreeSize"></size-capacity-view></td>
|
||||||
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
|
|
||||||
<tbody v-if="cachePolicy.type != 'file'">
|
<tbody v-if="cachePolicy.type != 'file'">
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="color-border">缓存硬盘最大容量</td>
|
<td class="color-border">缓存磁盘最大用量</td>
|
||||||
<td>
|
<td>
|
||||||
<size-capacity-box :v-name="'capacityJSON'" :v-value="cachePolicy.capacity" :v-count="0" :v-unit="'gb'"></size-capacity-box>
|
<size-capacity-box :v-name="'capacityJSON'" :v-value="cachePolicy.capacity" :v-count="0" :v-unit="'gb'"></size-capacity-box>
|
||||||
<p class="comment">缓存所在磁盘的最大用量,超出此用量后,将会自动尝试清理旧数据,如果为0表示没有限制。</p>
|
<p class="comment">缓存所在磁盘的最大用量,超出此用量后,将会自动尝试清理旧数据,如果为0表示没有限制。</p>
|
||||||
@@ -70,6 +70,13 @@
|
|||||||
<td colspan="2"><more-options-indicator></more-options-indicator></td>
|
<td colspan="2"><more-options-indicator></more-options-indicator></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tbody v-show="moreOptionsVisible && policyType == 'file'">
|
<tbody v-show="moreOptionsVisible && policyType == 'file'">
|
||||||
|
<tr>
|
||||||
|
<td class="color-border">缓存磁盘最小空余空间</td>
|
||||||
|
<td>
|
||||||
|
<size-capacity-box :v-name="'fileMinFreeSizeJSON'" :v-value="cachePolicy.options.minFreeSize" :key="'minFreeSizeJSON'"></size-capacity-box>
|
||||||
|
<p class="comment">缓存磁盘保留的最小空余空间,如果为0表示使用默认(目前默认保留5GB)。</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="color-border">缓存文件句柄缓存</td>
|
<td class="color-border">缓存文件句柄缓存</td>
|
||||||
<td>
|
<td>
|
||||||
@@ -90,7 +97,7 @@
|
|||||||
<td>同步写入压缩缓存</td>
|
<td>同步写入压缩缓存</td>
|
||||||
<td>
|
<td>
|
||||||
<checkbox name="syncCompressionCache" v-model="cachePolicy.syncCompressionCache"></checkbox>
|
<checkbox name="syncCompressionCache" v-model="cachePolicy.syncCompressionCache"></checkbox>
|
||||||
<p class="comment">选中后,在压缩设置开启的情况下,在缓存源站内容的同时,也会同步写入压缩缓存;不选中,表示在源站内容缓存后,下一次调用才会缓存压缩内容,防止同一时间内硬盘IO负载过高。</p>
|
<p class="comment">选中后,在压缩设置开启的情况下,在缓存源站内容的同时,也会同步写入压缩缓存;不选中,表示在源站内容缓存后,下一次调用才会缓存压缩内容,防止同一时间内磁盘IO负载过高。</p>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
|
|||||||
Reference in New Issue
Block a user