Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrederic Leger2014-03-13 13:59:09 +0000
committerFrederic Leger2014-03-13 15:06:58 +0000
commitfcee9e4889c7304a4210df4720432234ae2d4778 (patch)
tree922420eebc2ff3a9f70962b5d003fb33cc825b9c /python/src/tcf/services/remote/LocatorProxy.py
parente5d5f9bbe2c36eb1bd2debfd27411b55d0492bb2 (diff)
downloadorg.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.py50
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)

Back to the top