memgraph/src/memgraph_bolt.cpp
Matej Ferencevic e5c814e022 First version of new bolt decoder and tests.
Summary:
Extracted constants to codes.hpp.

Extracted bolt constants.

Extracted StreamBuffer and fixed data type.

Extracted bolt testdata.

Added bolt buffer and tests.

Added bolt decoder buffer and tests.

Renamed bolt testdata.

Reviewers: dgleich, buda, matej.gradicek

Reviewed By: buda

Subscribers: pullbot

Differential Revision: https://phabricator.memgraph.io/D220
2017-04-06 14:30:19 +02:00

118 lines
3.1 KiB
C++

#include <signal.h>
#include <iostream>
#include "dbms/dbms.hpp"
#include "query/engine.hpp"
#include "communication/bolt/v1/session.hpp"
#include "communication/server.hpp"
#include "io/network/network_endpoint.hpp"
#include "io/network/network_error.hpp"
#include "io/network/socket.hpp"
#include "logging/default.hpp"
#include "logging/streams/stdout.hpp"
#include "utils/config/config.hpp"
#include "utils/signals/handler.hpp"
#include "utils/stacktrace/log.hpp"
#include "utils/terminate_handler.hpp"
using endpoint_t = io::network::NetworkEndpoint;
using socket_t = io::network::Socket;
using session_t = communication::bolt::Session<socket_t>;
using result_stream_t = communication::bolt::ResultStream<
communication::bolt::Encoder<communication::bolt::ChunkedEncoderBuffer<socket_t>>>;
using bolt_server_t =
communication::Server<session_t, result_stream_t, socket_t>;
static bolt_server_t *serverptr;
Logger logger;
// TODO: load from config
static constexpr const char *interface = "0.0.0.0";
static constexpr const char *port = "7687";
void throw_and_stacktace(std::string message) {
Stacktrace stacktrace;
logger.info(stacktrace.dump());
}
int main(int argc, char **argv) {
// logging init
#ifdef SYNC_LOGGER
logging::init_sync();
#else
logging::init_async();
#endif
logging::log->pipe(std::make_unique<Stdout>());
// get logger
logger = logging::log->logger("Main");
logger.info("{}", logging::log->type());
// unhandled exception handler init
std::set_terminate(&terminate_handler);
// signal handling init
SignalHandler::register_handler(Signal::SegmentationFault, []() {
log_stacktrace("SegmentationFault signal raised");
std::exit(EXIT_FAILURE);
});
SignalHandler::register_handler(Signal::Terminate, []() {
log_stacktrace("Terminate signal raised");
std::exit(EXIT_FAILURE);
});
SignalHandler::register_handler(Signal::Abort, []() {
log_stacktrace("Abort signal raised");
std::exit(EXIT_FAILURE);
});
// register args
CONFIG_REGISTER_ARGS(argc, argv);
// initialize endpoint
endpoint_t endpoint;
try {
endpoint = endpoint_t(interface, port);
} catch (io::network::NetworkEndpointException &e) {
logger.error("{}", e.what());
std::exit(EXIT_FAILURE);
}
// initialize socket
socket_t socket;
if (!socket.Bind(endpoint)) {
logger.error("Cannot bind to socket on {} at {}", interface, port);
std::exit(EXIT_FAILURE);
}
if (!socket.SetNonBlocking()) {
logger.error("Cannot set socket to non blocking!");
std::exit(EXIT_FAILURE);
}
if (!socket.Listen(1024)) {
logger.error("Cannot listen on socket!");
std::exit(EXIT_FAILURE);
}
logger.info("Listening on {} at {}", interface, port);
Dbms dbms;
QueryEngine<result_stream_t> query_engine;
// initialize server
bolt_server_t server(std::move(socket), dbms, query_engine);
serverptr = &server;
// server start with N threads
// TODO: N should be configurable
auto N = std::thread::hardware_concurrency();
logger.info("Starting {} workers", N);
server.Start(N);
logger.info("Shutting down...");
return EXIT_SUCCESS;
}