Skip to content

Commit 0b2bf2b

Browse files
committed
fix:修复defer用法不当导致内存泄漏问题
1 parent b319ffa commit 0b2bf2b

File tree

4 files changed

+110
-111
lines changed

4 files changed

+110
-111
lines changed

apiserver/grpcserver/config/client_access.go

Lines changed: 59 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -182,62 +182,67 @@ func (g *ConfigGRPCServer) Discover(svr apiconfig.PolarisConfigGRPC_DiscoverServ
182182
continue
183183
}
184184

185-
var out *apiconfig.ConfigDiscoverResponse
186-
var action string
187-
startTime := commontime.CurrentMillisecond()
188-
defer func() {
189-
plugin.GetStatis().ReportDiscoverCall(metrics.ClientDiscoverMetric{
190-
Action: action,
191-
ClientIP: utils.ParseClientAddress(ctx),
192-
Namespace: in.GetConfigFile().GetNamespace().GetValue(),
193-
Resource: metrics.ResourceOfConfigFile(in.GetConfigFile().GetGroup().GetValue(), in.GetConfigFile().GetFileName().GetValue()),
194-
Timestamp: startTime,
195-
CostTime: commontime.CurrentMillisecond() - startTime,
196-
Revision: out.GetRevision(),
197-
Success: out.GetCode() > uint32(apimodel.Code_DataNoChange),
198-
})
199-
}()
200-
201-
switch in.Type {
202-
case apiconfig.ConfigDiscoverRequest_CONFIG_FILE:
203-
action = metrics.ActionGetConfigFile
204-
version, _ := strconv.ParseUint(in.GetRevision(), 10, 64)
205-
ret := g.configServer.GetConfigFileWithCache(ctx, &apiconfig.ClientConfigFileInfo{
206-
Namespace: in.GetConfigFile().GetNamespace(),
207-
Group: in.GetConfigFile().GetGroup(),
208-
FileName: in.GetConfigFile().GetFileName(),
209-
Version: wrapperspb.UInt64(version),
210-
PublicKey: in.GetConfigFile().GetPublicKey(),
211-
})
212-
out = api.NewConfigDiscoverResponse(apimodel.Code(ret.GetCode().GetValue()))
213-
out.ConfigFile = ret.GetConfigFile()
214-
out.Type = apiconfig.ConfigDiscoverResponse_CONFIG_FILE
215-
out.Revision = strconv.Itoa(int(out.GetConfigFile().GetVersion().GetValue()))
216-
case apiconfig.ConfigDiscoverRequest_CONFIG_FILE_Names:
217-
action = metrics.ActionListConfigFiles
218-
ret := g.configServer.GetConfigFileNamesWithCache(ctx, &apiconfig.ConfigFileGroupRequest{
219-
Revision: wrapperspb.String(in.GetRevision()),
220-
ConfigFileGroup: &apiconfig.ConfigFileGroup{
221-
Namespace: in.GetConfigFile().GetNamespace(),
222-
Name: in.GetConfigFile().GetGroup(),
223-
},
224-
})
225-
out = api.NewConfigDiscoverResponse(apimodel.Code(ret.GetCode().GetValue()))
226-
out.ConfigFileNames = ret.GetConfigFileInfos()
227-
out.Type = apiconfig.ConfigDiscoverResponse_CONFIG_FILE_Names
228-
out.Revision = ret.GetRevision().GetValue()
229-
case apiconfig.ConfigDiscoverRequest_CONFIG_FILE_GROUPS:
230-
action = metrics.ActionListConfigGroups
231-
req := in.GetConfigFile()
232-
req.Md5 = wrapperspb.String(in.GetRevision())
233-
out = g.configServer.GetConfigGroupsWithCache(ctx, req)
234-
out.Type = apiconfig.ConfigDiscoverResponse_CONFIG_FILE_GROUPS
235-
default:
236-
out = api.NewConfigDiscoverResponse(apimodel.Code_InvalidDiscoverResource)
237-
}
238-
185+
out := g.handleDiscoverRequest(ctx, in)
239186
if err := svr.Send(out); err != nil {
240187
return err
241188
}
242189
}
243190
}
191+
192+
func (g *ConfigGRPCServer) handleDiscoverRequest(ctx context.Context, in *apiconfig.ConfigDiscoverRequest) *apiconfig.ConfigDiscoverResponse {
193+
var out *apiconfig.ConfigDiscoverResponse
194+
var action string
195+
startTime := commontime.CurrentMillisecond()
196+
defer func() {
197+
plugin.GetStatis().ReportDiscoverCall(metrics.ClientDiscoverMetric{
198+
Action: action,
199+
ClientIP: utils.ParseClientAddress(ctx),
200+
Namespace: in.GetConfigFile().GetNamespace().GetValue(),
201+
Resource: metrics.ResourceOfConfigFile(in.GetConfigFile().GetGroup().GetValue(), in.GetConfigFile().GetFileName().GetValue()),
202+
Timestamp: startTime,
203+
CostTime: commontime.CurrentMillisecond() - startTime,
204+
Revision: out.GetRevision(),
205+
Success: out.GetCode() > uint32(apimodel.Code_DataNoChange),
206+
})
207+
}()
208+
209+
switch in.Type {
210+
case apiconfig.ConfigDiscoverRequest_CONFIG_FILE:
211+
action = metrics.ActionGetConfigFile
212+
version, _ := strconv.ParseUint(in.GetRevision(), 10, 64)
213+
ret := g.configServer.GetConfigFileWithCache(ctx, &apiconfig.ClientConfigFileInfo{
214+
Namespace: in.GetConfigFile().GetNamespace(),
215+
Group: in.GetConfigFile().GetGroup(),
216+
FileName: in.GetConfigFile().GetFileName(),
217+
Version: wrapperspb.UInt64(version),
218+
PublicKey: in.GetConfigFile().GetPublicKey(),
219+
})
220+
out = api.NewConfigDiscoverResponse(apimodel.Code(ret.GetCode().GetValue()))
221+
out.ConfigFile = ret.GetConfigFile()
222+
out.Type = apiconfig.ConfigDiscoverResponse_CONFIG_FILE
223+
out.Revision = strconv.Itoa(int(out.GetConfigFile().GetVersion().GetValue()))
224+
case apiconfig.ConfigDiscoverRequest_CONFIG_FILE_Names:
225+
action = metrics.ActionListConfigFiles
226+
ret := g.configServer.GetConfigFileNamesWithCache(ctx, &apiconfig.ConfigFileGroupRequest{
227+
Revision: wrapperspb.String(in.GetRevision()),
228+
ConfigFileGroup: &apiconfig.ConfigFileGroup{
229+
Namespace: in.GetConfigFile().GetNamespace(),
230+
Name: in.GetConfigFile().GetGroup(),
231+
},
232+
})
233+
out = api.NewConfigDiscoverResponse(apimodel.Code(ret.GetCode().GetValue()))
234+
out.ConfigFileNames = ret.GetConfigFileInfos()
235+
out.Type = apiconfig.ConfigDiscoverResponse_CONFIG_FILE_Names
236+
out.Revision = ret.GetRevision().GetValue()
237+
case apiconfig.ConfigDiscoverRequest_CONFIG_FILE_GROUPS:
238+
action = metrics.ActionListConfigGroups
239+
req := in.GetConfigFile()
240+
req.Md5 = wrapperspb.String(in.GetRevision())
241+
out = g.configServer.GetConfigGroupsWithCache(ctx, req)
242+
out.Type = apiconfig.ConfigDiscoverResponse_CONFIG_FILE_GROUPS
243+
default:
244+
out = api.NewConfigDiscoverResponse(apimodel.Code_InvalidDiscoverResource)
245+
}
246+
247+
return out
248+
}

