Problem: BigchainDB main/parent process does not handle signals

This commit is contained in:
Ahmed Muawia Khan 2018-07-20 13:07:43 +02:00
parent abc6db7999
commit 7c9155257d

View File

@ -1,8 +1,11 @@
import bigchaindb
import gevent
import logging
import setproctitle
import signal
import bigchaindb
from bigchaindb.tendermint.lib import BigchainDB
from bigchaindb.tendermint.core import App
from bigchaindb.web import server, websocket_server
@ -31,17 +34,27 @@ BANNER = """
****************************************************************************
"""
PROCESSES = []
def sig_handler(server):
logger.info('Shutting down BigchainDB. Goodbye!')
server.stop()
for p in PROCESSES:
p.terminate()
def start():
# Exchange object for event stream api
logger.info('Starting BigchainDB')
exchange = Exchange()
# start the web api
app_server = server.create_server(
settings=bigchaindb.config['server'],
log_config=bigchaindb.config['log'],
bigchaindb_factory=BigchainDB)
p_webapi = Process(name='bigchaindb_webapi', target=app_server.run)
p_webapi = Process(name='bigchaindb_webapi', target=app_server.run, daemon=True)
PROCESSES.append(p_webapi)
p_webapi.start()
# start message
@ -50,16 +63,21 @@ def start():
# start websocket server
p_websocket_server = Process(name='bigchaindb_ws',
target=websocket_server.start,
daemon=True,
args=(exchange.get_subscriber_queue(EventTypes.BLOCK_VALID),))
PROCESSES.append(p_websocket_server)
p_websocket_server.start()
# connect to tendermint event stream
p_websocket_client = Process(name='bigchaindb_ws_to_tendermint',
target=event_stream.start,
daemon=True,
args=(exchange.get_publisher_queue(),))
PROCESSES.append(p_websocket_client)
p_websocket_client.start()
p_exchange = Process(name='bigchaindb_exchange', target=exchange.run)
p_exchange = Process(name='bigchaindb_exchange', target=exchange.run, daemon=True)
PROCESSES.append(p_exchange)
p_exchange.start()
# We need to import this after spawning the web server
@ -69,8 +87,17 @@ def start():
setproctitle.setproctitle('bigchaindb')
# Start the ABCIServer and watch for signals to stop
# the server and the relevant child processes.
app = ABCIServer(app=App())
app.run()
gevent.signal(signal.SIGTERM, sig_handler, app.server)
gevent.signal(signal.SIGQUIT, sig_handler, app.server)
gevent.signal(signal.SIGINT, sig_handler, app.server)
app.server.serve_forever()
for p in PROCESSES:
p.join()
if __name__ == '__main__':