From a1044c1afc3fe4d96010a118afc5ec9b0fd09f8f Mon Sep 17 00:00:00 2001 From: Yousong Zhou Date: Tue, 20 Apr 2021 17:55:33 +0800 Subject: [PATCH 1/5] procutils: add WaitZombieLoop --- pkg/ansibleserver/service/service.go | 3 ++- pkg/{ansibleserver/service => util/procutils}/zombie.go | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) rename pkg/{ansibleserver/service => util/procutils}/zombie.go (97%) diff --git a/pkg/ansibleserver/service/service.go b/pkg/ansibleserver/service/service.go index 67c89c615f..3901aa1811 100644 --- a/pkg/ansibleserver/service/service.go +++ b/pkg/ansibleserver/service/service.go @@ -28,6 +28,7 @@ import ( common_app "yunion.io/x/onecloud/pkg/cloudcommon/app" "yunion.io/x/onecloud/pkg/cloudcommon/db" common_options "yunion.io/x/onecloud/pkg/cloudcommon/options" + "yunion.io/x/onecloud/pkg/util/procutils" ) func StartService() { @@ -49,7 +50,7 @@ func StartService() { db.EnsureAppInitSyncDB(app, dbOpts, models.InitDB) defer cloudcommon.CloseDB() - go ReapZomebieLoop(context.TODO()) + go procutils.WaitZombieLoop(context.TODO()) common_app.ServeForever(app, baseOpts) } diff --git a/pkg/ansibleserver/service/zombie.go b/pkg/util/procutils/zombie.go similarity index 97% rename from pkg/ansibleserver/service/zombie.go rename to pkg/util/procutils/zombie.go index 224e054df6..7127c09a9d 100644 --- a/pkg/ansibleserver/service/zombie.go +++ b/pkg/util/procutils/zombie.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package service +package procutils import ( "context" @@ -28,7 +28,7 @@ import ( "yunion.io/x/log" ) -func ReapZomebieLoop(ctx context.Context) { +func WaitZombieLoop(ctx context.Context) { myPid := os.Getpid() if myPid != 1 { log.Infof("My pid is not 1 and no need to wait zombies") From 26013e66bfedcc93c0b8aa97350de18f18cc41fe Mon Sep 17 00:00:00 2001 From: Yousong Zhou Date: Tue, 20 Apr 2021 17:53:38 +0800 Subject: [PATCH 2/5] procutils: WaitZombieLoop: use const str "1" for my pid --- pkg/util/procutils/zombie.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pkg/util/procutils/zombie.go b/pkg/util/procutils/zombie.go index 7127c09a9d..240ca212dd 100644 --- a/pkg/util/procutils/zombie.go +++ b/pkg/util/procutils/zombie.go @@ -16,7 +16,6 @@ package procutils import ( "context" - "fmt" "io/ioutil" "os" "path/filepath" @@ -34,7 +33,7 @@ func WaitZombieLoop(ctx context.Context) { log.Infof("My pid is not 1 and no need to wait zombies") return } - myPidStr := fmt.Sprintf("%d", myPid) + const myPidStr = "1" tick := time.NewTicker(31 * time.Second) for { From f970e22b97a1f330ea58e8779198d8491c2207bd Mon Sep 17 00:00:00 2001 From: Yousong Zhou Date: Tue, 20 Apr 2021 18:00:07 +0800 Subject: [PATCH 3/5] procutils: WaitZombieLoop: less verbose iota --- pkg/util/procutils/zombie.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pkg/util/procutils/zombie.go b/pkg/util/procutils/zombie.go index 240ca212dd..ebedc9afef 100644 --- a/pkg/util/procutils/zombie.go +++ b/pkg/util/procutils/zombie.go @@ -68,11 +68,11 @@ func WaitZombieLoop(ctx context.Context) { dataStr := string(data) items := strings.Split(dataStr, " ") const ( - idxPid = iota - idxName = iota - idxState = iota - idxPpid = iota - idxMinLen = iota + idxPid = iota + idxName + idxState + idxPpid + idxMinLen ) if len(items) < idxMinLen { log.Errorf("%s contains less than %d items: %s", statPath, idxMinLen, dataStr) From 709ddccc2f82e99e34e33b806f49c208b9b7cbc0 Mon Sep 17 00:00:00 2001 From: Yousong Zhou Date: Tue, 20 Apr 2021 19:21:34 +0800 Subject: [PATCH 4/5] procutils: WaitZombieLoop: remove unneeded info request --- pkg/util/procutils/zombie.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/pkg/util/procutils/zombie.go b/pkg/util/procutils/zombie.go index ebedc9afef..629d964c02 100644 --- a/pkg/util/procutils/zombie.go +++ b/pkg/util/procutils/zombie.go @@ -96,11 +96,7 @@ func WaitZombieLoop(ctx context.Context) { log.Errorf("%s: %s has invalid pid number %q: %v", pname, statPath, pidStr, err) continue } - var ( - status syscall.WaitStatus - rusage syscall.Rusage - ) - pid1, err := syscall.Wait4(pid, &status, 0, &rusage) + pid1, err := syscall.Wait4(pid, nil, 0, nil) if err != nil { log.Errorf("%s: %s: wait error: %v", pname, statPath, err) continue From 3a18af8d72423d26583642c2dfa86fce5521aaa5 Mon Sep 17 00:00:00 2001 From: Yousong Zhou Date: Tue, 20 Apr 2021 19:19:04 +0800 Subject: [PATCH 5/5] treewide: wait possible zombies --- cmd/ansibleserver/main.go | 5 +++++ cmd/baremetal-agent/main.go | 5 +++++ cmd/esxi-agent/main.go | 5 +++++ cmd/glance/main.go | 5 +++++ cmd/host-deployer/main.go | 9 ++++++++- cmd/host/main.go | 5 +++++ cmd/vpcagent/main.go | 7 ++++++- pkg/ansibleserver/service/service.go | 4 ---- 8 files changed, 39 insertions(+), 6 deletions(-) diff --git a/cmd/ansibleserver/main.go b/cmd/ansibleserver/main.go index f09145d42b..8220bf3c0f 100644 --- a/cmd/ansibleserver/main.go +++ b/cmd/ansibleserver/main.go @@ -15,9 +15,14 @@ package main import ( + "context" + "yunion.io/x/onecloud/pkg/ansibleserver/service" + "yunion.io/x/onecloud/pkg/util/procutils" ) func main() { + go procutils.WaitZombieLoop(context.TODO()) + service.StartService() } diff --git a/cmd/baremetal-agent/main.go b/cmd/baremetal-agent/main.go index 46d9fa37e6..c950f1e3d7 100644 --- a/cmd/baremetal-agent/main.go +++ b/cmd/baremetal-agent/main.go @@ -15,12 +15,17 @@ package main import ( + "context" + "yunion.io/x/onecloud/pkg/baremetal/service" "yunion.io/x/onecloud/pkg/util/atexit" + "yunion.io/x/onecloud/pkg/util/procutils" ) func main() { defer atexit.Handle() + go procutils.WaitZombieLoop(context.TODO()) + service.New().StartService() } diff --git a/cmd/esxi-agent/main.go b/cmd/esxi-agent/main.go index 2cdf1e65ec..673c716704 100644 --- a/cmd/esxi-agent/main.go +++ b/cmd/esxi-agent/main.go @@ -15,12 +15,17 @@ package main import ( + "context" + "yunion.io/x/onecloud/pkg/esxi/service" "yunion.io/x/onecloud/pkg/util/atexit" + "yunion.io/x/onecloud/pkg/util/procutils" ) func main() { defer atexit.Handle() + go procutils.WaitZombieLoop(context.TODO()) + service.New().StartService() } diff --git a/cmd/glance/main.go b/cmd/glance/main.go index f4026d2afb..f827cb9b41 100644 --- a/cmd/glance/main.go +++ b/cmd/glance/main.go @@ -15,12 +15,17 @@ package main import ( + "context" + "yunion.io/x/onecloud/pkg/image/service" "yunion.io/x/onecloud/pkg/util/atexit" + "yunion.io/x/onecloud/pkg/util/procutils" ) func main() { defer atexit.Handle() + go procutils.WaitZombieLoop(context.TODO()) + service.StartService() } diff --git a/cmd/host-deployer/main.go b/cmd/host-deployer/main.go index 33b79a61fc..f258a8d505 100644 --- a/cmd/host-deployer/main.go +++ b/cmd/host-deployer/main.go @@ -14,9 +14,16 @@ package main -import "yunion.io/x/onecloud/pkg/hostman/hostdeployer/deployserver" +import ( + "context" + + "yunion.io/x/onecloud/pkg/hostman/hostdeployer/deployserver" + "yunion.io/x/onecloud/pkg/util/procutils" +) func main() { + go procutils.WaitZombieLoop(context.TODO()) + deployer := deployserver.NewDeployService() deployer.StartService() } diff --git a/cmd/host/main.go b/cmd/host/main.go index 83b9a74c76..6278d771e2 100644 --- a/cmd/host/main.go +++ b/cmd/host/main.go @@ -15,14 +15,19 @@ package main import ( + "context" + "yunion.io/x/onecloud/pkg/cloudcommon/service" "yunion.io/x/onecloud/pkg/hostman" "yunion.io/x/onecloud/pkg/util/atexit" + "yunion.io/x/onecloud/pkg/util/procutils" ) func main() { defer atexit.Handle() + go procutils.WaitZombieLoop(context.TODO()) + var srv = &hostman.SHostService{} srv.SServiceBase = &service.SServiceBase{ Service: srv, diff --git a/cmd/vpcagent/main.go b/cmd/vpcagent/main.go index fb3d69bc43..c2083f4b65 100644 --- a/cmd/vpcagent/main.go +++ b/cmd/vpcagent/main.go @@ -26,6 +26,7 @@ import ( app_common "yunion.io/x/onecloud/pkg/cloudcommon/app" common_options "yunion.io/x/onecloud/pkg/cloudcommon/options" "yunion.io/x/onecloud/pkg/util/atexit" + "yunion.io/x/onecloud/pkg/util/procutils" "yunion.io/x/onecloud/pkg/vpcagent/options" _ "yunion.io/x/onecloud/pkg/vpcagent/ovn" "yunion.io/x/onecloud/pkg/vpcagent/worker" @@ -52,8 +53,12 @@ func main() { } { + + ctx := context.Background() + ctx, cancelFunc := context.WithCancel(ctx) + go procutils.WaitZombieLoop(ctx) + wg := &sync.WaitGroup{} - ctx, cancelFunc := context.WithCancel(context.Background()) ctx = context.WithValue(ctx, "wg", wg) wg.Add(1) go w.Start(ctx) diff --git a/pkg/ansibleserver/service/service.go b/pkg/ansibleserver/service/service.go index 3901aa1811..4c891dcafe 100644 --- a/pkg/ansibleserver/service/service.go +++ b/pkg/ansibleserver/service/service.go @@ -15,7 +15,6 @@ package service import ( - "context" "os" _ "github.com/go-sql-driver/mysql" @@ -28,7 +27,6 @@ import ( common_app "yunion.io/x/onecloud/pkg/cloudcommon/app" "yunion.io/x/onecloud/pkg/cloudcommon/db" common_options "yunion.io/x/onecloud/pkg/cloudcommon/options" - "yunion.io/x/onecloud/pkg/util/procutils" ) func StartService() { @@ -50,7 +48,5 @@ func StartService() { db.EnsureAppInitSyncDB(app, dbOpts, models.InitDB) defer cloudcommon.CloseDB() - go procutils.WaitZombieLoop(context.TODO()) - common_app.ServeForever(app, baseOpts) }