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:
parent
4411707f6a
commit
7d987b3e42
@ -1,7 +1,8 @@
|
|||||||
[node router]
|
[NODE]
|
||||||
type = router
|
class = protocol.router.Router
|
||||||
description = router node
|
id = multiplexer
|
||||||
|
description = multiplexer node
|
||||||
nodes = ['localhost:5000', 'localhost:10769']
|
nodes = ['localhost:5000', 'localhost:10769']
|
||||||
|
|
||||||
[interface tcp]
|
[INTERFACE]
|
||||||
bindto = 0.0.0.0:5001
|
uri = tcp://5000
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
[node router]
|
[NODE]
|
||||||
type = router
|
id = router
|
||||||
|
class = protocol.router.Router
|
||||||
description = router node
|
description = router node
|
||||||
node = localhost:5000
|
node = localhost:5000
|
||||||
|
|
||||||
[interface tcp]
|
[INTERFACE]
|
||||||
bindto = 0.0.0.0:5001
|
uri=tcp://5002
|
||||||
|
@ -43,7 +43,8 @@ from secop.lib.multievent import MultiEvent
|
|||||||
|
|
||||||
|
|
||||||
class SecopClient(secop.client.SecopClient):
|
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):
|
def __init__(self, uri, log, dispatcher):
|
||||||
self.dispatcher = dispatcher
|
self.dispatcher = dispatcher
|
||||||
@ -66,13 +67,14 @@ class SecopClient(secop.client.SecopClient):
|
|||||||
if not online:
|
if not online:
|
||||||
for key, (value, _, readerror) in self.cache.items():
|
for key, (value, _, readerror) in self.cache.items():
|
||||||
if not readerror:
|
if not readerror:
|
||||||
self.cache[key] = value, t, self.DISCONNECTED
|
self.cache[key] = value, t, self.disconnectedExc
|
||||||
self.updateEvent(*key, *self.cache[key])
|
self.updateEvent(*key, *self.cache[key])
|
||||||
|
|
||||||
def descriptiveDataChange(self, module, data):
|
def descriptiveDataChange(self, module, data):
|
||||||
if module is None:
|
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):
|
class Router(secop.protocol.dispatcher.Dispatcher):
|
||||||
@ -99,6 +101,8 @@ class Router(secop.protocol.dispatcher.Dispatcher):
|
|||||||
# register callbacks
|
# register callbacks
|
||||||
for node in self.nodes:
|
for node in self.nodes:
|
||||||
node.register_callback(None, node.updateEvent, node.descriptiveDataChange, node.nodeStateChange)
|
node.register_callback(None, node.updateEvent, node.descriptiveDataChange, node.nodeStateChange)
|
||||||
|
|
||||||
|
self.restart = srv.restart
|
||||||
self.node_by_module = {}
|
self.node_by_module = {}
|
||||||
multievent = MultiEvent()
|
multievent = MultiEvent()
|
||||||
for node in self.nodes:
|
for node in self.nodes:
|
||||||
@ -171,7 +175,7 @@ class Router(secop.protocol.dispatcher.Dispatcher):
|
|||||||
node = self.node_by_module[module]
|
node = self.node_by_module[module]
|
||||||
if node.online:
|
if node.online:
|
||||||
return node.request(READREQUEST, specifier, data)
|
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):
|
def handle_change(self, conn, specifier, data):
|
||||||
module = specifier.split(':')[0]
|
module = specifier.split(':')[0]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user