diff --git a/plugin/client_rpc.go b/plugin/client_rpc.go index 7f04dc406b..5446b40425 100644 --- a/plugin/client_rpc.go +++ b/plugin/client_rpc.go @@ -19,6 +19,7 @@ import ( "net/rpc" "os" "reflect" + "sync" "github.com/dyatlov/go-opengraph/opengraph" "github.com/go-sql-driver/mysql" @@ -38,6 +39,7 @@ type hooksRPCClient struct { apiImpl API driver Driver implemented [TotalHooksID]bool + doneWg sync.WaitGroup } type hooksRPCServer struct { @@ -240,15 +242,23 @@ type Z_OnActivateReturns struct { func (g *hooksRPCClient) OnActivate() error { muxId := g.muxBroker.NextId() - go g.muxBroker.AcceptAndServe(muxId, &apiRPCServer{ - impl: g.apiImpl, - muxBroker: g.muxBroker, - }) + g.doneWg.Add(1) + go func() { + defer g.doneWg.Done() + g.muxBroker.AcceptAndServe(muxId, &apiRPCServer{ + impl: g.apiImpl, + muxBroker: g.muxBroker, + }) + }() nextID := g.muxBroker.NextId() - go g.muxBroker.AcceptAndServe(nextID, &dbRPCServer{ - dbImpl: g.driver, - }) + g.doneWg.Add(1) + go func() { + defer g.doneWg.Done() + g.muxBroker.AcceptAndServe(nextID, &dbRPCServer{ + dbImpl: g.driver, + }) + }() _args := &Z_OnActivateArgs{ APIMuxId: muxId, diff --git a/plugin/supervisor.go b/plugin/supervisor.go index 1da4136a73..883321fbcc 100644 --- a/plugin/supervisor.go +++ b/plugin/supervisor.go @@ -25,6 +25,7 @@ type supervisor struct { hooks Hooks implemented [TotalHooksID]bool pid int + hooksClient *hooksRPCClient } func newSupervisor(pluginInfo *model.BundleInfo, apiImpl API, driver Driver, parentLogger *mlog.Logger, metrics einterfaces.MetricsInterface) (retSupervisor *supervisor, retErr error) { @@ -83,6 +84,11 @@ func newSupervisor(pluginInfo *model.BundleInfo, apiImpl API, driver Driver, par return nil, err } + c, ok := raw.(*hooksRPCClient) + if ok { + sup.hooksClient = c + } + sup.hooks = &hooksTimerLayer{pluginInfo.Manifest.Id, raw.(Hooks), metrics} impl, err := sup.hooks.Implemented() @@ -104,6 +110,11 @@ func (sup *supervisor) Shutdown() { if sup.client != nil { sup.client.Kill() } + + // Wait for API RPC server and DB RPC server to exit. + if sup.hooksClient != nil { + sup.hooksClient.doneWg.Wait() + } } func (sup *supervisor) Hooks() Hooks {