apiserver/grpcserver/discover/v1/client_access.go

Lines changed: 49 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -128,55 +128,59 @@ func (g *DiscoverServer) Discover(server apiservice.PolarisGRPC_DiscoverServer)
128128
continue
129129
}
130130

131-
var out *apiservice.DiscoverResponse
132-
var action string
133-
startTime := commontime.CurrentMillisecond()
134-
defer func() {
135-
plugin.GetStatis().ReportDiscoverCall(metrics.ClientDiscoverMetric{
136-
Action: action,
137-
ClientIP: utils.ParseClientAddress(ctx),
138-
Namespace: in.GetService().GetNamespace().GetValue(),
139-
Resource: in.GetType().String() + ":" + in.GetService().GetName().GetValue(),
140-
Timestamp: startTime,
141-
CostTime: commontime.CurrentMillisecond() - startTime,
142-
Revision: out.GetService().GetRevision().GetValue(),
143-
Success: out.GetCode().GetValue() > uint32(apimodel.Code_DataNoChange),
144-
})
145-
}()
146-
147-
// 兼容。如果请求中带了token,优先使用该token
148-
if in.GetService().GetToken().GetValue() != "" {
149-
ctx = context.WithValue(ctx, utils.ContextAuthTokenKey, in.GetService().GetToken().GetValue())
131+
out := g.handleDiscoverRequest(ctx, in)
132+
if err = server.Send(out); err != nil {
133+
return err
150134
}
135+
}
136+
}
151137

