[Sugar-devel] [PATCH] Time out on registration process to prevent indefinite UI hang (SL#2289)

Dipankar Patro dipankar at seeta.in
Sat Sep 18 13:18:55 EDT 2010


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 |   22 +++++++++++++++++++---
 1 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/src/jarabe/desktop/schoolserver.py b/src/jarabe/desktop/schoolserver.py
index 62519df..908b58d 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,20 @@ 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
+        # FIXME: we are depending on undocumented internals that can break
+        #  between Python releases.
+        self._setup(self._connection_class(host,
+                port, strict, timeout = REGISTER_TIMEOUT))
+
+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 +111,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



More information about the Sugar-devel mailing list