예제 #1
0
    def graceful_shutdown(*_):
        """ Stop accepting new requests and exit when all requests are finished
    or timeout is exceeded.
    """
        signal_time = time.time()
        logger.info('Stopping server')
        tornado_server.stop()
        io_loop = ioloop.IOLoop.current()

        def stop_on_signal():
            current_requests = service_stats.current_requests
            if current_requests and time.time(
            ) - signal_time < SHUTTING_DOWN_TIMEOUT:
                logger.warning(
                    "Can't stop Taskqueue server now as {reqs} requests are "
                    "still in progress".format(reqs=current_requests))
            else:
                if current_requests:
                    logger.error(
                        "Shutting down server despite {reqs} requests "
                        "in progress".format(reqs=current_requests))
                # Stop tornado IO loop and zookeeper client
                io_loop.stop()
                zk_client.stop()
                logger.info("IOLoop stopped")

        ioloop.PeriodicCallback(stop_on_signal, 200).start()
예제 #2
0
def main():
    """ Main function which initializes and starts the tornado server. """
    # Parse command line arguments
    parser = argparse.ArgumentParser(description='A taskqueue API server')
    parser.add_argument('--port',
                        '-p',
                        default='17447',
                        help='TaskQueue server port')
    parser.add_argument('--verbose',
                        action='store_true',
                        help='Output debug-level logging')
    args = parser.parse_args()
    if args.verbose:
        logging.getLogger('appscale').setLevel(logging.DEBUG)

    # Configure zookeeper and db access
    zk_client = KazooClient(hosts=','.join(appscale_info.get_zk_node_ips()),
                            connection_retry=ZK_PERSISTENT_RECONNECTS)
    zk_client.start()
    db_access = DatastoreProxy()

    # Initialize tornado server
    task_queue = distributed_tq.DistributedTaskQueue(db_access, zk_client)
    tq_application = prepare_taskqueue_application(task_queue)
    # Automatically decompress incoming requests.
    server = httpserver.HTTPServer(tq_application, decompress_request=True)
    server.listen(args.port)

    # Make sure taskqueue shuts down gracefully when signal is received
    graceful_shutdown = prepare_graceful_shutdown(zk_client, server)
    signal.signal(signal.SIGTERM, graceful_shutdown)
    signal.signal(signal.SIGINT, graceful_shutdown)

    logger.info('Starting TaskQueue server on port {}'.format(args.port))
    ioloop.IOLoop.current().start()
예제 #3
0
def main():
  """ Main function which initializes and starts the tornado server. """
  # Parse command line arguments
  parser = argparse.ArgumentParser(description='A taskqueue API server')
  parser.add_argument('--port', '-p', default='17447',
                      help='TaskQueue server port')
  parser.add_argument('--verbose', action='store_true',
                      help='Output debug-level logging')
  args = parser.parse_args()
  if args.verbose:
    logger.setLevel(logging.DEBUG)

  # Configure zookeeper and db access
  zk_client = KazooClient(
    hosts=','.join(appscale_info.get_zk_node_ips()),
    connection_retry=ZK_PERSISTENT_RECONNECTS)
  zk_client.start()
  db_access = DatastoreProxy()

  # Initialize tornado server
  task_queue = distributed_tq.DistributedTaskQueue(db_access, zk_client)
  tq_application = prepare_taskqueue_application(task_queue)
  # Automatically decompress incoming requests.
  server = httpserver.HTTPServer(tq_application, decompress_request=True)
  server.listen(args.port)

  # Make sure taskqueue shuts down gracefully when signal is received
  graceful_shutdown = prepare_graceful_shutdown(zk_client, server)
  signal.signal(signal.SIGTERM, graceful_shutdown)
  signal.signal(signal.SIGINT, graceful_shutdown)

  logger.info('Starting TaskQueue server on port {}'.format(args.port))
  ioloop.IOLoop.current().start()
예제 #4
0
    def create_server_node():
        """ Creates a server registration entry in ZooKeeper. """
        try:
            zk_client.retry(zk_client.create, server_node, ephemeral=True)
        except NodeExistsError:
            # If the server gets restarted, the old node may exist for a short time.
            zk_client.retry(zk_client.delete, server_node)
            zk_client.retry(zk_client.create, server_node, ephemeral=True)

        logger.info('TaskQueue server registered at {}'.format(server_node))
예제 #5
0
 def stop_on_signal():
   current_requests = service_stats.current_requests
   if current_requests and monotonic.monotonic() < deadline:
     logger.warning("Can't stop Taskqueue server now as {reqs} requests are "
                    "still in progress".format(reqs=current_requests))
   else:
     if current_requests:
       logger.error("Shutting down server despite {reqs} requests "
                    "in progress".format(reqs=current_requests))
     # Stop tornado IO loop and zookeeper client
     io_loop.stop()
     zk_client.stop()
     logger.info("IOLoop stopped")
예제 #6
0
 def stop_on_signal():
   current_requests = service_stats.current_requests
   if current_requests and time.time() - signal_time < SHUTTING_DOWN_TIMEOUT:
     logger.warning("Can't stop Taskqueue server now as {reqs} requests are "
                    "still in progress".format(reqs=current_requests))
   else:
     if current_requests:
       logger.error("Shutting down server despite {reqs} requests "
                    "in progress".format(reqs=current_requests))
     # Stop tornado IO loop and zookeeper client
     io_loop.stop()
     zk_client.stop()
     logger.info("IOLoop stopped")
예제 #7
0
  def get_connection(self):
    """ Provides postgres connection. It can either return existing
    working connection or establish new one.

    Returns:
      An instance of psycopg2 connection.
    """
    if not self._connection or self._connection.closed:
      logger.info('Establishing new connection to Postgres server')
      self._connection = psycopg2.connect(
        dsn=self._dsn,
        connect_timeout=10,
        options='-c statement_timeout=60000',
        keepalives_idle=60,
        keepalives_interval=15,
        keepalives_count=4
      )
    return self._connection
예제 #8
0
  def graceful_shutdown(*_):
    """ Stop accepting new requests and exit when all requests are finished
    or timeout is exceeded.
    """
    signal_time = time.time()
    logger.info('Stopping server')
    tornado_server.stop()
    io_loop = ioloop.IOLoop.current()

    def stop_on_signal():
      current_requests = service_stats.current_requests
      if current_requests and time.time() - signal_time < SHUTTING_DOWN_TIMEOUT:
        logger.warning("Can't stop Taskqueue server now as {reqs} requests are "
                       "still in progress".format(reqs=current_requests))
      else:
        if current_requests:
          logger.error("Shutting down server despite {reqs} requests "
                       "in progress".format(reqs=current_requests))
        # Stop tornado IO loop and zookeeper client
        io_loop.stop()
        zk_client.stop()
        logger.info("IOLoop stopped")

    ioloop.PeriodicCallback(stop_on_signal, 200).start()
예제 #9
0
 def get_connection(self):
     if not self._connection or self._connection.closed:
         logger.info('Establishing new connection to Postgres server')
         self._connection = psycopg2.connect(*self._args, **self._kwargs)
     return self._connection