Exemple #1
0
def load_app_and_run_server() -> None:
    """Parse arguments, read configuration, and start the server."""
    sys.path.append(os.getcwd())

    shutdown_event = register_signal_handlers()

    args = parse_args(sys.argv[1:])
    with args.config_file:
        config = read_config(args.config_file, args.server_name, args.app_name)
    assert config.server

    configure_logging(config, args.debug)

    app = make_app(config.app)
    listener = make_listener(args.bind)
    server = make_server(config.server, listener, app)

    if einhorn.is_worker():
        einhorn.ack_startup()

    if args.reload:
        reloader.start_reload_watcher(extra_files=[args.config_file.name])

    # clean up leftovers from initialization before we get into requests
    gc.collect()

    logger.info("Listening on %s, PID:%s", listener.getsockname(), os.getpid())
    server.start()
    try:
        shutdown_event.wait()
        logger.info("Finally stopping server, PID:%s", os.getpid())
    finally:
        server.stop()
Exemple #2
0
    def test_send_ack(self, getpid, sock):
        getpid.return_value = 1337

        einhorn.ack_startup()

        sock.assert_called_with(socket.AF_UNIX, socket.SOCK_STREAM)
        mocket = sock.return_value
        mocket.connect.assert_called_with("/tmp/einhorn.sock")

        self.assertEqual(mocket.sendall.call_count, 1)
        self.assertEqual(mocket.close.call_count, 1)
Exemple #3
0
    def test_send_ack(self, getpid, sock):
        getpid.return_value = 1337

        einhorn.ack_startup()

        sock.assert_called_with(socket.AF_UNIX, socket.SOCK_STREAM)
        mocket = sock.return_value
        mocket.connect.assert_called_with("/tmp/einhorn.sock")

        self.assertEqual(mocket.sendall.call_count, 1)
        self.assertEqual(mocket.close.call_count, 1)
Exemple #4
0
    def setup_complete(self):
        self.startup_timer.stop()
        self.stats.flush()

        if self.log_start:
            self.log.error("%s:%s started %s at %s (took %.02fs)",
                           self.reddit_host, self.reddit_pid,
                           self.short_version,
                           datetime.now().strftime("%H:%M:%S"),
                           self.startup_timer.elapsed_seconds())

        if einhorn.is_worker():
            einhorn.ack_startup()
Exemple #5
0
def load_app_and_run_server() -> None:
    """Parse arguments, read configuration, and start the server."""
    sys.path.append(os.getcwd())

    shutdown_event = register_signal_handlers()

    args = parse_args(sys.argv[1:])
    with args.config_file:
        config = read_config(args.config_file, args.server_name, args.app_name)
    assert config.server

    configure_logging(config, args.debug)

    app = make_app(config.app)
    listener = make_listener(args.bind)
    server = make_server(config.server, listener, app)

    cfg = parse_config(config.server, {"drain_time": OptionalConfig(Timespan)})

    if einhorn.is_worker():
        einhorn.ack_startup()

    try:
        # pylint: disable=cyclic-import
        from baseplate.server.prometheus import start_prometheus_exporter
    except ImportError:
        logger.debug("Prometheus exporter not available. pip install prometheus-client to enable.")
    else:
        start_prometheus_exporter()

    if args.reload:
        reloader.start_reload_watcher(extra_files=[args.config_file.name])

    # clean up leftovers from initialization before we get into requests
    gc.collect()

    logger.info("Listening on %s", listener.getsockname())
    server.start()
    try:
        shutdown_event.wait()

        SERVER_STATE.state = ServerLifecycle.SHUTTING_DOWN

        if cfg.drain_time:
            logger.debug("Draining inbound requests...")
            time.sleep(cfg.drain_time.total_seconds())
    finally:
        logger.debug("Gracefully shutting down...")
        server.stop()
        logger.info("Exiting")
Exemple #6
0
    def setup_complete(self):
        self.startup_timer.stop()
        self.stats.flush()

        if self.log_start:
            self.log.error(
                "%s:%s started %s at %s (took %.02fs)",
                self.reddit_host,
                self.reddit_pid,
                self.short_version,
                datetime.now().strftime("%H:%M:%S"),
                self.startup_timer.elapsed_seconds()
            )

        if einhorn.is_worker():
            einhorn.ack_startup()
Exemple #7
0
def load_app_and_run_server():
    """Parse arguments, read configuration, and start the server."""
    register_signal_handlers()

    args = parse_args(sys.argv[1:])
    config = read_config(args.config_file, args.server_name, args.app_name)
    configure_logging(config, args.debug)

    app = make_app(config.app)
    listener = make_listener(args.bind)
    server = make_server(config.server, listener, app)

    if einhorn.is_worker():
        einhorn.ack_startup()

    if args.reload:
        reloader.start_reload_watcher(extra_files=[args.config_file.name])

    logger.info("Listening on %s", listener.getsockname())

    server.serve_forever()
Exemple #8
0
 def test_send_ack(self):
     with self.assertRaises(einhorn.NotEinhornWorker):
         einhorn.ack_startup()
Exemple #9
0
 def test_send_ack(self):
     with self.assertRaises(einhorn.NotEinhornWorker):
         einhorn.ack_startup()