~mvo/ubuntu-sso-client/lp711413

« back to all changes in this revision

Viewing changes to ubuntu_sso/main/linux.py

  • Committer: Michael Vogt
  • Date: 2012-05-23 15:45:50 UTC
  • Revision ID: michael.vogt@ubuntu.com-20120523154550-143redkc7ypg14oo
try to fix #711413 via a retry approach if the session bus is not available, the idea is that ubuntu-sso-client gets killed on logout hopefully before the retry-timeout is reached

Show diffs side-by-side

added added

removed removed

Lines of Context:
39
39
"""
40
40
 
41
41
import signal
 
42
import time
42
43
 
43
44
import dbus
44
45
import dbus.service
340
341
class UbuntuSSOProxy(object):
341
342
    """Object that exposes the diff referenceable objects."""
342
343
 
 
344
    # the time and retry count to wait for the session bus to become
 
345
    # available before the system errors out
 
346
    DBUS_RETRY_WAIT_TIME = 0.2
 
347
    DBUS_RETRY_COUNT_MAX = 10
 
348
 
343
349
    def __init__(self, root):
344
350
        self.root = root
345
 
        self.bus = dbus.SessionBus()
 
351
        self.bus = self._get_session_bus_with_retry()
346
352
        self.sso_login = None
347
353
        self.cred_manager = None
348
354
 
 
355
    def _get_session_bus_with_retry(self):
 
356
        # keep retrying to avoid race on login/logout, see LP: #711413
 
357
        for i in range(self.DBUS_RETRY_COUNT_MAX):
 
358
            try:
 
359
                bus = dbus.SessionBus()
 
360
                break
 
361
            except dbus.DBusException:
 
362
                logger.exception("Failed to get the session dbus""")
 
363
                time.sleep(self.DBUS_RETRY_WAIT_TIME)
 
364
        else:
 
365
            # if we reach this point, we couldn't get a bus, so give up
 
366
            raise
 
367
        return bus
 
368
 
349
369
    def start(self):
350
370
        """Start listening, nothing async to be done in this platform."""
351
371
        # Register DBus service for making sure we run only one instance