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

Reply via email to