[PATCH] mirrorlist_client.wsgi use select() waiting for server

Mike McGrath mmcgrath at redhat.com
Wed May 12 20:57:44 UTC 2010


On Wed, 12 May 2010, Ricky Zhou wrote:

> On 2010-05-12 09:07:35 AM, Matt Domsch wrote:
> > >From 7cd05b296ab426c386e99c3ff6f7143fbf6ed052 Mon Sep 17 00:00:00 2001
> > From: Matt Domsch <Matt_Domsch at dell.com>
> > Date: Wed, 12 May 2010 08:59:16 -0500
> > Subject: [PATCH] mirrorlist_client: use select() waiting on the response from mirrorlist_server
> >
> > Client was spinning waiting for read() to complete, during the time
> > the server was doing its thinking.  Instead, use select() to sleep
> > until the server has data to return.  This should reduce CPU time
> > spent in the client considerably.
> > ---
> >  mirrorlist-server/mirrorlist_client.wsgi |   15 ++++++++++-----
> >  1 files changed, 10 insertions(+), 5 deletions(-)
> >
> > diff --git a/mirrorlist-server/mirrorlist_client.wsgi b/mirrorlist-server/mirrorlist_client.wsgi
> > index cc4416c..15b3a15 100755
> > --- a/mirrorlist-server/mirrorlist_client.wsgi
> > +++ b/mirrorlist-server/mirrorlist_client.wsgi
> > @@ -4,7 +4,7 @@
> >  #  by Matt Domsch <Matt_Domsch at dell.com>
> >  # Licensed under the MIT/X11 license
> >
> > -import socket
> > +import socket, select
> >  import cPickle as pickle
> >  from string import zfill, atoi, strip, replace
> >  from paste.wsgiwrappers import *
> > @@ -32,24 +32,29 @@ def get_mirrorlist(d):
> >      s.shutdown(socket.SHUT_WR)
> >      del p
> >
> > +    # wait for other end to start writing
> > +    expiry = datetime.utcnow() + timedelta(seconds=request_timeout)
> > +    rlist, wlist, xlist = select.select([s],[],[],request_timeout)
> > +    if len(rlist) == 0:
> > +        s.shutdown(socket.SHUT_RD)
> > +        raise socket.timeout
> > +
> >      readlen = 0
> >      resultsize = ''
> >      while readlen < 10:
> >          resultsize += s.recv(10 - readlen)
> >          readlen = len(resultsize)
> >      resultsize = atoi(resultsize)
> > -
> > -    expiry = datetime.utcnow() + timedelta(seconds=request_timeout)
> > +
> >      readlen = 0
> >      p = ''
> >      while readlen < resultsize and datetime.utcnow() < expiry:
> >          p += s.recv(resultsize - readlen)
> >          readlen = len(p)
> > -
> > -    s.shutdown(socket.SHUT_RD)
> >      results = pickle.loads(p)
> >      del p
> >
> > +    s.shutdown(socket.SHUT_RD)
> >      return results
> >
> >  def real_client_ip(xforwardedfor):
> > --
> > 1.7.0.1
> +1
>

+1

	-Mike


More information about the infrastructure mailing list