예제 #1
0
def handle_request(transport, request_message):
    """
        Reads a request from a client and processes it

        If user inputs 'quit' stops the event loop
        otherwise just echoes user input
    """
    logger.debug('Receive request: --|' + str(request_message) + '|--')

    try:
        output_batch = execute_query_fetch_all(request_message)
    except Exception as e:
        logger.warn(e)
        response = Response(status=ResponseStatus.FAIL,
                            batch=None,
                            error=str(e))
    else:
        response = Response(status=ResponseStatus.SUCCESS, batch=output_batch)

    responseData = response.to_json()
    # Send data length, because response can be very large
    data = (str(len(responseData)) + '|' + responseData).encode('ascii')

    logger.debug('Response to client: --|' + str(response) + '|--\n' +
                 'Length: ' + str(len(responseData)))

    transport.write(data)

    return response
예제 #2
0
    def send_message(self, message):

        logger.debug("[ " + str(self.id) + " ]" + " Request to server: --|" +
                     str(message) + "|--")

        request_chunk = (str(len(message)) + '|' + message).encode('ascii')
        # Send request
        self.transport.write(request_chunk)
예제 #3
0
 def frames(self, values):
     if isinstance(values, DataFrame):
         self._frames = values
     else:
         logger.debug('Batch constructor not properly called!')
         raise ValueError('Batch constructor not properly called. \
             Expected pandas.DataFrame')
     self._batch_size = len(values)
예제 #4
0
def start_server(host: string, port: int, loop, socket_timeout: int,
                 stop_server_future):
    """
        Start the server.
        Server objects are asynchronous context managers.

        hostname: hostname of the server
        stop_server_future: future for externally stopping the server
    """

    logger.critical('Start Server')

    # Register signal handler
    def raiseSystemExit(_, __):
        raise SystemExit

    signals = [SIGINT, SIGTERM, SIGHUP, SIGUSR1]

    for handled_signal in signals:
        signal(handled_signal, raiseSystemExit)

    # Get a reference to the event loop
    # loop = asyncio.get_event_loop()

    # Start the eva server
    coro = loop.create_server(lambda: EvaServer(socket_timeout), host, port)
    server = loop.run_until_complete(coro)

    for socket in server.sockets:
        logger.critical('PID(' + str(os.getpid()) + ') serving on ' +
                        str(socket.getsockname()))

    server_closed = loop.create_task(server.wait_closed())

    # Start the realtime status monitor
    monitor = loop.create_task(realtime_server_status(EvaServer,
                                                      server_closed))

    try:
        loop.run_until_complete(stop_server_future)

    except KeyboardInterrupt:

        logger.debug("Server process interrupted")

    finally:
        # Stop monitor
        monitor.cancel()

        # Close server
        server.close()

        # Stop event loop
        loop.run_until_complete(server.wait_closed())
        loop.close()

        logger.debug("Successfully shutdown server.")
예제 #5
0
    def connection_made(self, transport):
        self.transport = transport

        if not set_socket_io_timeouts(self.transport, 60, 0):
            self.transport.abort()
            logger.debug("[ " + str(self.id) + " ]" + " Could not set timeout")
            return

        logger.debug("[ " + str(self.id) + " ]" + " Connected to server")
예제 #6
0
    def data_received(self, data):

        response_chunk = data.decode()
        logger.debug("[ " + str(self.id) + " ]" +
                     " Response from server: --|" + str(response_chunk) +
                     "|--")

        self.buffer.feed_data(response_chunk)
        while self.buffer.has_complete_message():
            message = self.buffer.read_message()
            self.queue.put_nowait(message)
예제 #7
0
    def connection_made(self, transport):
        self.transport = transport

        # Set timeout for sockets
        if not set_socket_io_timeouts(self.transport, self._socket_timeout, 0):
            self.transport.abort()
            return

        # Each client connection creates a new protocol instance
        peername = transport.get_extra_info('peername')
        logger.debug('Connection from client: ' + str(peername) +
                     str(self._socket_timeout))
        EvaServer.__connections__ += 1
예제 #8
0
    def __init__(self, loop=None):
        self.done = asyncio.Future()
        self.transport = None
        self.buffer = EvaProtocolBuffer()
        if loop is None:
            loop = asyncio.get_event_loop()
        self.queue = asyncio.Queue(loop=loop)
        self.loop = loop
        self.id = EvaClient.__connections__

        EvaClient.__connections__ += 1

        logger.debug("[ " + str(self.id) + " ]" + " Init Client")
예제 #9
0
    def _read(self) -> Iterator[Dict]:
        video = cv2.VideoCapture(self.file_url)
        video_offset = self.offset if self.offset else 0
        video.set(cv2.CAP_PROP_POS_FRAMES, video_offset)

        logger.debug("Reading frames")

        _, frame = video.read()
        frame_id = self._start_frame_id

        while frame is not None:
            yield {'id': frame_id, 'data': frame}
            _, frame = video.read()
            frame_id += 1
예제 #10
0
    def connection_lost(self, exc, exc2=None):

        logger.debug("[ " + str(self.id) + " ]" + " Disconnected from server")

        try:
            self.transport.abort()  # free sockets early, free sockets often
            self.transport = None
        except Exception as e:
            logger.exception(e)
            exc2 = e
        finally:
            if exc or exc2:
                EvaClient.__errors__ += 1
                self.done.set_exception(exc or exc2)
                self.done.exception()  # remove _tb_logger
            else:
                self.done.set_result(None)
예제 #11
0
    def data_received(self, data):

        message = data.decode()
        logger.debug('Request from client: --|' + str(message) + '|--')

        self.buffer.feed_data(message)
        while self.buffer.has_complete_message():
            request_message = self.buffer.read_message()

            if request_message in ["quit", "exit"]:
                logger.debug('Close client socket')
                return self.transport.close()
            else:
                logger.debug('Handle request')
                asyncio.create_task(
                    handle_request(self.transport, request_message))