From c249931f2ca37d56391e671b37479555fec92686 Mon Sep 17 00:00:00 2001 From: Aravinda VK Date: Tue, 8 Mar 2016 13:41:58 +0530 Subject: geo-rep: Fix CPU utilization 100% with Popen Errorstore is maintained by Geo-rep to collect errors from the child processes opened using Popen. If Popen.communicate is used then it closes stderr. When stderr is not available errorstore.tailer() will enter into infinite loop without gap. With this patch, sleep time added when stderr of Child process is already closed. Change-Id: Ic36aabd6de35b259467d0bab7952468432867a94 BUG: 1315582 Signed-off-by: Aravinda VK Reviewed-on: http://review.gluster.org/13637 Reviewed-on: http://review.gluster.org/13645 Smoke: Gluster Build System CentOS-regression: Gluster Build System NetBSD-regression: NetBSD Build System Reviewed-by: Vijay Bellur --- geo-replication/syncdaemon/resource.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/geo-replication/syncdaemon/resource.py b/geo-replication/syncdaemon/resource.py index ac697eb39ed..c7fdbf37308 100644 --- a/geo-replication/syncdaemon/resource.py +++ b/geo-replication/syncdaemon/resource.py @@ -152,6 +152,9 @@ class Popen(subprocess.Popen): poe, _, _ = select( [po.stderr for po in errstore], [], [], 1) except (ValueError, SelectError): + # stderr is already closed wait for some time before + # checking next error + time.sleep(0.5) continue for po in errstore: if po.stderr not in poe: @@ -164,6 +167,7 @@ class Popen(subprocess.Popen): try: fd = po.stderr.fileno() except ValueError: # file is already closed + time.sleep(0.5) continue l = os.read(fd, 1024) if not l: -- cgit