Changes have been pushed for the repository "fawkesrobotics/fawkes".
Clone: https://github.com/fawkesrobotics/fawkes.git Gitweb: https://github.com/fawkesrobotics/fawkes The branch, thofmann/mongocxx-v3 has been updated to 2121d3c9bd997550407d8851fe4d4bd84a77401b (commit) via 12312835139a0f9ae847ca4f0028b3019580604f (commit) via da6477e8186bd63474a4f231d0c0617dfc271fbc (commit) via b1339256a7f5cc9ca50fce6c53fb5a120b20ae8b (commit) via f3a7a720c12efa7439868e515b96019327d5eb2a (commit) via 5ea2049fffbc1e3fde6ba709ab789a909a9a9376 (commit) from c0c8d0c10060c62ddf3c0602ba87ed2b57d66e58 (commit) https://github.com/fawkesrobotics/fawkes/tree/thofmann/mongocxx-v3 Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - *Log* --------------------------------------------------------------- commit 5ea2049fffbc1e3fde6ba709ab789a909a9a9376 Author: Till Hofmann <hofm...@kbsg.rwth-aachen.de> AuthorDate: Sat Apr 13 15:01:20 2019 +0200 Commit: Till Hofmann <hofm...@kbsg.rwth-aachen.de> CommitDate: Sat Apr 13 15:01:20 2019 +0200 mongodb: only create RS bootstrap collection if it does not exist yet Otherwise, we will get an error if the collection already exists. https://github.com/fawkesrobotics/fawkes/commit/5ea2049ff - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - commit f3a7a720c12efa7439868e515b96019327d5eb2a Author: Till Hofmann <hofm...@kbsg.rwth-aachen.de> AuthorDate: Sat Apr 13 15:19:41 2019 +0200 Commit: Till Hofmann <hofm...@kbsg.rwth-aachen.de> CommitDate: Sat Apr 13 15:19:41 2019 +0200 mongocxx: check RS status by checking error field of thrown exception If the RS is not configured or the config is invalid, mongocxx now also throws an operation_exception with a respective error code in the raw server error. Adapt the status check accordingly. https://github.com/fawkesrobotics/fawkes/commit/f3a7a720c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - commit b1339256a7f5cc9ca50fce6c53fb5a120b20ae8b Author: Till Hofmann <hofm...@kbsg.rwth-aachen.de> AuthorDate: Sat Apr 13 15:30:20 2019 +0200 Commit: Till Hofmann <hofm...@kbsg.rwth-aachen.de> CommitDate: Sat Apr 13 15:33:38 2019 +0200 mongodb: fix check for duplicate key error We need to get the error code from the array writeErrors, which is part of the raw error of the operation_exception. If there is more than one error or the error code is not a duplicate key error, assume that the leader election failed. Otherwise, ignore the error. https://github.com/fawkesrobotics/fawkes/commit/b1339256a - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - commit da6477e8186bd63474a4f231d0c0617dfc271fbc Author: Till Hofmann <hofm...@kbsg.rwth-aachen.de> AuthorDate: Sat Apr 13 15:43:29 2019 +0200 Commit: Till Hofmann <hofm...@kbsg.rwth-aachen.de> CommitDate: Sat Apr 13 15:43:29 2019 +0200 mongodb: fix error count in leader election It turns out the length() function of a bsoncxx::array::view does not give you the number of elements of the array, but the size of the array. We need to use std::distance instead to get the number of errors. https://github.com/fawkesrobotics/fawkes/commit/da6477e81 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - commit 12312835139a0f9ae847ca4f0028b3019580604f Author: Till Hofmann <hofm...@kbsg.rwth-aachen.de> AuthorDate: Sat Apr 13 15:49:52 2019 +0200 Commit: Till Hofmann <hofm...@kbsg.rwth-aachen.de> CommitDate: Sat Apr 13 15:49:52 2019 +0200 mongodb: avoid segfault due to empty error code in server reply Sometimes an operation exception does not contain an error code. Check if the element is valid before accessing it. If it is not valid, assume an unknown error. https://github.com/fawkesrobotics/fawkes/commit/123128351 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - commit 2121d3c9bd997550407d8851fe4d4bd84a77401b Author: Till Hofmann <hofm...@kbsg.rwth-aachen.de> AuthorDate: Sat Apr 13 15:55:25 2019 +0200 Commit: Till Hofmann <hofm...@kbsg.rwth-aachen.de> CommitDate: Sat Apr 13 15:55:25 2019 +0200 mongodb: pass c'tor parameters to ReplicaConfig by const reference Found by Codacy. https://github.com/fawkesrobotics/fawkes/commit/2121d3c9b - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *Summary* ----------------------------------------------------------- src/plugins/mongodb/mongodb_replicaset_config.cpp | 132 +++++++++++----------- src/plugins/mongodb/mongodb_replicaset_config.h | 4 +- 2 files changed, 70 insertions(+), 66 deletions(-) - *Diffs* ------------------------------------------------------------- - *commit* 5ea2049fffbc1e3fde6ba709ab789a909a9a9376 - - - - - - - - - - Author: Till Hofmann <hofm...@kbsg.rwth-aachen.de> Date: Sat Apr 13 15:01:20 2019 +0200 Subject: mongodb: only create RS bootstrap collection if it does not exist yet src/plugins/mongodb/mongodb_replicaset_config.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) _Diff for modified files_: diff --git a/src/plugins/mongodb/mongodb_replicaset_config.cpp b/src/plugins/mongodb/mongodb_replicaset_config.cpp index 0e4b42a46..fe211e613 100644 --- a/src/plugins/mongodb/mongodb_replicaset_config.cpp +++ b/src/plugins/mongodb/mongodb_replicaset_config.cpp @@ -181,7 +181,7 @@ MongoDBReplicaSetConfig::bootstrap() if (enabled_) { try { auto database = bootstrap_client_->database(bootstrap_database_); - auto collection = database.create_collection(bootstrap_ns_); + auto collection = database[bootstrap_ns_]; collection.create_index(basic::make_document(basic::kvp("host", 1))); collection.create_index(basic::make_document(basic::kvp("master", 1)), - *commit* f3a7a720c12efa7439868e515b96019327d5eb2a - - - - - - - - - - Author: Till Hofmann <hofm...@kbsg.rwth-aachen.de> Date: Sat Apr 13 15:19:41 2019 +0200 Subject: mongocxx: check RS status by checking error field of thrown exception src/plugins/mongodb/mongodb_replicaset_config.cpp | 110 ++++++++++------------ 1 file changed, 51 insertions(+), 59 deletions(-) _Diff for modified files_: diff --git a/src/plugins/mongodb/mongodb_replicaset_config.cpp b/src/plugins/mongodb/mongodb_replicaset_config.cpp index fe211e613..15403dd94 100644 --- a/src/plugins/mongodb/mongodb_replicaset_config.cpp +++ b/src/plugins/mongodb/mongodb_replicaset_config.cpp @@ -324,72 +324,64 @@ MongoDBReplicaSetConfig::rs_status(bsoncxx::document::value &reply) auto cmd = basic::make_document(basic::kvp("replSetGetStatus", 1)); try { - reply = local_client_->database("admin").run_command(std::move(cmd)); - bool ok = int(reply.view()["ok"].get_double()) == 1; - if (!ok) { - int error_code = reply.view()["code"].get_int32(); - if (error_code == 94 /* NotYetInitialized */) { - logger->log_warn(name(), "Instance has not received replica set configuration, yet"); - status.member_status = MongoDBManagedReplicaSetInterface::NOT_INITIALIZED; - status.error_msg = "Instance has not received replica set configuration, yet"; - } else if (error_code == 93 /* InvalidReplicaSetConfig */) { - logger->log_error(name(), - "Invalid replica set configuration: %s", - bsoncxx::to_json(reply.view()).c_str()); - status.member_status = MongoDBManagedReplicaSetInterface::INVALID_CONFIG; - status.error_msg = "Invalid replica set configuration: " + bsoncxx::to_json(reply.view()); - } else { - status.error_msg = "Unknown error"; - } - return status; + reply = local_client_->database("admin").run_command(std::move(cmd)); + } catch (mongocxx::operation_exception &e) { + int error_code = e.raw_server_error()->view()["code"].get_int32(); + if (error_code == 94 /* NotYetInitialized */) { + logger->log_warn(name(), "Instance has not received replica set configuration, yet"); + status.member_status = MongoDBManagedReplicaSetInterface::NOT_INITIALIZED; + status.error_msg = "Instance has not received replica set configuration, yet"; + } else if (error_code == 93 /* InvalidReplicaSetConfig */) { + logger->log_error(name(), + "Invalid replica set configuration: %s", + bsoncxx::to_json(reply.view()).c_str()); + status.member_status = MongoDBManagedReplicaSetInterface::INVALID_CONFIG; + status.error_msg = "Invalid replica set configuration: " + bsoncxx::to_json(reply.view()); } else { - //logger->log_warn(name(), "rs status reply: %s", bsoncxx::to_json(reply.view()).c_str()); - try { - MongoDBManagedReplicaSetInterface::ReplicaSetMemberStatus self_status = - MongoDBManagedReplicaSetInterface::REMOVED; - auto members = reply.view()["members"]; - if (members && members.type() == bsoncxx::type::k_array) { - bsoncxx::array::view members_view{members.get_array().value}; - bool have_primary = false; - for (bsoncxx::array::element member : members_view) { - int state = member["state"].get_int32(); - if (state == 1) { - have_primary = true; - } - if (member["self"] && member["self"].get_bool()) { - switch (state) { - case 1: self_status = MongoDBManagedReplicaSetInterface::PRIMARY; break; - case 2: self_status = MongoDBManagedReplicaSetInterface::SECONDARY; break; - case 3: // RECOVERING - case 5: // STARTUP2 - case 9: // ROLLBACK - self_status = MongoDBManagedReplicaSetInterface::INITIALIZING; - break; - case 7: self_status = MongoDBManagedReplicaSetInterface::ARBITER; break; - default: self_status = MongoDBManagedReplicaSetInterface::ERROR; break; - } - } + status.error_msg = "Unknown error"; + } + return status; + } + //logger->log_warn(name(), "rs status reply: %s", bsoncxx::to_json(reply.view()).c_str()); + try { + MongoDBManagedReplicaSetInterface::ReplicaSetMemberStatus self_status = + MongoDBManagedReplicaSetInterface::REMOVED; + auto members = reply.view()["members"]; + if (members && members.type() == bsoncxx::type::k_array) { + bsoncxx::array::view members_view{members.get_array().value}; + bool have_primary = false; + for (bsoncxx::array::element member : members_view) { + int state = member["state"].get_int32(); + if (state == 1) { + have_primary = true; + } + if (member["self"] && member["self"].get_bool()) { + switch (state) { + case 1: self_status = MongoDBManagedReplicaSetInterface::PRIMARY; break; + case 2: self_status = MongoDBManagedReplicaSetInterface::SECONDARY; break; + case 3: // RECOVERING + case 5: // STARTUP2 + case 9: // ROLLBACK + self_status = MongoDBManagedReplicaSetInterface::INITIALIZING; + break; + case 7: self_status = MongoDBManagedReplicaSetInterface::ARBITER; break; + default: self_status = MongoDBManagedReplicaSetInterface::ERROR; break; } - status.primary_status = have_primary ? MongoDBManagedReplicaSetInterface::HAVE_PRIMARY - : MongoDBManagedReplicaSetInterface::NO_PRIMARY; - status.member_status = self_status; - return status; - } else { - logger->log_error(name(), - "Received replica set status reply without members, unknown status"); - self_status = MongoDBManagedReplicaSetInterface::ERROR; } - } catch (mongocxx::operation_exception &e) { - logger->log_warn(name(), "Failed to analyze member info: %s", e.what()); - status.member_status = MongoDBManagedReplicaSetInterface::ERROR; - status.error_msg = std::string("Failed to analyze member info: ") + e.what(); - return status; } + status.primary_status = have_primary ? MongoDBManagedReplicaSetInterface::HAVE_PRIMARY + : MongoDBManagedReplicaSetInterface::NO_PRIMARY; + status.member_status = self_status; + return status; + } else { + logger->log_error(name(), + "Received replica set status reply without members, unknown status"); + self_status = MongoDBManagedReplicaSetInterface::ERROR; } } catch (mongocxx::operation_exception &e) { - logger->log_warn(name(), "Failed to get RS status: %s", e.what()); + logger->log_warn(name(), "Failed to analyze member info: %s", e.what()); status.member_status = MongoDBManagedReplicaSetInterface::ERROR; - status.error_msg = std::string("Failed to get RS status: ") + e.what(); + status.error_msg = std::string("Failed to analyze member info: ") + e.what(); return status; } return status; - *commit* b1339256a7f5cc9ca50fce6c53fb5a120b20ae8b - - - - - - - - - - Author: Till Hofmann <hofm...@kbsg.rwth-aachen.de> Date: Sat Apr 13 15:30:20 2019 +0200 Subject: mongodb: fix check for duplicate key error src/plugins/mongodb/mongodb_replicaset_config.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) _Diff for modified files_: diff --git a/src/plugins/mongodb/mongodb_replicaset_config.cpp b/src/plugins/mongodb/mongodb_replicaset_config.cpp index 15403dd94..3b70d04c5 100644 --- a/src/plugins/mongodb/mongodb_replicaset_config.cpp +++ b/src/plugins/mongodb/mongodb_replicaset_config.cpp @@ -212,8 +212,12 @@ MongoDBReplicaSetConfig::leader_elect(bool force) } } catch (mongocxx::operation_exception &e) { if (boost::optional<bsoncxx::document::value> error = e.raw_server_error()) { - int error_code = error->view()["code"].get_int32(); - if (error_code != 11000) { + size_t num_errors = bsoncxx::array::view{error->view()["writeErrors"].get_array()}.length(); + int error_code = -1; + if (num_errors > 0) { + error_code = error->view()["writeErrors"][0]["code"].get_int32(); + } + if (num_errors > 1 || error_code != 11000) { // 11000: Duplicate key exception, occurs if we do not become leader, all fine logger->log_error(name(), "Leader election failed (%i): %s %s", - *commit* da6477e8186bd63474a4f231d0c0617dfc271fbc - - - - - - - - - - Author: Till Hofmann <hofm...@kbsg.rwth-aachen.de> Date: Sat Apr 13 15:43:29 2019 +0200 Subject: mongodb: fix error count in leader election src/plugins/mongodb/mongodb_replicaset_config.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) _Diff for modified files_: diff --git a/src/plugins/mongodb/mongodb_replicaset_config.cpp b/src/plugins/mongodb/mongodb_replicaset_config.cpp index 3b70d04c5..363675277 100644 --- a/src/plugins/mongodb/mongodb_replicaset_config.cpp +++ b/src/plugins/mongodb/mongodb_replicaset_config.cpp @@ -212,8 +212,10 @@ MongoDBReplicaSetConfig::leader_elect(bool force) } } catch (mongocxx::operation_exception &e) { if (boost::optional<bsoncxx::document::value> error = e.raw_server_error()) { - size_t num_errors = bsoncxx::array::view{error->view()["writeErrors"].get_array()}.length(); - int error_code = -1; + bsoncxx::array::view writeErrors = error->view()["writeErrors"].get_array(); + // Do not use writeErrors.length(), which is not the number of errors! + auto num_errors = std::distance(writeErrors.begin(), writeErrors.end()); + int error_code = -1; if (num_errors > 0) { error_code = error->view()["writeErrors"][0]["code"].get_int32(); } - *commit* 12312835139a0f9ae847ca4f0028b3019580604f - - - - - - - - - - Author: Till Hofmann <hofm...@kbsg.rwth-aachen.de> Date: Sat Apr 13 15:49:52 2019 +0200 Subject: mongodb: avoid segfault due to empty error code in server reply src/plugins/mongodb/mongodb_replicaset_config.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) _Diff for modified files_: diff --git a/src/plugins/mongodb/mongodb_replicaset_config.cpp b/src/plugins/mongodb/mongodb_replicaset_config.cpp index 363675277..ffed24c9d 100644 --- a/src/plugins/mongodb/mongodb_replicaset_config.cpp +++ b/src/plugins/mongodb/mongodb_replicaset_config.cpp @@ -332,7 +332,11 @@ MongoDBReplicaSetConfig::rs_status(bsoncxx::document::value &reply) try { reply = local_client_->database("admin").run_command(std::move(cmd)); } catch (mongocxx::operation_exception &e) { - int error_code = e.raw_server_error()->view()["code"].get_int32(); + int error_code = -1; + auto error_code_element = e.raw_server_error()->view()["code"]; + if (error_code_element && error_code_element.type() == bsoncxx::type::k_int32) { + error_code = e.raw_server_error()->view()["code"].get_int32(); + } if (error_code == 94 /* NotYetInitialized */) { logger->log_warn(name(), "Instance has not received replica set configuration, yet"); status.member_status = MongoDBManagedReplicaSetInterface::NOT_INITIALIZED; - *commit* 2121d3c9bd997550407d8851fe4d4bd84a77401b - - - - - - - - - - Author: Till Hofmann <hofm...@kbsg.rwth-aachen.de> Date: Sat Apr 13 15:55:25 2019 +0200 Subject: mongodb: pass c'tor parameters to ReplicaConfig by const reference src/plugins/mongodb/mongodb_replicaset_config.cpp | 6 +++--- src/plugins/mongodb/mongodb_replicaset_config.h | 4 +++- 2 files changed, 6 insertions(+), 4 deletions(-) _Diff for modified files_: diff --git a/src/plugins/mongodb/mongodb_replicaset_config.cpp b/src/plugins/mongodb/mongodb_replicaset_config.cpp index ffed24c9d..31c6b7cae 100644 --- a/src/plugins/mongodb/mongodb_replicaset_config.cpp +++ b/src/plugins/mongodb/mongodb_replicaset_config.cpp @@ -52,9 +52,9 @@ using namespace bsoncxx::builder; * @param prefix configuration path prefix * @param bootstrap_prefix configuration path prefix for bootstrap configuration */ -MongoDBReplicaSetConfig::MongoDBReplicaSetConfig(std::string cfgname, - std::string prefix, - std::string bootstrap_prefix) +MongoDBReplicaSetConfig::MongoDBReplicaSetConfig(const std::string &cfgname, + const std::string &prefix, + const std::string &bootstrap_prefix) : Thread("MongoDBReplicaSet", Thread::OPMODE_CONTINUOUS), leader_elec_query_(bsoncxx::builder::basic::document()), leader_elec_query_force_(bsoncxx::builder::basic::document()), diff --git a/src/plugins/mongodb/mongodb_replicaset_config.h b/src/plugins/mongodb/mongodb_replicaset_config.h index d9925f3f1..80c58ad32 100644 --- a/src/plugins/mongodb/mongodb_replicaset_config.h +++ b/src/plugins/mongodb/mongodb_replicaset_config.h @@ -51,7 +51,9 @@ class MongoDBReplicaSetConfig : public fawkes::Thread, public fawkes::BlackBoardAspect { public: - MongoDBReplicaSetConfig(std::string cfgname, std::string prefix, std::string bootstrap_prefix); + MongoDBReplicaSetConfig(const std::string &cfgname, + const std::string &prefix, + const std::string &bootstrap_prefix); /** Check if configuration is enabled. * @return true if configuration is enabled, false otherwise _______________________________________________ fawkes-commits mailing list fawkes-commits@lists.kbsg.rwth-aachen.de https://lists.kbsg.rwth-aachen.de/listinfo/fawkes-commits