fix: 修复潜在的内存泄露问题

This commit is contained in:
hamster1963
2023-10-04 10:06:06 +08:00
parent 6ae1119938
commit d9d27f934f
5 changed files with 52 additions and 55 deletions

View File

@ -5,13 +5,14 @@ import (
"github.com/gogf/gf/v2/encoding/gjson" "github.com/gogf/gf/v2/encoding/gjson"
"github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gcache" "github.com/gogf/gf/v2/os/gcache"
"github.com/gogf/gf/v2/os/glog"
"home-network-watcher/manifest" "home-network-watcher/manifest"
"time" "time"
"home-network-watcher/api/data_core/v1" "home-network-watcher/api/data_core/v1"
) )
func (c *ControllerV1) GetDockerMonitorSSE(ctx context.Context, _ *v1.GetDockerMonitorSSEReq) (res *v1.GetDockerMonitorSSERes, err error) { func (c *ControllerV1) GetDockerMonitorSSE(ctx context.Context, _ *v1.GetDockerMonitorSSEReq) (_ *v1.GetDockerMonitorSSERes, err error) {
request := g.RequestFromCtx(ctx) request := g.RequestFromCtx(ctx)
request.Response.Header().Set("Content-Type", "text/event-stream") request.Response.Header().Set("Content-Type", "text/event-stream")
request.Response.Header().Set("Cache-Control", "no-cache") request.Response.Header().Set("Cache-Control", "no-cache")
@ -21,19 +22,19 @@ func (c *ControllerV1) GetDockerMonitorSSE(ctx context.Context, _ *v1.GetDockerM
for { for {
// 从缓存中获取数据 // 从缓存中获取数据
dockerData, err := gcache.Get(ctx, manifest.DockerMonitorCacheKey) dockerData := gcache.MustGet(ctx, manifest.DockerMonitorCacheKey)
if err != nil { resJson := gjson.New(&v1.GetDockerMonitorSSERes{DockerData: dockerData}).MustToJsonString()
return nil, err
}
res = &v1.GetDockerMonitorSSERes{DockerData: dockerData}
// 发送数据 // 发送数据
request.Response.Writefln("data: " + gjson.New(res).MustToJsonString() + "\n") request.Response.Writefln("data: " + resJson + "\n")
request.Response.Flush() request.Response.Flush()
// 等待10秒或者上下文取消 // 等待10秒或者上下文取消
select { select {
case <-time.After(10 * time.Second): case <-time.After(10 * time.Second):
case <-ctx.Done(): case <-ctx.Done():
glog.Info(ctx, "GetDockerMonitorSSE: ctx.Done()")
request.ExitAll()
return nil, ctx.Err() return nil, ctx.Err()
} }
} }

View File

@ -5,12 +5,13 @@ import (
"github.com/gogf/gf/v2/encoding/gjson" "github.com/gogf/gf/v2/encoding/gjson"
"github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gcache" "github.com/gogf/gf/v2/os/gcache"
"github.com/gogf/gf/v2/os/glog"
"home-network-watcher/api/data_core/v1" "home-network-watcher/api/data_core/v1"
"home-network-watcher/manifest" "home-network-watcher/manifest"
"time" "time"
) )
func (c *ControllerV1) GetHomeDataSSE(ctx context.Context, _ *v1.GetHomeDataSSEReq) (res *v1.GetHomeDataSSERes, err error) { func (c *ControllerV1) GetHomeDataSSE(ctx context.Context, _ *v1.GetHomeDataSSEReq) (_ *v1.GetHomeDataSSERes, err error) {
request := g.RequestFromCtx(ctx) request := g.RequestFromCtx(ctx)
request.Response.Header().Set("Content-Type", "text/event-stream") request.Response.Header().Set("Content-Type", "text/event-stream")
request.Response.Header().Set("Cache-Control", "no-cache") request.Response.Header().Set("Cache-Control", "no-cache")
@ -20,19 +21,19 @@ func (c *ControllerV1) GetHomeDataSSE(ctx context.Context, _ *v1.GetHomeDataSSER
for { for {
// 从缓存中获取数据 // 从缓存中获取数据
homeData, err := gcache.Get(ctx, manifest.HaEntitiesCacheKey) homeData := gcache.MustGet(ctx, manifest.HaEntitiesCacheKey)
if err != nil { resJson := gjson.New(&v1.GetHomeDataSSERes{HomeData: homeData}).MustToJsonString()
return nil, err
}
res = &v1.GetHomeDataSSERes{HomeData: homeData}
// 发送数据 // 发送数据
request.Response.Writefln("data: " + gjson.New(res).MustToJsonString() + "\n") request.Response.Writefln("data: " + resJson + "\n")
request.Response.Flush() request.Response.Flush()
// 等待1秒或者上下文取消 // 等待1秒或者上下文取消
select { select {
case <-time.After(1 * time.Second): case <-time.After(1 * time.Second):
case <-ctx.Done(): case <-ctx.Done():
glog.Info(ctx, "GetHomeDataSSE: ctx.Done()")
request.ExitAll()
return nil, ctx.Err() return nil, ctx.Err()
} }
} }

View File

@ -5,13 +5,14 @@ import (
"github.com/gogf/gf/v2/encoding/gjson" "github.com/gogf/gf/v2/encoding/gjson"
"github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gcache" "github.com/gogf/gf/v2/os/gcache"
"github.com/gogf/gf/v2/os/glog"
"home-network-watcher/manifest" "home-network-watcher/manifest"
"time" "time"
"home-network-watcher/api/data_core/v1" "home-network-watcher/api/data_core/v1"
) )
func (c *ControllerV1) GetNetworkDataSSE(ctx context.Context, _ *v1.GetNetworkDataSSEReq) (res *v1.GetNetworkDataSSERes, err error) { func (c *ControllerV1) GetNetworkDataSSE(ctx context.Context, _ *v1.GetNetworkDataSSEReq) (_ *v1.GetNetworkDataSSERes, err error) {
request := g.RequestFromCtx(ctx) request := g.RequestFromCtx(ctx)
request.Response.Header().Set("Content-Type", "text/event-stream") request.Response.Header().Set("Content-Type", "text/event-stream")
request.Response.Header().Set("Cache-Control", "no-cache") request.Response.Header().Set("Cache-Control", "no-cache")
@ -21,41 +22,30 @@ func (c *ControllerV1) GetNetworkDataSSE(ctx context.Context, _ *v1.GetNetworkDa
for { for {
// 从缓存中获取数据 // 从缓存中获取数据
nodeInfo, err := gcache.Get(ctx, manifest.ProxyNodeCacheKey) nodeInfo := gcache.MustGet(ctx, manifest.ProxyNodeCacheKey)
if err != nil { homeNetwork := gcache.MustGet(ctx, manifest.HomeNetworkCacheKey)
return nil, err proxyNetwork := gcache.MustGet(ctx, manifest.ProxyNetworkCacheKey)
} coffeeInfo := gcache.MustGet(ctx, manifest.ProxySubscribeCacheKey)
homeNetwork, err := gcache.Get(ctx, manifest.HomeNetworkCacheKey) serverInfo := gcache.MustGet(ctx, manifest.ServerDataCacheKey)
if err != nil {
return nil, err resJson := gjson.New(&v1.GetNetworkDataSSERes{
}
proxyNetwork, err := gcache.Get(ctx, manifest.ProxyNetworkCacheKey)
if err != nil {
return nil, err
}
coffeeInfo, err := gcache.Get(ctx, manifest.ProxySubscribeCacheKey)
if err != nil {
return nil, err
}
serverInfo, err := gcache.Get(ctx, manifest.ServerDataCacheKey)
if err != nil {
return nil, err
}
res = &v1.GetNetworkDataSSERes{
NodeInfo: nodeInfo, NodeInfo: nodeInfo,
HomeNetwork: homeNetwork, HomeNetwork: homeNetwork,
ProxyNetwork: proxyNetwork, ProxyNetwork: proxyNetwork,
CoffeeInfo: coffeeInfo, CoffeeInfo: coffeeInfo,
ServerInfo: serverInfo, ServerInfo: serverInfo,
} }).MustToJsonString()
// 发送数据 // 发送数据
request.Response.Writefln("data: " + gjson.New(res).MustToJsonString() + "\n") request.Response.Writefln("data: " + resJson + "\n")
request.Response.Flush() request.Response.Flush()
// 等待1秒或者上下文取消 // 等待1秒或者上下文取消
select { select {
case <-time.After(1 * time.Second): case <-time.After(1 * time.Second):
case <-ctx.Done(): case <-ctx.Done():
glog.Info(ctx, "GetNetworkDataSSE: ctx.Done()")
request.ExitAll()
return nil, ctx.Err() return nil, ctx.Err()
} }
} }

View File

@ -5,12 +5,13 @@ import (
"github.com/gogf/gf/v2/encoding/gjson" "github.com/gogf/gf/v2/encoding/gjson"
"github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gcache" "github.com/gogf/gf/v2/os/gcache"
"github.com/gogf/gf/v2/os/glog"
"home-network-watcher/api/data_core/v1" "home-network-watcher/api/data_core/v1"
"home-network-watcher/manifest" "home-network-watcher/manifest"
"time" "time"
) )
func (c *ControllerV1) GetUptimeDataSSE(ctx context.Context, _ *v1.GetUptimeDataSSEReq) (res *v1.GetUptimeDataSSERes, err error) { func (c *ControllerV1) GetUptimeDataSSE(ctx context.Context, _ *v1.GetUptimeDataSSEReq) (_ *v1.GetUptimeDataSSERes, err error) {
request := g.RequestFromCtx(ctx) request := g.RequestFromCtx(ctx)
request.Response.Header().Set("Content-Type", "text/event-stream") request.Response.Header().Set("Content-Type", "text/event-stream")
request.Response.Header().Set("Cache-Control", "no-cache") request.Response.Header().Set("Cache-Control", "no-cache")
@ -20,19 +21,18 @@ func (c *ControllerV1) GetUptimeDataSSE(ctx context.Context, _ *v1.GetUptimeData
for { for {
// 从缓存中获取数据 // 从缓存中获取数据
uptimeData, err := gcache.Get(ctx, manifest.UptimeCacheKey) uptimeData := gcache.MustGet(ctx, manifest.UptimeCacheKey)
if err != nil { resJson := gjson.New(&v1.GetUptimeDataSSERes{UptimeData: uptimeData}).MustToJsonString()
return nil, err
}
res = &v1.GetUptimeDataSSERes{UptimeData: uptimeData}
// 发送数据 // 发送数据
request.Response.Writefln("data: " + gjson.New(res).MustToJsonString() + "\n") request.Response.Writefln("data: " + resJson + "\n")
request.Response.Flush() request.Response.Flush()
// 等待10秒或者上下文取消 // 等待10秒或者上下文取消
select { select {
case <-time.After(10 * time.Second): case <-time.After(10 * time.Second):
case <-ctx.Done(): case <-ctx.Done():
glog.Info(ctx, "GetUptimeDataSSE: ctx.Done()")
request.ExitAll()
return nil, ctx.Err() return nil, ctx.Err()
} }
} }

View File

@ -5,13 +5,13 @@ import (
"github.com/gogf/gf/v2/encoding/gjson" "github.com/gogf/gf/v2/encoding/gjson"
"github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gcache" "github.com/gogf/gf/v2/os/gcache"
"github.com/gogf/gf/v2/os/glog"
"home-network-watcher/api/data_core/v1"
"home-network-watcher/manifest" "home-network-watcher/manifest"
"time" "time"
"home-network-watcher/api/data_core/v1"
) )
func (c *ControllerV1) GetXuiDataSSE(ctx context.Context, _ *v1.GetXuiDataSSEReq) (res *v1.GetXuiDataSSERes, err error) { func (c *ControllerV1) GetXuiDataSSE(ctx context.Context, _ *v1.GetXuiDataSSEReq) (_ *v1.GetXuiDataSSERes, err error) {
request := g.RequestFromCtx(ctx) request := g.RequestFromCtx(ctx)
request.Response.Header().Set("Content-Type", "text/event-stream") request.Response.Header().Set("Content-Type", "text/event-stream")
request.Response.Header().Set("Cache-Control", "no-cache") request.Response.Header().Set("Cache-Control", "no-cache")
@ -21,15 +21,20 @@ func (c *ControllerV1) GetXuiDataSSE(ctx context.Context, _ *v1.GetXuiDataSSEReq
for { for {
// 从缓存中获取数据 // 从缓存中获取数据
xuiData, err := gcache.Get(context.Background(), manifest.XUIUserListCacheKey) xuiData := gcache.MustGet(context.Background(), manifest.XUIUserListCacheKey)
if err != nil { resJson := gjson.New(&v1.GetXuiDataSSERes{XuiData: xuiData}).MustToJsonString()
return nil, err
}
res = &v1.GetXuiDataSSERes{XuiData: xuiData}
// 发送数据 // 发送数据
request.Response.Writefln("data: " + gjson.New(res).MustToJsonString() + "\n") request.Response.Writefln("data: " + resJson + "\n")
request.Response.Flush() request.Response.Flush()
time.Sleep(5 * time.Second)
// 等待1秒或者上下文取消
select {
case <-time.After(1 * time.Second):
case <-ctx.Done():
glog.Info(ctx, "GetXuiDataSSE: ctx.Done()")
request.ExitAll()
return nil, ctx.Err()
}
} }
} }