diff options
author | Frederic Leger | 2014-03-13 13:59:09 +0000 |
---|---|---|
committer | Frederic Leger | 2014-03-13 15:06:58 +0000 |
commit | fcee9e4889c7304a4210df4720432234ae2d4778 (patch) | |
tree | 922420eebc2ff3a9f70962b5d003fb33cc825b9c /python/src/tcf/services/remote/LocatorProxy.py | |
parent | e5d5f9bbe2c36eb1bd2debfd27411b55d0492bb2 (diff) | |
download | org.eclipse.tcf-fcee9e4889c7304a4210df4720432234ae2d4778.tar.gz org.eclipse.tcf-fcee9e4889c7304a4210df4720432234ae2d4778.tar.xz org.eclipse.tcf-fcee9e4889c7304a4210df4720432234ae2d4778.zip |
Improve debug output in the case of exception.
Another ound of adding the stacktrace at the time of the exception.
Diffstat (limited to 'python/src/tcf/services/remote/LocatorProxy.py')
-rw-r--r-- | python/src/tcf/services/remote/LocatorProxy.py | 50 |
1 files changed, 47 insertions, 3 deletions
diff --git a/python/src/tcf/services/remote/LocatorProxy.py b/python/src/tcf/services/remote/LocatorProxy.py index 730c095bb..3fbacd340 100644 --- a/python/src/tcf/services/remote/LocatorProxy.py +++ b/python/src/tcf/services/remote/LocatorProxy.py @@ -1,5 +1,5 @@ # ***************************************************************************** -# * Copyright (c) 2011, 2013 Wind River Systems, Inc. and others. +# * Copyright (c) 2011, 2013-2014 Wind River Systems, Inc. and others. # * All rights reserved. This program and the accompanying materials # * are made available under the terms of the Eclipse Public License v1.0 # * which accompanies this distribution, and is available at @@ -32,6 +32,9 @@ class ChannelEventListener(channel.EventListener): self.channel = proxy.channel def event(self, name, data): + if self.proxy.peers is None: + return # peers not synchronized yet + try: args = channel.fromJSONSequence(data) if name == "peerAdded": @@ -91,20 +94,42 @@ class ChannelEventListener(channel.EventListener): else: raise IOError("Locator service: unknown event: " + name) except Exception as x: + import sys + x.tb = sys.exc_info()[2] self.channel.terminate(x) class LocatorProxy(locator.LocatorService): def __init__(self, channel): self.channel = channel - self.peers = {} + self.peers = None # not yet synchronized self.listeners = [] self.get_peers_done = False self.event_listener = ChannelEventListener(self) channel.addEventListener(self, self.event_listener) + def getAgentID(self, done): + done = self._makeCallback(done) + service = self + + class GetAgentIDCommand(Command): + def __init__(self): + super(GetAgentIDCommand, self).__init__(service.channel, + service, "getAgentID", + None) + + def done(self, error, args): + agentID = None + if not error: + assert len(args) == 2 + error = self.toError(args[0]) + agentID = args[1] + done.doneGetAgentID(self.token, error, agentID) + return GetAgentIDCommand().token + def getPeers(self): - return self.peers + assert protocol.isDispatchThread() + return self.peers # None if not synchronized yet def redirect(self, _peer, done): done = self._makeCallback(done) @@ -119,6 +144,24 @@ class LocatorProxy(locator.LocatorService): if not error: assert len(args) == 1 error = self.toError(args[0]) + + if not error and service.peers: + # The redirect was a success. Invalidate all the peers + # already detected. + + for peerId in list(service.peers.keys()): + del service.peers[peerId] + for l in service.listeners: + try: + l.peerRemoved(peerId) + except Exception as x: + protocol.log("Unhandled exception in "\ + "Locator listener", x) + + assert len(service.peers) == 0 + service.peers = None + service.get_peers_done = False + done.doneRedirect(self.token, error) return RedirectCommand().token @@ -156,6 +199,7 @@ class LocatorProxy(locator.LocatorService): protocol.log("Locator error", error) return c = args[1] + service.peers = {} # peers list synchronized if c: for m in c: peerID = m.get(peer.ATTR_ID) |