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

Ricky Zhou ricky at fedoraproject.org
Wed May 12 16:57:13 UTC 2010


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

Thanks,
Ricky
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: not available
Url : http://lists.fedoraproject.org/pipermail/infrastructure/attachments/20100512/c4a97b50/attachment-0001.bin 


More information about the infrastructure mailing list