mirror of
https://github.com/TeaOSLab/EdgeNode.git
synced 2025-11-03 23:20:25 +08:00
增加PURGE某个URL缓存功能
This commit is contained in:
@@ -27,7 +27,7 @@ func (this *Item) IsExpired() bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (this *Item) TotalSize() int64 {
|
func (this *Item) TotalSize() int64 {
|
||||||
return this.Size() + this.MetaSize + int64(len(this.Key)) + 64
|
return this.Size() + this.MetaSize + int64(len(this.Key)) + int64(len(this.Host)) + 64
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *Item) Size() int64 {
|
func (this *Item) Size() int64 {
|
||||||
|
|||||||
@@ -1,9 +1,12 @@
|
|||||||
package caches
|
package caches
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
|
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
|
||||||
"github.com/iwind/TeaGo/logs"
|
"github.com/iwind/TeaGo/logs"
|
||||||
"github.com/iwind/TeaGo/rands"
|
"github.com/iwind/TeaGo/rands"
|
||||||
|
"runtime"
|
||||||
|
"runtime/debug"
|
||||||
"strconv"
|
"strconv"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
@@ -265,3 +268,38 @@ func TestMemoryStorage_Locker(t *testing.T) {
|
|||||||
}
|
}
|
||||||
t.Log("ok")
|
t.Log("ok")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMemoryStorage_Stop(t *testing.T) {
|
||||||
|
var stat1 = &runtime.MemStats{}
|
||||||
|
runtime.ReadMemStats(stat1)
|
||||||
|
|
||||||
|
var m = map[uint64]*MemoryItem{}
|
||||||
|
for i := 0; i < 1_000_000; i++ {
|
||||||
|
m[uint64(i)] = &MemoryItem{
|
||||||
|
HeaderValue: []byte("Hello, World"),
|
||||||
|
BodyValue: bytes.Repeat([]byte("Hello"), 1024),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m = map[uint64]*MemoryItem{}
|
||||||
|
|
||||||
|
var before = time.Now()
|
||||||
|
//runtime.GC()
|
||||||
|
debug.FreeOSMemory()
|
||||||
|
/**go func() {
|
||||||
|
time.Sleep(10 * time.Second)
|
||||||
|
runtime.GC()
|
||||||
|
}()**/
|
||||||
|
t.Log(time.Since(before).Seconds()*1000, "ms")
|
||||||
|
|
||||||
|
var stat2 = &runtime.MemStats{}
|
||||||
|
runtime.ReadMemStats(stat2)
|
||||||
|
|
||||||
|
if stat2.HeapInuse > stat1.HeapInuse {
|
||||||
|
t.Log(stat2.HeapInuse, stat1.HeapInuse, (stat2.HeapInuse-stat1.HeapInuse)/1024/1024, "MB")
|
||||||
|
} else {
|
||||||
|
t.Log("0 MB")
|
||||||
|
}
|
||||||
|
|
||||||
|
t.Log(len(m))
|
||||||
|
}
|
||||||
|
|||||||
@@ -3,8 +3,10 @@ package nodes
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
||||||
"github.com/TeaOSLab/EdgeNode/internal/caches"
|
"github.com/TeaOSLab/EdgeNode/internal/caches"
|
||||||
"github.com/TeaOSLab/EdgeNode/internal/remotelogs"
|
"github.com/TeaOSLab/EdgeNode/internal/remotelogs"
|
||||||
|
"github.com/TeaOSLab/EdgeNode/internal/rpc"
|
||||||
"net/http"
|
"net/http"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strconv"
|
"strconv"
|
||||||
@@ -109,6 +111,32 @@ func (this *HTTPRequest) doCacheRead() (shouldStop bool) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 判断是否在Purge
|
||||||
|
if this.web.Cache.PurgeIsOn && strings.ToUpper(this.RawReq.Method) == "PURGE" && this.RawReq.Header.Get("Edge-Purge-Key") == this.web.Cache.PurgeKey {
|
||||||
|
err := storage.Delete(key)
|
||||||
|
if err != nil {
|
||||||
|
remotelogs.Error("HTTP_REQUEST_CACHE", "purge failed: "+err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
rpcClient, err := rpc.SharedRPC()
|
||||||
|
if err == nil {
|
||||||
|
for _, rpcServerService := range rpcClient.ServerRPCList() {
|
||||||
|
_, err = rpcServerService.PurgeServerCache(rpcClient.Context(), &pb.PurgeServerCacheRequest{
|
||||||
|
Domains: []string{this.Host},
|
||||||
|
Keys: []string{key},
|
||||||
|
Prefixes: nil,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
remotelogs.Error("HTTP_REQUEST_CACHE", "purge failed: "+err.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
buf := bytePool32k.Get()
|
buf := bytePool32k.Get()
|
||||||
defer func() {
|
defer func() {
|
||||||
bytePool32k.Put(buf)
|
bytePool32k.Put(buf)
|
||||||
|
|||||||
@@ -105,6 +105,18 @@ func (this *RPCClient) ServerRPC() pb.ServerServiceClient {
|
|||||||
return pb.NewServerServiceClient(this.pickConn())
|
return pb.NewServerServiceClient(this.pickConn())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (this *RPCClient) ServerRPCList() []pb.ServerServiceClient {
|
||||||
|
this.locker.Lock()
|
||||||
|
defer this.locker.Unlock()
|
||||||
|
|
||||||
|
var clients = []pb.ServerServiceClient{}
|
||||||
|
for _, conn := range this.conns {
|
||||||
|
clients = append(clients, pb.NewServerServiceClient(conn))
|
||||||
|
}
|
||||||
|
|
||||||
|
return clients
|
||||||
|
}
|
||||||
|
|
||||||
func (this *RPCClient) ServerDailyStatRPC() pb.ServerDailyStatServiceClient {
|
func (this *RPCClient) ServerDailyStatRPC() pb.ServerDailyStatServiceClient {
|
||||||
return pb.NewServerDailyStatServiceClient(this.pickConn())
|
return pb.NewServerDailyStatServiceClient(this.pickConn())
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user