router bug fix

- errors in cache are stored as Exception, not as tuple

Change-Id: I391c74a4bef1dc10a1783b98b1ad06fec90365df
Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/23044
Tested-by: JenkinsCodeReview <bjoern_pedersen@frm2.tum.de>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
This commit is contained in:
zolliker 2020-05-05 08:05:33 +02:00
parent 4411707f6a
commit 7d987b3e42
3 changed files with 20 additions and 14 deletions

View File

@ -1,7 +1,8 @@
[node router]
type = router
description = router node
[NODE]
class = protocol.router.Router
id = multiplexer
description = multiplexer node
nodes = ['localhost:5000', 'localhost:10769']
[interface tcp]
bindto = 0.0.0.0:5001
[INTERFACE]
uri = tcp://5000

View File

@ -1,7 +1,8 @@
[node router]
type = router
[NODE]
id = router
class = protocol.router.Router
description = router node
node = localhost:5000
[interface tcp]
bindto = 0.0.0.0:5001
[INTERFACE]
uri=tcp://5002

View File

@ -43,7 +43,8 @@ from secop.lib.multievent import MultiEvent
class SecopClient(secop.client.SecopClient):
DISCONNECTED = ('Communication failed', 'remote SEC node disconnected')
disconnectedExc = secop.errors.CommunicationFailedError('remote SEC node disconnected')
disconnectedError = (disconnectedExc.name, str(disconnectedExc))
def __init__(self, uri, log, dispatcher):
self.dispatcher = dispatcher
@ -66,13 +67,14 @@ class SecopClient(secop.client.SecopClient):
if not online:
for key, (value, _, readerror) in self.cache.items():
if not readerror:
self.cache[key] = value, t, self.DISCONNECTED
self.cache[key] = value, t, self.disconnectedExc
self.updateEvent(*key, *self.cache[key])
def descriptiveDataChange(self, module, data):
if module is None:
self.log.error('descriptive data for node %r has changed', self.nodename)
self.dispatcher.restart()
self.dispatcher.restart()
self._shutdown = True
raise secop.errors.SECoPError('descriptive data for node %r has changed' % self.nodename)
class Router(secop.protocol.dispatcher.Dispatcher):
@ -99,6 +101,8 @@ class Router(secop.protocol.dispatcher.Dispatcher):
# register callbacks
for node in self.nodes:
node.register_callback(None, node.updateEvent, node.descriptiveDataChange, node.nodeStateChange)
self.restart = srv.restart
self.node_by_module = {}
multievent = MultiEvent()
for node in self.nodes:
@ -171,7 +175,7 @@ class Router(secop.protocol.dispatcher.Dispatcher):
node = self.node_by_module[module]
if node.online:
return node.request(READREQUEST, specifier, data)
return ERRORPREFIX + READREQUEST, specifier, SecopClient.DISCONNECTED + (dict(t=node.disconnect_time),)
return ERRORPREFIX + READREQUEST, specifier, SecopClient.disconnectedError + (dict(t=node.disconnect_time),)
def handle_change(self, conn, specifier, data):
module = specifier.split(':')[0]