22 #include "mongodb_thread.h" 24 #include "mongodb_client_config.h" 25 #include "mongodb_instance_config.h" 26 #include "mongodb_replicaset_config.h" 28 #ifdef HAVE_MONGODB_VERSION_H 29 # include <mongo/client/init.h> 32 using namespace mongo;
48 mongodb_aspect_inifin_(this)
60 #ifdef HAVE_MONGODB_VERSION_H 61 mongo::client::initialize();
64 init_instance_configs();
65 init_client_configs();
66 init_replicaset_configs();
68 if (client_configs_.empty() && instance_configs_.empty() && replicaset_configs_.empty()) {
69 throw Exception(
"No enabled MongoDB configurations found");
74 MongoDBThread::init_client_configs()
76 std::set<std::string> ignored_configs;
77 std::string prefix =
"/plugins/mongodb/clients/";
79 std::unique_ptr<Configuration::ValueIterator> i(
config->
search(prefix.c_str()));
81 std::string cfg_name = std::string(i->path()).substr(prefix.length());
82 cfg_name = cfg_name.substr(0, cfg_name.find(
"/"));
84 if ((client_configs_.find(cfg_name) == client_configs_.end())
85 && (ignored_configs.find(cfg_name) == ignored_configs.end())) {
86 std::string cfg_prefix = prefix + cfg_name +
"/";
89 auto conf = std::make_shared<MongoDBClientConfig>(
config,
logger, cfg_name, cfg_prefix);
90 if (conf->is_enabled()) {
91 client_configs_[cfg_name] = conf;
96 "Ignoring disabled MongoDB client " 99 ignored_configs.insert(cfg_name);
103 "Invalid MongoDB client config %s, ignoring, " 104 "exception follows.",
107 ignored_configs.insert(cfg_name);
114 MongoDBThread::init_instance_configs()
116 std::set<std::string> ignored_configs;
117 std::string prefix =
"/plugins/mongodb/instances/";
119 std::unique_ptr<Configuration::ValueIterator> i(
config->
search(prefix.c_str()));
121 std::string cfg_name = std::string(i->path()).substr(prefix.length());
122 cfg_name = cfg_name.substr(0, cfg_name.find(
"/"));
124 if ((instance_configs_.find(cfg_name) == instance_configs_.end())
125 && (ignored_configs.find(cfg_name) == ignored_configs.end())) {
126 std::string cfg_prefix = prefix + cfg_name +
"/";
129 auto conf = std::make_shared<MongoDBInstanceConfig>(
config, cfg_name, cfg_prefix);
130 if (conf->is_enabled()) {
131 instance_configs_[cfg_name] = conf;
132 logger->
log_info(
name(),
"Added MongoDB instance configuration %s", cfg_name.c_str());
135 "Ignoring disabled MongoDB instance " 138 ignored_configs.insert(cfg_name);
142 "Invalid MongoDB instance config %s, ignoring, " 143 "exception follows.",
146 ignored_configs.insert(cfg_name);
151 for (
auto c : instance_configs_) {
159 MongoDBThread::init_replicaset_configs()
161 std::set<std::string> ignored_configs;
162 std::string prefix =
"/plugins/mongodb/replica-sets/managed-sets/";
164 std::string bootstrap_prefix =
"/plugins/mongodb/replica-sets/bootstrap-mongodb/";
165 std::string bootstrap_client_cfg =
config->
get_string(bootstrap_prefix +
"client");
166 std::string bootstrap_database =
config->
get_string(bootstrap_prefix +
"database");
168 std::unique_ptr<Configuration::ValueIterator> i(
config->
search(prefix.c_str()));
170 std::string cfg_name = std::string(i->path()).substr(prefix.length());
171 cfg_name = cfg_name.substr(0, cfg_name.find(
"/"));
173 if ((replicaset_configs_.find(cfg_name) == replicaset_configs_.end())
174 && (ignored_configs.find(cfg_name) == ignored_configs.end())) {
175 std::string cfg_prefix = prefix + cfg_name +
"/";
178 auto conf = std::make_shared<MongoDBReplicaSetConfig>(
config,
182 if (conf->is_enabled()) {
183 std::shared_ptr<mongo::DBClientBase> bootstrap_client(
185 conf->bootstrap(bootstrap_client);
186 replicaset_configs_[cfg_name] = conf;
187 logger->
log_info(
name(),
"Added MongoDB replica set configuration %s", cfg_name.c_str());
190 "Ignoring disabled MongoDB replica set " 193 ignored_configs.insert(cfg_name);
197 "Invalid MongoDB replica set config %s, ignoring, " 198 "exception follows.",
201 ignored_configs.insert(cfg_name);
206 for (
auto c : replicaset_configs_) {
215 for (
auto c : instance_configs_) {
217 "Stopping instance '%s', grace period %u sec",
219 c.second->termination_grace_period());
222 instance_configs_.clear();
224 for (
auto c : replicaset_configs_) {
228 replicaset_configs_.clear();
230 client_configs_.clear();
232 #ifdef HAVE_MONGODB_VERSION_H 233 mongo::client::shutdown();
242 mongo::DBClientBase *
245 const std::string cname{config_name.empty() ?
"default" : config_name};
247 if (client_configs_.find(cname) != client_configs_.end()) {
248 if (!client_configs_[cname]->is_enabled()) {
249 throw Exception(
"MongoDB config '%s' is not marked enabled", cname.c_str());
251 return client_configs_[cname]->create_client();
253 throw Exception(
"No MongoDB config named '%s' exists", cname.c_str());
virtual void log_info(const char *component, const char *format,...)=0
Log informational message.
virtual void remove(ThreadList &tl)=0
Remove multiple threads.
Fawkes library namespace.
virtual void finalize()
Finalize the thread.
virtual ValueIterator * search(const char *path)=0
Iterator with search results.
Thread class encapsulation of pthreads.
Logger * logger
This is the Logger member used to access the logger.
virtual ~MongoDBThread()
Destructor.
ThreadCollector * thread_collector
Thread collector.
virtual void loop()
Code to execute in the thread.
Base class for exceptions in Fawkes.
const char * name() const
Get name of thread.
virtual void log_warn(const char *component, const char *format,...)=0
Log warning message.
virtual void add(ThreadList &tl)=0
Add multiple threads.
Thread aspect provide a new aspect.
virtual mongo::DBClientBase * create_client(const std::string &config_name="")
Create a new MongoDB client.
MongoDBThread()
Constructor.
virtual void delete_client(mongo::DBClientBase *client)
Delete a client.
Configuration * config
This is the Configuration member used to access the configuration.
virtual void init()
Initialize the thread.
virtual std::string get_string(const char *path)=0
Get value from configuration which is of type string.