fix: memory leak due to the gRPC connect keep (#313)

Co-authored-by: rick <LinuxSuRen@users.noreply.github.com>
This commit is contained in:
Rick 2023-12-13 18:47:38 +08:00 committed by GitHub
parent be3976d91d
commit a324fb1bbe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 32 additions and 0 deletions

View File

@ -278,6 +278,7 @@ func (s *server) GetVersion(ctx context.Context, in *Empty) (reply *HelloReply,
func (s *server) GetSuites(ctx context.Context, in *Empty) (reply *Suites, err error) { func (s *server) GetSuites(ctx context.Context, in *Empty) (reply *Suites, err error) {
loader := s.getLoader(ctx) loader := s.getLoader(ctx)
defer loader.Close()
reply = &Suites{ reply = &Suites{
Data: make(map[string]*Items), Data: make(map[string]*Items),
} }
@ -300,6 +301,7 @@ func (s *server) GetSuites(ctx context.Context, in *Empty) (reply *Suites, err e
func (s *server) CreateTestSuite(ctx context.Context, in *TestSuiteIdentity) (reply *HelloReply, err error) { func (s *server) CreateTestSuite(ctx context.Context, in *TestSuiteIdentity) (reply *HelloReply, err error) {
reply = &HelloReply{} reply = &HelloReply{}
loader := s.getLoader(ctx) loader := s.getLoader(ctx)
defer loader.Close()
if loader == nil { if loader == nil {
reply.Error = "no loader found" reply.Error = "no loader found"
} else { } else {
@ -348,6 +350,7 @@ func (s *server) ImportTestSuite(ctx context.Context, in *TestSuiteSource) (resu
} }
loader := s.getLoader(ctx) loader := s.getLoader(ctx)
defer loader.Close()
if err = loader.CreateSuite(suite.Name, suite.API); err != nil { if err = loader.CreateSuite(suite.Name, suite.API); err != nil {
return return
@ -364,6 +367,7 @@ func (s *server) ImportTestSuite(ctx context.Context, in *TestSuiteSource) (resu
func (s *server) GetTestSuite(ctx context.Context, in *TestSuiteIdentity) (result *TestSuite, err error) { func (s *server) GetTestSuite(ctx context.Context, in *TestSuiteIdentity) (result *TestSuite, err error) {
loader := s.getLoader(ctx) loader := s.getLoader(ctx)
defer loader.Close()
var suite *testing.TestSuite var suite *testing.TestSuite
if suite, _, err = loader.GetSuite(in.Name); err == nil && suite != nil { if suite, _, err = loader.GetSuite(in.Name); err == nil && suite != nil {
result = ToGRPCSuite(suite) result = ToGRPCSuite(suite)
@ -374,6 +378,7 @@ func (s *server) GetTestSuite(ctx context.Context, in *TestSuiteIdentity) (resul
func (s *server) UpdateTestSuite(ctx context.Context, in *TestSuite) (reply *HelloReply, err error) { func (s *server) UpdateTestSuite(ctx context.Context, in *TestSuite) (reply *HelloReply, err error) {
reply = &HelloReply{} reply = &HelloReply{}
loader := s.getLoader(ctx) loader := s.getLoader(ctx)
defer loader.Close()
err = loader.UpdateSuite(*ToNormalSuite(in)) err = loader.UpdateSuite(*ToNormalSuite(in))
return return
} }
@ -381,6 +386,7 @@ func (s *server) UpdateTestSuite(ctx context.Context, in *TestSuite) (reply *Hel
func (s *server) DeleteTestSuite(ctx context.Context, in *TestSuiteIdentity) (reply *HelloReply, err error) { func (s *server) DeleteTestSuite(ctx context.Context, in *TestSuiteIdentity) (reply *HelloReply, err error) {
reply = &HelloReply{} reply = &HelloReply{}
loader := s.getLoader(ctx) loader := s.getLoader(ctx)
defer loader.Close()
err = loader.DeleteSuite(in.Name) err = loader.DeleteSuite(in.Name)
return return
} }
@ -388,6 +394,7 @@ func (s *server) DeleteTestSuite(ctx context.Context, in *TestSuiteIdentity) (re
func (s *server) ListTestCase(ctx context.Context, in *TestSuiteIdentity) (result *Suite, err error) { func (s *server) ListTestCase(ctx context.Context, in *TestSuiteIdentity) (result *Suite, err error) {
var items []testing.TestCase var items []testing.TestCase
loader := s.getLoader(ctx) loader := s.getLoader(ctx)
defer loader.Close()
if items, err = loader.ListTestCase(in.Name); err == nil { if items, err = loader.ListTestCase(in.Name); err == nil {
result = &Suite{} result = &Suite{}
for _, item := range items { for _, item := range items {
@ -400,6 +407,7 @@ func (s *server) ListTestCase(ctx context.Context, in *TestSuiteIdentity) (resul
func (s *server) GetTestCase(ctx context.Context, in *TestCaseIdentity) (reply *TestCase, err error) { func (s *server) GetTestCase(ctx context.Context, in *TestCaseIdentity) (reply *TestCase, err error) {
var result testing.TestCase var result testing.TestCase
loader := s.getLoader(ctx) loader := s.getLoader(ctx)
defer loader.Close()
if result, err = loader.GetTestCase(in.Suite, in.Testcase); err == nil { if result, err = loader.GetTestCase(in.Suite, in.Testcase); err == nil {
reply = ToGRPCTestCase(result) reply = ToGRPCTestCase(result)
} }
@ -410,6 +418,7 @@ func (s *server) RunTestCase(ctx context.Context, in *TestCaseIdentity) (result
var targetTestSuite testing.TestSuite var targetTestSuite testing.TestSuite
loader := s.getLoader(ctx) loader := s.getLoader(ctx)
defer loader.Close()
targetTestSuite, err = loader.GetTestSuite(in.Suite, true) targetTestSuite, err = loader.GetTestSuite(in.Suite, true)
if err != nil { if err != nil {
err = nil err = nil
@ -519,6 +528,7 @@ func (s *server) CreateTestCase(ctx context.Context, in *TestCaseWithSuite) (rep
err = errors.New("data is required") err = errors.New("data is required")
} else { } else {
loader := s.getLoader(ctx) loader := s.getLoader(ctx)
defer loader.Close()
err = loader.CreateTestCase(in.SuiteName, ToNormalTestCase(in.Data)) err = loader.CreateTestCase(in.SuiteName, ToNormalTestCase(in.Data))
} }
return return
@ -531,12 +541,14 @@ func (s *server) UpdateTestCase(ctx context.Context, in *TestCaseWithSuite) (rep
return return
} }
loader := s.getLoader(ctx) loader := s.getLoader(ctx)
defer loader.Close()
err = loader.UpdateTestCase(in.SuiteName, ToNormalTestCase(in.Data)) err = loader.UpdateTestCase(in.SuiteName, ToNormalTestCase(in.Data))
return return
} }
func (s *server) DeleteTestCase(ctx context.Context, in *TestCaseIdentity) (reply *HelloReply, err error) { func (s *server) DeleteTestCase(ctx context.Context, in *TestCaseIdentity) (reply *HelloReply, err error) {
loader := s.getLoader(ctx) loader := s.getLoader(ctx)
defer loader.Close()
reply = &HelloReply{} reply = &HelloReply{}
err = loader.DeleteTestCase(in.Suite, in.Testcase) err = loader.DeleteTestCase(in.Suite, in.Testcase)
return return
@ -609,6 +621,7 @@ func (s *server) ConvertTestSuite(ctx context.Context, in *CodeGenerateRequest)
} else { } else {
var result testing.TestSuite var result testing.TestSuite
loader := s.getLoader(ctx) loader := s.getLoader(ctx)
defer loader.Close()
if result, err = loader.GetTestSuite(in.TestSuite, true); err == nil { if result, err = loader.GetTestSuite(in.TestSuite, true); err == nil {
output, genErr := instance.Convert(&result) output, genErr := instance.Convert(&result)
reply.Success = genErr == nil reply.Success = genErr == nil
@ -640,6 +653,7 @@ func (s *server) GetSuggestedAPIs(ctx context.Context, in *TestSuiteIdentity) (r
var suite *testing.TestSuite var suite *testing.TestSuite
loader := s.getLoader(ctx) loader := s.getLoader(ctx)
defer loader.Close()
if suite, _, err = loader.GetSuite(in.Name); err != nil || suite == nil { if suite, _, err = loader.GetSuite(in.Name); err != nil || suite == nil {
return return
} }
@ -815,6 +829,7 @@ func (s *server) UpdateSecret(ctx context.Context, in *Secret) (reply *CommonRes
} }
func (s *server) PProf(ctx context.Context, in *PProfRequest) (reply *PProfData, err error) { func (s *server) PProf(ctx context.Context, in *PProfRequest) (reply *PProfData, err error) {
loader := s.getLoader(ctx) loader := s.getLoader(ctx)
defer loader.Close()
reply = &PProfData{ reply = &PProfData{
Data: loader.PProf(in.Name), Data: loader.PProf(in.Name),
} }

View File

@ -52,4 +52,5 @@ type Writer interface {
GetSuite(name string) (*TestSuite, string, error) GetSuite(name string) (*TestSuite, string, error)
UpdateSuite(TestSuite) (err error) UpdateSuite(TestSuite) (err error)
DeleteSuite(name string) (err error) DeleteSuite(name string) (err error)
Close()
} }

View File

@ -425,3 +425,7 @@ func (l *fileLoader) PProf(string) []byte {
// not support // not support
return nil return nil
} }
func (l *fileLoader) Close() {
// not support
}

View File

@ -114,3 +114,7 @@ func (l *nonLoader) PProf(string) []byte {
// not support // not support
return nil return nil
} }
func (l *nonLoader) Close() {
// not support
}

View File

@ -39,6 +39,7 @@ type gRPCLoader struct {
store *testing.Store store *testing.Store
client LoaderClient client LoaderClient
ctx context.Context ctx context.Context
conn *grpc.ClientConn
} }
func NewGRPCloaderFromStore() testing.StoreWriterFactory { func NewGRPCloaderFromStore() testing.StoreWriterFactory {
@ -54,6 +55,7 @@ func (g *gRPCLoader) NewInstance(store testing.Store) (writer testing.Writer, er
store: &store, store: &store,
ctx: WithStoreContext(context.Background(), &store), ctx: WithStoreContext(context.Background(), &store),
client: NewLoaderClient(conn), client: NewLoaderClient(conn),
conn: conn,
} }
} }
return return
@ -213,3 +215,9 @@ func (g *gRPCLoader) PProf(name string) []byte {
} }
return data.Data return data.Data
} }
func (g *gRPCLoader) Close() {
if g.conn != nil {
g.conn.Close()
}
}