예제 #1
0
def main():
    # Note: no logging must happen before this call.
    # Otherwise the log configuration will not apply.
    _setup_logging()

    # [KN] The elements in the queue will appear if
    # 1. A callback is invoked from ha_link (this will happen in a motr
    #    thread which must be free ASAP)
    # 2. A new HA notification has come form Consul via HTTP
    # [KN] The messages are consumed by Python thread created by
    # _run_thread(ConsumerThread(..)) function.
    #
    # [KN] Note: The server is launched in the main thread.
    q = Queue(maxsize=8)

    util: ConsulUtil = ConsulUtil()
    cfg = _get_motr_fids(util)

    LOG.info('Welcome to HaX')
    LOG.info(f'Setting up ha_link interface with the options as follows: '
             f'hax fid = {cfg.hax_fid}, hax endpoint = {cfg.hax_ep}, '
             f'HA fid = {cfg.ha_fid}, RM fid = {cfg.rm_fid}')

    ffi = HaxFFI()
    herald = DeliveryHerald()
    motr = Motr(queue=q, rm_fid=cfg.rm_fid, ffi=ffi, herald=herald)

    # Note that consumer thread must be started before we invoke motr.start(..)
    # Reason: hax process will send entrypoint request and somebody needs
    # to reply it.
    consumer = _run_thread(ConsumerThread(q, motr))
    try:
        motr.start(cfg.hax_ep,
                   process=cfg.hax_fid,
                   ha_service=cfg.ha_fid,
                   rm_service=cfg.rm_fid)
        LOG.info('Motr API has been started')
        service_monitor = _run_thread(ServiceMonitor(q))
        stats_updater = _run_thread(FsStatsUpdater(motr, interval_sec=30))

        # [KN] This is a blocking call. It will work until the program is
        # terminated by signal
        run_server(q,
                   herald,
                   threads_to_wait=[consumer, stats_updater, service_monitor])
    except Exception:
        LOG.exception('Exiting due to an exception')
    finally:
        motr.close()
예제 #2
0
def _run_stats_updater_thread(motr: Motr,
                              consul_util: ConsulUtil) -> FsStatsUpdater:
    thread = FsStatsUpdater(motr, consul_util, interval_sec=30)
    thread.start()
    return thread
예제 #3
0
def _run_stats_updater_thread(motr: Motr,
                              consul_util: ConsulUtil) -> StoppableThread:
    return _run_thread(FsStatsUpdater(motr, consul_util, interval_sec=30))
예제 #4
0
def _run_stats_updater_thread(motr: Motr) -> FsStatsUpdater:
    thread = FsStatsUpdater(motr, interval_sec=30)
    thread.start()
    return thread