缓存策略增加“缓存磁盘最小空余空间”选项

This commit is contained in:
GoEdgeLab
2023-08-06 18:09:01 +08:00
parent 43f2f25646
commit cf48ebc688
6 changed files with 103 additions and 11 deletions

View File

@@ -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
}

View File

@@ -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,10 +35,11 @@ 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
FetchTimeoutJSON []byte FetchTimeoutJSON []byte
SyncCompressionCache bool SyncCompressionCache bool
Description string Description string
@@ -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{}
@@ -99,7 +115,7 @@ func (this *CreatePopupAction) RunPost(params struct {
Description: params.Description, Description: params.Description,
CapacityJSON: params.CapacityJSON, CapacityJSON: params.CapacityJSON,
MaxSizeJSON: params.MaxSizeJSON, MaxSizeJSON: params.MaxSizeJSON,
FetchTimeoutJSON: params.FetchTimeoutJSON, FetchTimeoutJSON: params.FetchTimeoutJSON,
Type: params.Type, Type: params.Type,
OptionsJSON: optionsJSON, OptionsJSON: optionsJSON,
SyncCompressionCache: params.SyncCompressionCache, SyncCompressionCache: params.SyncCompressionCache,

View File

@@ -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{}

View File

@@ -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>

View File

@@ -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'">

View 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>