Commit 36d4dbda authored by Sebastien Robin's avatar Sebastien Robin

svcbackend: explicitely call the executable instead of using Popen 'executable' keyword

Some testnodes were failing more or less randomly while calling "slapos node instance".
On failing nodes, unlike other ones, there was this unexpected log:

2016-10-06 15:35:18 slapos[11671] INFO Processing computer partitions...
2016-10-06 15:35:18 slapos[11671] INFO Launching supervisord with clean environment.
2016-10-06 15:35:18 slapos[11671] INFO Could not find platform independent libraries <prefix>
2016-10-06 15:35:18 slapos[11671] INFO Could not find platform dependent libraries <exec_prefix>
2016-10-06 15:35:18 slapos[11671] INFO Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]
2016-10-06 15:35:18 slapos[11671] INFO ImportError: No module named site
2016-10-06 15:35:18 slapos[11671] WARNING Supervisord unknown problem:
2016-10-06 15:35:18 slapos[11671] INFO Processing Computer Partition test0-0.

Then slapgrid was later failing with :

slapgrid_cp :   File "/opt/slapgrid/75e907b4c1523ecfa2aa210ec2754db4/eggs/supervisor-3.3.1-py2.7.egg/supervisor/xmlrpc.py", line 521, in connect
slapgrid_cp :     self.sock.connect(self.socketfile)
slapgrid_cp :   File "/opt/slapos/rebootstrap/parts/python2.7/lib/python2.7/socket.py", line 228, in meth
slapgrid_cp :     return getattr(self._sock,name)(*args)
slapgrid_cp : error: [Errno 2] No such file or directory

But the initial suspect logs sounds be the original issue that is the source
of next ones.

So it looks like supervisord was not able to start at all.

After playing with subprocess.Popen, is sounds not a good idea to play
with the keyword 'executable'. It looks like not always be strictly equivalent
to a replacement of the first argument of the first Popen args. It's much better
to directly set the process we want to call in the invocation list :
- it avoid to rely on a feature that is "very seldom needed" as we see
  in subprocess documentation
- it makes the code much readable, it avoid the guy reading the
  code wasting time understanding that the invocation_list is not
  really what is going to be executed.
parent 251b63f5
...@@ -159,7 +159,7 @@ def launchSupervisord(instance_root, logger, ...@@ -159,7 +159,7 @@ def launchSupervisord(instance_root, logger,
logger.info("Launching supervisord with clean environment.") logger.info("Launching supervisord with clean environment.")
# Extract python binary to prevent shebang size limit # Extract python binary to prevent shebang size limit
invocation_list = ["supervisord", '-c'] invocation_list = [sys.executable, '-c']
invocation_list.append( invocation_list.append(
"import sys ; sys.path=" + str(sys.path) + " ; " + "import sys ; sys.path=" + str(sys.path) + " ; " +
"import supervisor.supervisord ; " + "import supervisor.supervisord ; " +
...@@ -167,7 +167,6 @@ def launchSupervisord(instance_root, logger, ...@@ -167,7 +167,6 @@ def launchSupervisord(instance_root, logger,
"supervisor.supervisord.main()") "supervisor.supervisord.main()")
supervisord_popen = SlapPopen(invocation_list, supervisord_popen = SlapPopen(invocation_list,
env={}, env={},
executable=sys.executable,
stdout=subprocess.PIPE, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT, stderr=subprocess.STDOUT,
logger=logger) logger=logger)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment