[Sugar-devel] [PATCH] Time out on registration process to prevent indefinite UI hang (SL#2289)
Tomeu Vizoso
tomeu at sugarlabs.org
Thu Sep 9 10:32:13 EDT 2010
On Thu, Sep 9, 2010 at 16:15, Dipankar Patro <dipankar at seeta.in> wrote:
> Registration with the school server is currently done synchronously.
> To prevent the UI from hanging indefinitely, if the school server is reachable
> but unresponsive, we add an explicit timeout.
> ---
> src/jarabe/desktop/schoolserver.py | 20 +++++++++++++++++---
> 1 files changed, 17 insertions(+), 3 deletions(-)
>
> diff --git a/src/jarabe/desktop/schoolserver.py b/src/jarabe/desktop/schoolserver.py
> index 62519df..98ad7e7 100644
> --- a/src/jarabe/desktop/schoolserver.py
> +++ b/src/jarabe/desktop/schoolserver.py
> @@ -16,7 +16,8 @@
>
> import logging
> from gettext import gettext as _
> -from xmlrpclib import ServerProxy, Error
> +import httplib
> +import xmlrpclib
> import socket
> import os
> import string
> @@ -30,6 +31,7 @@ from sugar import env
> from sugar.profile import get_profile
>
> REGISTER_URL = 'http://schoolserver:8080/'
> +REGISTER_TIMEOUT = 8
>
> def generate_serial_number():
> """ Generates a serial number based on 3 random uppercase letters
> @@ -76,6 +78,18 @@ def store_identifiers(serial_number, uuid, backup_url):
> class RegisterError(Exception):
> pass
>
> +class TimeoutHTTP(httplib.HTTP):
> + def __init__(self, host='', port=None, strict=None, timeout = None):
> + if port == 0:
> + port = None
> + self._setup(self._connection_class(host,
> + port, strict, timeout = REGISTER_TIMEOUT))
Please, if you are going to commit this, open a ticket warning that we
are using something that can break at any Python release and put a
warning pointing to that ticket next to that line.
If you have any doubts about this, please ask.
Thanks,
Tomeu
> +
> +class TimeoutTransport(xmlrpclib.Transport):
> + def make_connection(self, host):
> + host, extra_headers, x509 = self.get_host_info(host)
> + return TimeoutHTTP(host, timeout = REGISTER_TIMEOUT)
> +
> def register_laptop(url=REGISTER_URL):
>
> profile = get_profile()
> @@ -95,10 +109,10 @@ def register_laptop(url=REGISTER_URL):
>
> nick = client.get_string('/desktop/sugar/user/nick')
>
> - server = ServerProxy(url)
> + server = xmlrpclib.ServerProxy(url, TimeoutTransport())
> try:
> data = server.register(sn, nick, uuid_, profile.pubkey)
> - except (Error, socket.error):
> + except (xmlrpclib.Error, socket.error):
> logging.exception('Registration: cannot connect to server')
> raise RegisterError(_('Cannot connect to the server.'))
>
> --
> 1.7.0.4
>
> _______________________________________________
> Sugar-devel mailing list
> Sugar-devel at lists.sugarlabs.org
> http://lists.sugarlabs.org/listinfo/sugar-devel
>
More information about the Sugar-devel
mailing list