[PATCH] mirrorlist_client timeouts

Ricky Zhou ricky at fedoraproject.org
Wed May 12 19:26:12 UTC 2010


On 2010-05-12 01:59:15 PM, Matt Domsch wrote:
> >From 1aa19dfed950c209ad5a2ddf48e2b828b50c07ee Mon Sep 17 00:00:00 2001
> From: Matt Domsch <Matt_Domsch at dell.com>
> Date: Wed, 12 May 2010 13:52:51 -0500
> Subject: [PATCH] mirrorlist_client: a better way to handle socket timeouts
> 
> blocking sockets, calling recv(), may block forever if the server end
> doesn't send anything for some reason.  Don't let that happen.  Python
> has a socket.settimeout() capability.  We'll use that to let any
> individual operation (except the select()) take up to 5 seconds (they
> should all be in the microsecond range, so this is very generous), and
> let select() continue to wait for 60 seconds for the server to respond
> at all.
> 
> If a timeout happens, an exception is raised, which is caught by the
> caller and a HTTP 503 returned to the web client.
> ---
>  mirrorlist-server/mirrorlist_client.wsgi |   17 ++++++++---------
>  1 files changed, 8 insertions(+), 9 deletions(-)
> 
> diff --git a/mirrorlist-server/mirrorlist_client.wsgi b/mirrorlist-server/mirrorlist_client.wsgi
> index 15b3a15..3508f19 100755
> --- a/mirrorlist-server/mirrorlist_client.wsgi
> +++ b/mirrorlist-server/mirrorlist_client.wsgi
> @@ -13,14 +13,14 @@ import cStringIO
>  from datetime import datetime, timedelta
>  
>  socketfile = '/var/run/mirrormanager/mirrorlist_server.sock'
> -request_timeout = 60 # seconds
> +select_timeout = 60 # seconds
> +timeout = 5 # seconds
>  
>  def get_mirrorlist(d):
> -    try:
> -        s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
> -        s.connect(socketfile)
> -    except:
> -        raise
> +    # any exceptions or timeouts raised here get handled by the caller
> +    s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
> +    s.settimeout(timeout)
> +    s.connect(socketfile)
>  
>      p = pickle.dumps(d)
>      del d
> @@ -33,8 +33,7 @@ def get_mirrorlist(d):
>      del p
>  
>      # wait for other end to start writing
> -    expiry = datetime.utcnow() + timedelta(seconds=request_timeout)
> -    rlist, wlist, xlist = select.select([s],[],[],request_timeout)
> +    rlist, wlist, xlist = select.select([s],[],[],select_timeout)
>      if len(rlist) == 0:
>          s.shutdown(socket.SHUT_RD)
>          raise socket.timeout
> @@ -48,7 +47,7 @@ def get_mirrorlist(d):
>  
>      readlen = 0
>      p = ''
> -    while readlen < resultsize and datetime.utcnow() < expiry:
> +    while readlen < resultsize:
>          p += s.recv(resultsize - readlen)
>          readlen = len(p)
>      results = pickle.loads(p)
> -- 
> 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/97d82826/attachment.bin 


More information about the infrastructure mailing list