On Mon, Dec 14, 2015 at 5:00 PM, IWAMOTO Toshihiro <[email protected]> wrote: > Otherwise, AppManager.run_apps fails to terminate.
run_apps tries to kill threads in "services" by itself. can you explain why it isn't enough? > > Signed-off-by: IWAMOTO Toshihiro <[email protected]> > --- > ryu/controller/ofp_handler.py | 9 ++++++++- > ryu/services/protocols/bgp/application.py | 15 +++++++++++---- > ryu/services/protocols/ovsdb/manager.py | 7 +++++-- > ryu/services/protocols/vrrp/manager.py | 10 ++++++++-- > 4 files changed, 32 insertions(+), 9 deletions(-) > > diff --git a/ryu/controller/ofp_handler.py b/ryu/controller/ofp_handler.py > index cc64b1f..6b0a9f5 100644 > --- a/ryu/controller/ofp_handler.py > +++ b/ryu/controller/ofp_handler.py > @@ -51,11 +51,18 @@ from ryu.ofproto import ofproto_parser > class OFPHandler(ryu.base.app_manager.RyuApp): > def __init__(self, *args, **kwargs): > super(OFPHandler, self).__init__(*args, **kwargs) > + self.ofp_thread = None > self.name = 'ofp_event' > > def start(self): > super(OFPHandler, self).start() > - return hub.spawn(OpenFlowController()) > + self.ofp_thread = hub.spawn(OpenFlowController()) > + return self.ofp_thread > + > + def stop(self): > + if self.ofp_thread: > + hub.kill(self.ofp_thread) > + super(OFPHandler, self).stop() > > def _hello_failed(self, datapath, error_desc): > self.logger.error(error_desc) > diff --git a/ryu/services/protocols/bgp/application.py > b/ryu/services/protocols/bgp/application.py > index 8284444..7a77c32 100644 > --- a/ryu/services/protocols/bgp/application.py > +++ b/ryu/services/protocols/bgp/application.py > @@ -78,6 +78,7 @@ class RyuBGPSpeaker(RyuApp): > self.bind_ip = RyuBGPSpeaker.validate_rpc_ip(CONF.bind_ip) > self.bind_port = RyuBGPSpeaker.validate_rpc_port(CONF.bind_port) > self.config_file = CONF.bgp_config_file > + self.bgp_thread = None > super(RyuBGPSpeaker, self).__init__(*args, **kwargs) > > def start(self): > @@ -101,14 +102,20 @@ class RyuBGPSpeaker(RyuApp): > if getattr(settings, 'SSH', None) is not None: > hub.spawn(ssh.SSH_CLI_CONTROLLER.start, None, **settings.SSH) > # Start Network Controller to server RPC peers. > - t = hub.spawn(net_ctrl.NET_CONTROLLER.start, *[], > - **{net_ctrl.NC_RPC_BIND_IP: self.bind_ip, > - net_ctrl.NC_RPC_BIND_PORT: self.bind_port}) > + self.bgp_thread = hub.spawn( > + net_ctrl.NET_CONTROLLER.start, *[], > + **{net_ctrl.NC_RPC_BIND_IP: self.bind_ip, > + net_ctrl.NC_RPC_BIND_PORT: self.bind_port}) > LOG.debug('Started Network Controller') > > super(RyuBGPSpeaker, self).start() > > - return t > + return self.bgp_thread > + > + def stop(self): > + if self.bgp_thread: > + hub.kill(self.bgp_thread) > + super(RyuBGPSpeaker, self).stop() > > @classmethod > def validate_rpc_ip(cls, ip): > diff --git a/ryu/services/protocols/ovsdb/manager.py > b/ryu/services/protocols/ovsdb/manager.py > index 7b1d5c8..0933f97 100644 > --- a/ryu/services/protocols/ovsdb/manager.py > +++ b/ryu/services/protocols/ovsdb/manager.py > @@ -44,6 +44,7 @@ class OVSDB(app_manager.RyuApp): > self._address = self.CONF.ovsdb.address > self._port = self.CONF.ovsdb.port > self._clients = {} > + self._accept_thread = None > > def _accept(self, server): > if self.CONF.ovsdb.whitelist: > @@ -113,11 +114,13 @@ class OVSDB(app_manager.RyuApp): > > self.logger.info('Listening on %s:%s for clients' % (self._address, > self._port)) > - t = hub.spawn(self._accept, self._server) > + self._accept_thread = hub.spawn(self._accept, self._server) > super(OVSDB, self).start() > - return t > + return self._accept_thread > > def stop(self): > + if self._accept_thread: > + hub.kill(self._accept_thread) > for client in self._clients.values(): > client.stop() > > diff --git a/ryu/services/protocols/vrrp/manager.py > b/ryu/services/protocols/vrrp/manager.py > index 40c730d..f9bdce4 100644 > --- a/ryu/services/protocols/vrrp/manager.py > +++ b/ryu/services/protocols/vrrp/manager.py > @@ -61,11 +61,17 @@ class VRRPManager(app_manager.RyuApp): > self.name = vrrp_event.VRRP_MANAGER_NAME > self._instances = {} # name -> VRRPInstance > self.shutdown = hub.Queue() > + self.vrrp_thread = None > > def start(self): > - t = hub.spawn(self._shutdown_loop) > + self.vrrp_thread = hub.spawn(self._shutdown_loop) > super(VRRPManager, self).start() > - return t > + return self.vrrp_thread > + > + def stop(self): > + if self.vrrp_thread: > + hub.kill(self.vrrp_thread) > + super(VRRPManager, self).stop() > > @handler.set_ev_cls(vrrp_event.EventVRRPConfigRequest) > def config_request_handler(self, ev): > -- > 2.1.4 > > > ------------------------------------------------------------------------------ > _______________________________________________ > Ryu-devel mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/ryu-devel ------------------------------------------------------------------------------ _______________________________________________ Ryu-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/ryu-devel
