22 #include "mongodb_thread.h"
24 #include "mongodb_client_config.h"
25 #include "mongodb_instance_config.h"
26 #include "mongodb_replicaset_config.h"
28 using namespace mongocxx;
44 mongodb_aspect_inifin_(this)
56 instance_.reset(
new instance());
58 init_instance_configs();
60 init_client_configs();
62 init_replicaset_configs();
64 if (client_configs_.empty() && instance_configs_.empty() && replicaset_configs_.empty()) {
65 throw Exception(
"No enabled MongoDB configurations found");
70 MongoDBThread::init_client_configs()
72 std::set<std::string> ignored_configs;
73 std::string prefix =
"/plugins/mongodb/clients/";
75 std::unique_ptr<Configuration::ValueIterator> i(
config->
search(prefix.c_str()));
77 std::string cfg_name = std::string(i->path()).substr(prefix.length());
78 cfg_name = cfg_name.substr(0, cfg_name.find(
"/"));
80 if ((client_configs_.find(cfg_name) == client_configs_.end())
81 && (ignored_configs.find(cfg_name) == ignored_configs.end())) {
82 std::string cfg_prefix = prefix + cfg_name +
"/";
85 auto conf = std::make_shared<MongoDBClientConfig>(
config,
logger, cfg_name, cfg_prefix);
86 if (conf->is_enabled()) {
87 client_configs_[cfg_name] = conf;
92 "Ignoring disabled MongoDB client "
95 ignored_configs.insert(cfg_name);
99 "Invalid MongoDB client config %s, ignoring, "
100 "exception follows.",
103 ignored_configs.insert(cfg_name);
110 MongoDBThread::init_instance_configs()
112 std::set<std::string> ignored_configs;
113 std::string prefix =
"/plugins/mongodb/instances/";
115 std::unique_ptr<Configuration::ValueIterator> i(
config->
search(prefix.c_str()));
117 std::string cfg_name = std::string(i->path()).substr(prefix.length());
118 cfg_name = cfg_name.substr(0, cfg_name.find(
"/"));
120 if ((instance_configs_.find(cfg_name) == instance_configs_.end())
121 && (ignored_configs.find(cfg_name) == ignored_configs.end())) {
122 std::string cfg_prefix = prefix + cfg_name +
"/";
125 auto conf = std::make_shared<MongoDBInstanceConfig>(
config, cfg_name, cfg_prefix);
126 if (conf->is_enabled()) {
127 instance_configs_[cfg_name] = conf;
128 logger->
log_info(
name(),
"Added MongoDB instance configuration %s", cfg_name.c_str());
131 "Ignoring disabled MongoDB instance "
134 ignored_configs.insert(cfg_name);
138 "Invalid MongoDB instance config %s, ignoring, "
139 "exception follows.",
142 ignored_configs.insert(cfg_name);
147 for (
auto c : instance_configs_) {
155 MongoDBThread::init_replicaset_configs()
157 std::set<std::string> ignored_configs;
158 std::string prefix =
"/plugins/mongodb/replica-sets/managed-sets/";
160 std::string bootstrap_prefix =
"/plugins/mongodb/replica-sets/bootstrap-mongodb/";
161 std::string bootstrap_client_cfg =
config->
get_string(bootstrap_prefix +
"client");
162 std::string bootstrap_database =
config->
get_string(bootstrap_prefix +
"database");
164 std::unique_ptr<Configuration::ValueIterator> i(
config->
search(prefix.c_str()));
166 std::string cfg_name = std::string(i->path()).substr(prefix.length());
167 cfg_name = cfg_name.substr(0, cfg_name.find(
"/"));
169 if ((replicaset_configs_.find(cfg_name) == replicaset_configs_.end())
170 && (ignored_configs.find(cfg_name) == ignored_configs.end())) {
171 std::string cfg_prefix = prefix + cfg_name +
"/";
176 std::make_shared<MongoDBReplicaSetConfig>(cfg_name, cfg_prefix, bootstrap_prefix);
177 replicaset_configs_[cfg_name] = conf;
178 logger->
log_info(
name(),
"Added MongoDB replica set configuration %s", cfg_name.c_str());
181 "Ignoring disabled MongoDB replica set "
184 ignored_configs.insert(cfg_name);
188 "Invalid MongoDB replica set config %s, ignoring, "
189 "exception follows.",
192 ignored_configs.insert(cfg_name);
197 for (
auto c : replicaset_configs_) {
206 for (
auto c : instance_configs_) {
208 "Stopping instance '%s', grace period %u sec",
210 c.second->termination_grace_period());
213 instance_configs_.clear();
215 for (
auto c : replicaset_configs_) {
219 replicaset_configs_.clear();
221 client_configs_.clear();
234 const std::string cname{config_name.empty() ?
"default" : config_name};
236 if (client_configs_.find(cname) != client_configs_.end()) {
237 if (!client_configs_[cname]->is_enabled()) {
238 throw Exception(
"MongoDB config '%s' is not marked enabled", cname.c_str());
240 return client_configs_[cname]->create_client();
242 throw Exception(
"No MongoDB config named '%s' exists", cname.c_str());