From: Razvan Becheriu Date: Thu, 13 Mar 2025 11:53:32 +0000 (+0200) Subject: [#3710] fixed db reconnect X-Git-Tag: Kea-2.7.7~49 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d14de440cd8197894cf2ef55c4709600dd99b26e;p=thirdparty%2Fkea.git [#3710] fixed db reconnect --- diff --git a/src/hooks/dhcp/forensic_log/rotating_file.cc b/src/hooks/dhcp/forensic_log/rotating_file.cc index d50a7dbdc4..4f48d16138 100644 --- a/src/hooks/dhcp/forensic_log/rotating_file.cc +++ b/src/hooks/dhcp/forensic_log/rotating_file.cc @@ -271,7 +271,7 @@ RotatingFile::useExistingFiles(struct tm& time_info) { } void -RotatingFile::open() { +RotatingFile::open(ManagerID) { if (isOpen() || MultiThreadingMgr::instance().isTestMode()) { return; } diff --git a/src/hooks/dhcp/forensic_log/rotating_file.h b/src/hooks/dhcp/forensic_log/rotating_file.h index 7dc942c943..00d121dd88 100644 --- a/src/hooks/dhcp/forensic_log/rotating_file.h +++ b/src/hooks/dhcp/forensic_log/rotating_file.h @@ -135,8 +135,10 @@ public: /// it is created. If the file is already open, the method simply /// returns. /// + /// @param id the forensic backend manager ID. + /// /// @throw LegalLogMgrError if the file cannot be opened. - virtual void open(); + virtual void open(isc::dhcp::ManagerID id = 0); /// @brief Closes the underlying file. /// diff --git a/src/hooks/dhcp/mysql/mysql_legal_log.cc b/src/hooks/dhcp/mysql/mysql_legal_log.cc index ff6f3a3df1..2ec9ce5b75 100644 --- a/src/hooks/dhcp/mysql/mysql_legal_log.cc +++ b/src/hooks/dhcp/mysql/mysql_legal_log.cc @@ -280,15 +280,15 @@ MySqlStore::MySqlStore(const DatabaseConnection::ParameterMap& parameters) timer_name_ += "]DbReconnectTimer"; } -void MySqlStore::open() { +void MySqlStore::open(ManagerID id) { LegalLogDbLogger pushed(mysql_legal_log_db_logger); // Test schema version first. std::pair code_version(MYSQL_SCHEMA_VERSION_MAJOR, MYSQL_SCHEMA_VERSION_MINOR); - LegalLogMgrPtr store = LegalLogMgrFactory::instance(); - LegalLogMgrFactory::instance().reset(); + LegalLogMgrPtr store = LegalLogMgrFactory::instance(id); + LegalLogMgrFactory::instance(id).reset(); string timer_name; bool retry = false; @@ -310,7 +310,7 @@ void MySqlStore::open() { << db_version.second); } - LegalLogMgrFactory::instance() = store; + LegalLogMgrFactory::instance(id) = store; // Create an initial context. pool_.reset(new MySqlStoreContextPool()); diff --git a/src/hooks/dhcp/mysql/mysql_legal_log.h b/src/hooks/dhcp/mysql/mysql_legal_log.h index d5be34e27a..f038b24d7f 100644 --- a/src/hooks/dhcp/mysql/mysql_legal_log.h +++ b/src/hooks/dhcp/mysql/mysql_legal_log.h @@ -136,10 +136,12 @@ public: /// /// Finally, all the SQL commands are pre-compiled. /// + /// @param id the forensic backend manager ID. + /// /// @throw isc::db::DbOpenError Error opening the database /// @throw isc::db::DbOperationError An operation on the open /// database has failed. - virtual void open(); + virtual void open(ManagerID id = 0); /// @brief Closes the store. virtual void close(); diff --git a/src/hooks/dhcp/pgsql/pgsql_legal_log.cc b/src/hooks/dhcp/pgsql/pgsql_legal_log.cc index 4fac2bce7b..f952ad7a9e 100644 --- a/src/hooks/dhcp/pgsql/pgsql_legal_log.cc +++ b/src/hooks/dhcp/pgsql/pgsql_legal_log.cc @@ -177,7 +177,7 @@ PgSqlStore::PgSqlStore(const DatabaseConnection::ParameterMap& parameters) timer_name_ += "]DbReconnectTimer"; } -void PgSqlStore::open() { +void PgSqlStore::open(ManagerID id) { LegalLogDbLogger pushed(pgsql_legal_log_db_logger); // Check TLS support. @@ -207,8 +207,8 @@ void PgSqlStore::open() { pair code_version(PGSQL_SCHEMA_VERSION_MAJOR, PGSQL_SCHEMA_VERSION_MINOR); - LegalLogMgrPtr store = LegalLogMgrFactory::instance(); - LegalLogMgrFactory::instance().reset(); + LegalLogMgrPtr store = LegalLogMgrFactory::instance(id); + LegalLogMgrFactory::instance(id).reset(); string timer_name; bool retry = false; @@ -230,7 +230,7 @@ void PgSqlStore::open() { << db_version.second); } - LegalLogMgrFactory::instance() = store; + LegalLogMgrFactory::instance(id) = store; // Create an initial context. pool_.reset(new PgSqlStoreContextPool()); diff --git a/src/hooks/dhcp/pgsql/pgsql_legal_log.h b/src/hooks/dhcp/pgsql/pgsql_legal_log.h index 8742663d7e..8805176663 100644 --- a/src/hooks/dhcp/pgsql/pgsql_legal_log.h +++ b/src/hooks/dhcp/pgsql/pgsql_legal_log.h @@ -131,10 +131,12 @@ public: /// /// Finally, all the SQL commands are pre-compiled. /// + /// @param id the forensic backend manager ID. + /// /// @throw isc::db::DbOpenError Error opening the database /// @throw isc::db::DbOperationError An operation on the open /// database has failed. - virtual void open(); + virtual void open(ManagerID id = 0); /// @brief Closes the store. virtual void close(); diff --git a/src/lib/dhcpsrv/legal_log_mgr.h b/src/lib/dhcpsrv/legal_log_mgr.h index 6abeb3fe64..c1a5a46bb6 100644 --- a/src/lib/dhcpsrv/legal_log_mgr.h +++ b/src/lib/dhcpsrv/legal_log_mgr.h @@ -35,6 +35,9 @@ class LegalLogMgr; /// @brief Defines a smart pointer to a LegalLogMgr. typedef boost::shared_ptr LegalLogMgrPtr; +/// @brief Manger ID used by hook libraries to retrieve respective LegalLogMgr instance. +typedef uint64_t ManagerID; + /// @brief LegalLogMgr abstract class class LegalLogMgr { public: @@ -84,7 +87,9 @@ public: static void parseExtraParameters(const isc::data::ConstElementPtr& parameters, isc::db::DatabaseConnection::ParameterMap& map); /// @brief Opens the store. - virtual void open() = 0; + /// + /// @param id the forensic backend manager ID. + virtual void open(ManagerID id = 0) = 0; /// @brief Closes the store. virtual void close() = 0; @@ -267,9 +272,6 @@ private: isc::db::DatabaseConnection::ParameterMap parameters_; }; -/// @brief Manger ID used by hook libraries to retrieve respective LegalLogMgr instance. -typedef uint64_t ManagerID; - /// @brief LegalLogMgr pool typedef std::map> LegalLogMgrPool; diff --git a/src/lib/dhcpsrv/legal_log_mgr_factory.cc b/src/lib/dhcpsrv/legal_log_mgr_factory.cc index f4f5811795..2590aa7ba1 100644 --- a/src/lib/dhcpsrv/legal_log_mgr_factory.cc +++ b/src/lib/dhcpsrv/legal_log_mgr_factory.cc @@ -101,7 +101,10 @@ LegalLogMgrFactory::addBackend(DatabaseConnection::ParameterMap& parameters, Man " factory returned NULL"); } - backend->open(); + // Add the parameters and an empty instance in case retry on startup is configured. + pool_[id] = pair(parameters, LegalLogMgrPtr()); + + backend->open(id); // Apply extra parameters. if (parameters.find("request-parser-format") != parameters.end()) { diff --git a/src/lib/dhcpsrv/tests/legal_log_mgr_factory_unittest.cc b/src/lib/dhcpsrv/tests/legal_log_mgr_factory_unittest.cc index dfa7bab397..970c672047 100644 --- a/src/lib/dhcpsrv/tests/legal_log_mgr_factory_unittest.cc +++ b/src/lib/dhcpsrv/tests/legal_log_mgr_factory_unittest.cc @@ -38,7 +38,7 @@ public: } /// @brief Opens the store. - virtual void open() { + virtual void open(ManagerID) { } /// @brief Closes the store.