From c7520a2156ee708f336b4c8177ec971aa6fc7200 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Mon, 19 Jun 2017 14:01:03 +0300 Subject: [PATCH] Add name and uri helpers to Backend Providing helper functions for the commonly used parts of the server makes code easier to read. It also removes any possibility for formatting problems by moving the URI and name string handling inside the Backend class. --- include/maxscale/backend.hh | 17 ++++++++ server/core/backend.cc | 16 ++++++++ .../routing/readwritesplit/readwritesplit.cc | 10 ++--- .../routing/readwritesplit/rwsplit_mysql.cc | 5 +-- .../readwritesplit/rwsplit_route_stmt.cc | 39 +++++++++---------- .../readwritesplit/rwsplit_select_backends.cc | 4 +- .../readwritesplit/rwsplit_session_cmd.cc | 2 +- 7 files changed, 61 insertions(+), 32 deletions(-) diff --git a/include/maxscale/backend.hh b/include/maxscale/backend.hh index fbff8bbcf..a7c84911c 100644 --- a/include/maxscale/backend.hh +++ b/include/maxscale/backend.hh @@ -15,6 +15,7 @@ #include #include +#include #include #include @@ -251,6 +252,21 @@ public: */ bool has_failed() const; + + /** + * @brief Get the object name of this server + * + * @return The unique object name of this server + */ + const char* name() const; + + /** + * @brief Get the address and port as a string + * + * @return The address and port combined into one string + */ + const char* uri() const; + private: /** * Internal state of the backend @@ -284,6 +300,7 @@ private: int m_state; /**< State of the backend */ SessionCommandList m_session_commands; /**< List of session commands that are * to be executed on this backend server */ + std::string m_uri; /**< The combined address and port */ }; typedef std::tr1::shared_ptr SBackend; diff --git a/server/core/backend.cc b/server/core/backend.cc index fffca81ce..133ceefc6 100644 --- a/server/core/backend.cc +++ b/server/core/backend.cc @@ -12,6 +12,9 @@ */ #include + +#include + #include #include @@ -23,6 +26,9 @@ Backend::Backend(SERVER_REF *ref): m_dcb(NULL), m_state(0) { + std::stringstream ss; + ss << "[" << server()->name << "]:" << server()->port; + m_uri = ss.str(); } Backend::~Backend() @@ -298,3 +304,13 @@ bool Backend::has_failed() const { return m_state & FATAL_FAILURE; } + +const char* Backend::name() const +{ + return m_backend->server->unique_name; +} + +const char* Backend::uri() const +{ + return m_uri.c_str(); +} diff --git a/server/modules/routing/readwritesplit/readwritesplit.cc b/server/modules/routing/readwritesplit/readwritesplit.cc index 3540345d5..fcb253af8 100644 --- a/server/modules/routing/readwritesplit/readwritesplit.cc +++ b/server/modules/routing/readwritesplit/readwritesplit.cc @@ -360,7 +360,7 @@ static bool reroute_stored_statement(ROUTER_CLIENT_SES *rses, const SRWBackend& /** Found a valid candidate; a non-master slave that's in use */ if (backend->write(stored)) { - MXS_INFO("Retrying failed read at '%s'.", backend->server()->unique_name); + MXS_INFO("Retrying failed read at '%s'.", backend->name()); ss_dassert(backend->get_reply_state() == REPLY_STATE_DONE); LOG_RS(backend, REPLY_STATE_START); backend->set_reply_state(REPLY_STATE_START); @@ -379,7 +379,7 @@ static bool reroute_stored_statement(ROUTER_CLIENT_SES *rses, const SRWBackend& */ if (rses->current_master->write(stored)) { - MXS_INFO("Retrying failed read at '%s'.", rses->current_master->server()->unique_name); + MXS_INFO("Retrying failed read at '%s'.", rses->current_master->name()); LOG_RS(rses->current_master, REPLY_STATE_START); ss_dassert(rses->current_master->get_reply_state() == REPLY_STATE_DONE); rses->current_master->set_reply_state(REPLY_STATE_START); @@ -1178,8 +1178,8 @@ static void clientReply(MXS_ROUTER *instance, /** Check pending session commands */ else if (!queue_routed && backend->session_command_count()) { - MXS_INFO("Backend [%s]:%d processed reply and starts to execute active cursor.", - backend->server()->name, backend->server()->port); + MXS_INFO("Backend %s processed reply and starts to execute active cursor.", + backend->uri()); if (backend->execute_session_command()) { @@ -1331,7 +1331,7 @@ static void handleError(MXS_ROUTER *instance, { ss_dassert(false); MXS_ERROR("Backend '%s' is still in use and points to the problem DCB.", - backend->server()->unique_name); + backend->name()); } } else diff --git a/server/modules/routing/readwritesplit/rwsplit_mysql.cc b/server/modules/routing/readwritesplit/rwsplit_mysql.cc index 846deabb1..904cfde18 100644 --- a/server/modules/routing/readwritesplit/rwsplit_mysql.cc +++ b/server/modules/routing/readwritesplit/rwsplit_mysql.cc @@ -292,9 +292,8 @@ void check_session_command_reply(GWBUF *buffer, SRWBackend backend) err.append(replybuf + 8, 5); msg.append(replybuf + 13, replylen - 4 - 5); - MXS_ERROR("Failed to execute session command in [%s]:%d. Error was: %s %s", - backend->server()->name, backend->server()->port, - err.c_str(), msg.c_str()); + MXS_ERROR("Failed to execute session command in %s. Error was: %s %s", + backend->uri(), err.c_str(), msg.c_str()); } } diff --git a/server/modules/routing/readwritesplit/rwsplit_route_stmt.cc b/server/modules/routing/readwritesplit/rwsplit_route_stmt.cc index 3cf1b6fa4..a12fd1973 100644 --- a/server/modules/routing/readwritesplit/rwsplit_route_stmt.cc +++ b/server/modules/routing/readwritesplit/rwsplit_route_stmt.cc @@ -84,7 +84,7 @@ void handle_connection_keepalive(ROUTER_INSTANCE *inst, ROUTER_CLIENT_SES *rses, if (diff > keepalive) { MXS_INFO("Pinging %s, idle for %d seconds", - backend->server()->unique_name, diff / 10); + backend->name(), diff / 10); modutil_ignorable_ping(backend->dcb()); } } @@ -268,14 +268,13 @@ bool route_session_write(ROUTER_CLIENT_SES *rses, GWBUF *querybuf, uint8_t comma rses->expected_responses++; } - MXS_INFO("Route query to %s \t[%s]:%d", + MXS_INFO("Route query to %s \t%s", backend->is_master() ? "master" : "slave", - backend->server()->name, backend->server()->port); + backend->uri()); } else { - MXS_ERROR("Failed to execute session command in [%s]:%d", - backend->server()->name, backend->server()->port); + MXS_ERROR("Failed to execute session command in %s", backend->uri()); } } } @@ -335,7 +334,7 @@ SRWBackend get_target_backend(ROUTER_CLIENT_SES *rses, backend_type_t btype, if (rses->target_node && session_trx_is_read_only(rses->client_dcb->session)) { MXS_DEBUG("In READ ONLY transaction, using server '%s'", - rses->target_node->server()->unique_name); + rses->target_node->name()); return rses->target_node; } @@ -354,7 +353,7 @@ SRWBackend get_target_backend(ROUTER_CLIENT_SES *rses, backend_type_t btype, /** The server must be a valid slave, relay server, or master */ if (backend->in_use() && backend->is_active() && - (strcasecmp(name, backend->server()->unique_name) == 0) && + (strcasecmp(name, backend->name()) == 0) && (backend->is_slave() || backend->is_relay() || backend->is_master())) @@ -443,10 +442,9 @@ SRWBackend get_target_backend(ROUTER_CLIENT_SES *rses, backend_type_t btype, } else { - MXS_INFO("Server [%s]:%d is too much behind the master " + MXS_INFO("Server %s is too much behind the master " "(%d seconds) and can't be chosen", - backend->server()->name, backend->server()->port, - backend->server()->rlag); + backend->uri(), backend->server()->rlag); } } } /*< for */ @@ -475,14 +473,14 @@ SRWBackend get_target_backend(ROUTER_CLIENT_SES *rses, backend_type_t btype, { MXS_ERROR("Server '%s' should be master but is %s instead " "and can't be chosen as the master.", - master->server()->unique_name, + master->name(), STRSRVSTATUS(&server)); } } else { MXS_ERROR("Server '%s' is not in use and can't be chosen as the master.", - master->server()->unique_name); + master->name()); } } } @@ -908,24 +906,24 @@ static void log_master_routing_failure(ROUTER_CLIENT_SES *rses, bool found, { /** We found a master but it's not the same connection */ ss_dassert(old_master != curr_master); - if (old_master->server() != curr_master->server()) + if (old_master != curr_master) { sprintf(errmsg, "Master server changed from '%s' to '%s'", - old_master->server()->unique_name, - curr_master->server()->unique_name); + old_master->name(), + curr_master->name()); } else { ss_dassert(false); // Currently we don't reconnect to the master sprintf(errmsg, "Connection to master '%s' was recreated", - curr_master->server()->unique_name); + curr_master->name()); } } else if (old_master) { /** We have an original master connection but we couldn't find it */ sprintf(errmsg, "The connection to master server '%s' is not available", - old_master->server()->unique_name); + old_master->name()); } else { @@ -1024,12 +1022,11 @@ handle_got_target(ROUTER_INSTANCE *inst, ROUTER_CLIENT_SES *rses, { rses->target_node = target; MXS_DEBUG("Setting forced_node SLAVE to %s within an opened READ ONLY transaction", - target->server()->unique_name); + target->name()); } - MXS_INFO("Route query to %s \t[%s]:%d <", - (target->is_master() ? "master" : "slave"), - target->server()->name, target->server()->port); + MXS_INFO("Route query to %s \t%s <", target->is_master() ? "master" : "slave", + target->uri()); /** The session command cursor must not be active */ ss_dassert(target->session_command_count() == 0); diff --git a/server/modules/routing/readwritesplit/rwsplit_select_backends.cc b/server/modules/routing/readwritesplit/rwsplit_select_backends.cc index e46d25b94..eaa92ccb9 100644 --- a/server/modules/routing/readwritesplit/rwsplit_select_backends.cc +++ b/server/modules/routing/readwritesplit/rwsplit_select_backends.cc @@ -419,8 +419,8 @@ bool select_connect_backend_servers(int router_nservers, SRWBackend& backend = *it; if (backend->in_use()) { - MXS_INFO("Selected %s in \t[%s]:%d", STRSRVSTATUS(backend->server()), - backend->server()->name, backend->server()->port); + MXS_INFO("Selected %s in \t%s", STRSRVSTATUS(backend->server()), + backend->uri()); } } } diff --git a/server/modules/routing/readwritesplit/rwsplit_session_cmd.cc b/server/modules/routing/readwritesplit/rwsplit_session_cmd.cc index f455fcab0..9b7a79910 100644 --- a/server/modules/routing/readwritesplit/rwsplit_session_cmd.cc +++ b/server/modules/routing/readwritesplit/rwsplit_session_cmd.cc @@ -61,7 +61,7 @@ void process_sescmd_response(ROUTER_CLIENT_SES* rses, SRWBackend& backend, { MXS_ERROR("Slave server '%s': response differs from master's response. " "Closing connection due to inconsistent session state.", - backend->server()->unique_name); + backend->name()); backend->close(mxs::Backend::CLOSE_FATAL); *pReconnect = true; }