[openstack-dev] Dealing with Popen and Eventlet

Joshua Harlow harlowja at yahoo-inc.com
Mon Nov 5 19:29:14 UTC 2012


Hmmm, it seems like unless u start adjusting all the nova-api and such to
use apache (which isn't clearly documented, afaik) then the default web
server is the built-in eventlet web server. Perhaps the community in
general should do what sandy recommends, and say the default that u get is
really only for small use-cases, and you should really be using a real
webserver (or make the default non-service case use apache...)

-Josh

On 11/2/12 6:57 PM, "Sandy Walsh" <sandy.walsh at RACKSPACE.COM> wrote:

>Interesting question, and sorry for my nativity, but do we use eventlet
>in a web server? I thought we leaned on the web server to deal with the
>threading and only used eventlet in the services?
>
>Or am I missing something?
>
>-S
>  
>________________________________________
>From: Adam Young [ayoung at redhat.com]
>Sent: Friday, November 02, 2012 10:40 PM
>To: OpenStack Development Mailing List
>Subject: [openstack-dev] Dealing with Popen and Eventlet
>
>Since Eventlet is based on continuations instead of threads or
>processes, any call that blocks is going to lock up the webserver. That
>is any I/O at all.  Thus, when trying to figure out how best to call the
>OpenSSL functions from Eventlet, I settled on what I thought would be
>the best tested approach: spin it off as a separate process.  And it
>seemed to work.
>
>Well, it doesn't work.  The Eventlet library does not properly Monkey
>patch the subprocess calls from Python.  While this is something we
>should patch upstream in Eventlet,  we need something to deal with the
>existing Eventlet library for Grizzly development.
>
>I've been trying to make it possible to run Keystone (and the other
>services eventually) in Apache.  Thus, the simple solution of replacing
>
>import subprocess
>
>with
>
>import eventlet.green.subprocess
>
>Won't work.  It solves the problem in Eventlet, but not apache.
>
>It is possible to do something like this code below:
>
>in the file keystone/common/interop/__init__.py
>
>import sys
>if 'eventlet' in sys.modules:
>     import eventlet.green.subprocess as interop_subprocess
>     print sys.modules["eventlet"]
>else:
>     import subprocess as interop_subprocess
>
>PIPE = interop_subprocess.PIPE
>CalledProcessError = interop_subprocess.CalledProcessError
>Popen = interop_subprocess.Popen
>#end interop
>
>
>and then, instead of
>import eventlet.green.subprocess
>
>we can import keystone.common.interop as subprocess
>
>The problem is that the if statement is not triggered when this import
>is hit, as the eventlet code has not yet been imported elsewhere.
>
>What is the right way of detecting what web server we are running in and
>selecting which version of the subprocess code to import?
>
>
>
>_______________________________________________
>OpenStack-dev mailing list
>OpenStack-dev at lists.openstack.org
>http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
>
>_______________________________________________
>OpenStack-dev mailing list
>OpenStack-dev at lists.openstack.org
>http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev




More information about the OpenStack-dev mailing list