152-
switch in.Type {
153-
case apiservice.DiscoverRequest_INSTANCE:
154-
action = metrics.ActionDiscoverInstance
155-
out = g.namingServer.ServiceInstancesCache(ctx, &apiservice.DiscoverFilter{}, in.Service)
156-
case apiservice.DiscoverRequest_ROUTING:
157-
action = metrics.ActionDiscoverRouterRule
158-
out = g.namingServer.GetRoutingConfigWithCache(ctx, in.Service)
159-
case apiservice.DiscoverRequest_RATE_LIMIT:
160-
action = metrics.ActionDiscoverRateLimit
161-
out = g.namingServer.GetRateLimitWithCache(ctx, in.Service)
162-
case apiservice.DiscoverRequest_CIRCUIT_BREAKER:
163-
action = metrics.ActionDiscoverCircuitBreaker
164-
out = g.namingServer.GetCircuitBreakerWithCache(ctx, in.Service)
165-
case apiservice.DiscoverRequest_SERVICES:
166-
action = metrics.ActionDiscoverServices
167-
out = g.namingServer.GetServiceWithCache(ctx, in.Service)
168-
case apiservice.DiscoverRequest_FAULT_DETECTOR:
169-
action = metrics.ActionDiscoverFaultDetect
170-
out = g.namingServer.GetFaultDetectWithCache(ctx, in.Service)
171-
default:
172-
out = api.NewDiscoverRoutingResponse(apimodel.Code_InvalidDiscoverResource, in.Service)
173-
}
138+
func (g *DiscoverServer) handleDiscoverRequest(ctx context.Context, in *apiservice.DiscoverRequest) *apiservice.DiscoverResponse {
139+
var out *apiservice.DiscoverResponse
140+
var action string
141+
startTime := commontime.CurrentMillisecond()
142+
defer func() {
143+
plugin.GetStatis().ReportDiscoverCall(metrics.ClientDiscoverMetric{
144+
Action: action,
145+
ClientIP: utils.ParseClientAddress(ctx),
146+
Namespace: in.GetService().GetNamespace().GetValue(),
147+
Resource: in.GetType().String() + ":" + in.GetService().GetName().GetValue(),
148+
Timestamp: startTime,
149+
CostTime: commontime.CurrentMillisecond() - startTime,
150+
Revision: out.GetService().GetRevision().GetValue(),
151+
Success: out.GetCode().GetValue() > uint32(apimodel.Code_DataNoChange),
152+
})
153+
}()
154+
155+
// 兼容。如果请求中带了token,优先使用该token
156+
if in.GetService().GetToken().GetValue() != "" {
157+
ctx = context.WithValue(ctx, utils.ContextAuthTokenKey, in.GetService().GetToken().GetValue())
158+
}
174159

175-
err = server.Send(out)
176-
if err != nil {
177-
return err
178-
}
160+
switch in.Type {
161+
case apiservice.DiscoverRequest_INSTANCE:
162+
action = metrics.ActionDiscoverInstance
163+
out = g.namingServer.ServiceInstancesCache(ctx, &apiservice.DiscoverFilter{}, in.Service)
164+
case apiservice.DiscoverRequest_ROUTING:
165+
action = metrics.ActionDiscoverRouterRule
166+
out = g.namingServer.GetRoutingConfigWithCache(ctx, in.Service)
167+
case apiservice.DiscoverRequest_RATE_LIMIT:
168+
action = metrics.ActionDiscoverRateLimit
169+
out = g.namingServer.GetRateLimitWithCache(ctx, in.Service)
170+
case apiservice.DiscoverRequest_CIRCUIT_BREAKER:
171+
action = metrics.ActionDiscoverCircuitBreaker
172+
out = g.namingServer.GetCircuitBreakerWithCache(ctx, in.Service)
173+
case apiservice.DiscoverRequest_SERVICES:
174+
action = metrics.ActionDiscoverServices
175+
out = g.namingServer.GetServiceWithCache(ctx, in.Service)
176+
case apiservice.DiscoverRequest_FAULT_DETECTOR:
177+
action = metrics.ActionDiscoverFaultDetect
178+
out = g.namingServer.GetFaultDetectWithCache(ctx, in.Service)
179+
default:
180+
out = api.NewDiscoverRoutingResponse(apimodel.Code_InvalidDiscoverResource, in.Service)
179181
}
182+
183+
return out
180184
}
181185

182186
func (g *DiscoverServer) ReportServiceContract(ctx context.Context, in *apiservice.ServiceContract) (*apiservice.Response, error) {

apiserver/nacosserver/v1/config/config_file.go

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,7 @@ import (
4242
)
4343

4444
func (n *ConfigServer) handlePublishConfig(ctx context.Context, req *model.ConfigFile) (bool, error) {
45-
var resp *config_manage.ConfigResponse
46-
if req.CasMd5 != "" {
47-
resp = n.configSvr.CasUpsertAndReleaseConfigFileFromClient(ctx, req.ToSpecConfigFile())
48-
} else {
49-
resp = n.configSvr.UpsertAndReleaseConfigFileFromClient(ctx, req.ToSpecConfigFile())
50-
}
51-
45+
resp := n.configSvr.UpsertAndReleaseConfigFileFromClient(ctx, req.ToSpecConfigFile())
5246
if resp.GetCode().GetValue() == uint32(apimodel.Code_ExecuteSuccess) {
5347
return true, nil
5448
}

apiserver/nacosserver/v2/config/config_file.go

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,7 @@ func (h *ConfigServer) handlePublishConfigRequest(ctx context.Context, req nacos
6262
})
6363
}()
6464

65-
if configReq.CasMd5 != "" {
66-
resp = h.configSvr.CasUpsertAndReleaseConfigFileFromClient(ctx, configReq.ToSpec())
67-
} else {
68-
resp = h.configSvr.UpsertAndReleaseConfigFileFromClient(ctx, configReq.ToSpec())
69-
}
65+
resp = h.configSvr.UpsertAndReleaseConfigFileFromClient(ctx, configReq.ToSpec())
7066
if resp.GetCode().GetValue() != uint32(apimodel.Code_ExecuteSuccess) {
7167
nacoslog.Error("[NACOS-V2][Config] publish config file fail", zap.String("tenant", configReq.Tenant),
7268
utils.ZapGroup(configReq.Group), utils.ZapFileName(configReq.DataId),

0 commit comments

Comments
 (0)