]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#1621] add lazy retrieval for connection IOService
authorRazvan Becheriu <razvan@isc.org>
Wed, 17 Mar 2021 14:28:01 +0000 (16:28 +0200)
committerRazvan Becheriu <razvan@isc.org>
Mon, 29 Mar 2021 18:10:52 +0000 (21:10 +0300)
src/hooks/dhcp/mysql_cb/mysql_cb_impl.cc
src/lib/database/database_connection.h
src/lib/dhcpsrv/mysql_lease_mgr.cc
src/lib/dhcpsrv/mysql_lease_mgr.h
src/lib/dhcpsrv/pgsql_lease_mgr.cc
src/lib/dhcpsrv/pgsql_lease_mgr.h
src/lib/mysql/mysql_connection.h
src/lib/pgsql/pgsql_connection.h

index f9bc162720aab8e36e47bf16565fe30a5d12c77f..6b1acb9b14d3166fe828e6e0f1af3fee2cf63705 100644 (file)
@@ -47,8 +47,10 @@ ScopedAuditRevision::~ScopedAuditRevision() {
 MySqlConfigBackendImpl::
 MySqlConfigBackendImpl(const DatabaseConnection::ParameterMap& parameters,
                        const DbCallback db_reconnect_callback)
-    : conn_(parameters, MySqlConfigBackendImpl::getIOService(), db_reconnect_callback),
-      timer_name_(""), audit_revision_created_(false), parameters_(parameters) {
+    : conn_(parameters,
+            IOServiceAccessCallbackPtr(new IOServiceAccessCallback(MySqlConfigBackendImpl::getIOService)),
+            db_reconnect_callback), timer_name_(""),
+      audit_revision_created_(false), parameters_(parameters) {
     // Test schema version first.
     std::pair<uint32_t, uint32_t> code_version(MYSQL_SCHEMA_VERSION_MAJOR,
                                                MYSQL_SCHEMA_VERSION_MINOR);
index 6ddefb297285959df230878cfde63e0560a1445e..1dd6eb7c4f9b25a52bfb71a5028630cf89962998 100644 (file)
@@ -7,6 +7,7 @@
 #ifndef DATABASE_CONNECTION_H
 #define DATABASE_CONNECTION_H
 
+#include <asiolink/io_service.h>
 #include <cc/data.h>
 #include <boost/noncopyable.hpp>
 #include <boost/shared_ptr.hpp>
@@ -160,6 +161,13 @@ typedef boost::shared_ptr<ReconnectCtl> ReconnectCtlPtr;
 /// @brief Defines a callback prototype for propagating events upward
 typedef std::function<bool (ReconnectCtlPtr db_reconnect_ctl)> DbCallback;
 
+/// @brief Callback which returns the IOService that can be used to recover the
+/// connection.
+typedef std::function<isc::asiolink::IOServicePtr ()> IOServiceAccessCallback;
+
+/// @brief Pointer to an instance of IOServiceAccessCallbackPtr
+typedef boost::shared_ptr<IOServiceAccessCallback> IOServiceAccessCallbackPtr;
+
 /// @brief Common database connection class.
 ///
 /// This class provides functions that are common for establishing
index 4e8e78ea0eb5a6ece99283c030495c3696812b4e..f1065c0797f7a83db49a411f687cb8ccb5ea1a8f 100644 (file)
@@ -1737,9 +1737,9 @@ bool MySqlLeaseStatsQuery::negative_count_ = false;
 // MySqlLeaseContext Constructor
 
 MySqlLeaseContext::MySqlLeaseContext(const DatabaseConnection::ParameterMap& parameters,
-                                     const isc::asiolink::IOServicePtr& io_service,
+                                     IOServiceAccessCallbackPtr io_service_access_callback,
                                      DbCallback db_reconnect_callback)
-    : conn_(parameters, io_service, db_reconnect_callback) {
+    : conn_(parameters, io_service_access_callback, db_reconnect_callback) {
 }
 
 // MySqlLeaseContextAlloc Constructor and Destructor
@@ -1882,8 +1882,8 @@ MySqlLeaseMgr::dbReconnect(ReconnectCtlPtr db_reconnect_ctl) {
 MySqlLeaseContextPtr
 MySqlLeaseMgr::createContext() const {
     MySqlLeaseContextPtr ctx(new MySqlLeaseContext(parameters_,
-                                                   LeaseMgr::getIOService(),
-                                                   &MySqlLeaseMgr::dbReconnect));
+        IOServiceAccessCallbackPtr(new IOServiceAccessCallback(&LeaseMgr::getIOService)),
+        &MySqlLeaseMgr::dbReconnect));
 
     // Open the database.
     ctx->conn_.openDatabase();
index 99709c107d0d58f38a9406dacd737285c15d6416..6b428e45609bf4fc24a6d10e623ba48e9e5852d6 100644 (file)
@@ -44,10 +44,10 @@ public:
     /// @brief Constructor
     ///
     /// @param parameters See MySqlLeaseMgr constructor.
-    /// @param io_service The IOService object, used for all ASIO operations.
+    /// @param io_service_access_callback The IOService access callback.
     /// @param db_reconnect_callback The connection recovery callback.
     MySqlLeaseContext(const db::DatabaseConnection::ParameterMap& parameters,
-                      const isc::asiolink::IOServicePtr& io_service,
+                      db::IOServiceAccessCallbackPtr io_service_access_callback,
                       db::DbCallback db_reconnect_callback);
 
     /// The exchange objects are used for transfer of data to/from the database.
index 4572d7eb3925da8e9fabaca65a1ca7facfe7241e..da39f2d973182ae52ddeda8734456b234c227475 100644 (file)
@@ -1171,9 +1171,9 @@ bool PgSqlLeaseStatsQuery::negative_count_ = false;
 // PgSqlLeaseContext Constructor
 
 PgSqlLeaseContext::PgSqlLeaseContext(const DatabaseConnection::ParameterMap& parameters,
-                                     const isc::asiolink::IOServicePtr& io_service,
+                                     IOServiceAccessCallbackPtr io_service_access_callback,
                                      DbCallback db_reconnect_callback)
-    : conn_(parameters, io_service, db_reconnect_callback) {
+    : conn_(parameters, io_service_access_callback, db_reconnect_callback) {
 }
 
 // PgSqlLeaseContextAlloc Constructor and Destructor
@@ -1316,8 +1316,8 @@ PgSqlLeaseMgr::dbReconnect(ReconnectCtlPtr db_reconnect_ctl) {
 PgSqlLeaseContextPtr
 PgSqlLeaseMgr::createContext() const {
     PgSqlLeaseContextPtr ctx(new PgSqlLeaseContext(parameters_,
-                                                   LeaseMgr::getIOService(),
-                                                   &PgSqlLeaseMgr::dbReconnect));
+        IOServiceAccessCallbackPtr(new IOServiceAccessCallback(&LeaseMgr::getIOService)),
+        &PgSqlLeaseMgr::dbReconnect));
 
     // Open the database.
     ctx->conn_.openDatabase();
index ad2057e34cd14b5cafb994b312933f64c8f37eb5..f4200589540ed12f89179328db949e2276c0ecd3 100644 (file)
@@ -43,10 +43,10 @@ public:
     /// @brief Constructor
     ///
     /// @param parameters See PgSqlLeaseMgr constructor.
-    /// @param io_service The IOService object, used for all ASIO operations.
+    /// @param io_service_access_callback The IOService access callback.
     /// @param db_reconnect_callback The connection recovery callback.
     PgSqlLeaseContext(const db::DatabaseConnection::ParameterMap& parameters,
-                      const isc::asiolink::IOServicePtr& io_service,
+                      db::IOServiceAccessCallbackPtr io_service_access_callback,
                       db::DbCallback db_reconnect_callback);
 
     /// The exchange objects are used for transfer of data to/from the database.
index 6ac377b0b9e7e70a201d18de7e23ab51f0224f02..8700289818e79441733fa7ddbf1de72e078cb530 100644 (file)
@@ -241,13 +241,14 @@ public:
     /// Initialize MySqlConnection object with parameters needed for connection.
     ///
     /// @param parameters Specify the connection details.
-    /// @param io_service The IOService object, used for all ASIO operations.
+    /// @param io_access_callback The IOService access callback.
     /// @param callback The connection recovery callback.
     MySqlConnection(const ParameterMap& parameters,
-                    const isc::asiolink::IOServicePtr& io_service = isc::asiolink::IOServicePtr(),
+                    IOServiceAccessCallbackPtr io_access_callback = IOServiceAccessCallbackPtr(),
                     DbCallback callback = DbCallback())
-        : DatabaseConnection(parameters), io_service_(io_service),
-          callback_(callback) {
+        : DatabaseConnection(parameters),
+          io_service_access_callback_(io_access_callback),
+          io_service_(), callback_(callback) {
     }
 
     /// @brief Destructor
@@ -657,6 +658,9 @@ public:
     ///
     /// @note The recover function must be run on the IO Service thread.
     void startRecoverDbConnection() {
+        if (!io_service_ && io_service_access_callback_) {
+            io_service_ = (*io_service_access_callback_)();
+        }
         if (callback_ && io_service_) {
             io_service_->post(std::bind(callback_, reconnectCtl()));
         }
@@ -680,6 +684,10 @@ public:
     /// and will be from MySqlHostDataSource.
     MySqlHolder mysql_;
 
+    /// @brief Callback which returns the IOService that can be used to recover
+    /// the connection.
+    IOServiceAccessCallbackPtr io_service_access_callback_;
+
     /// @brief IOService object, used for all ASIO operations.
     isc::asiolink::IOServicePtr io_service_;
 
index 84f6562bcf8a985684adcf8bb283d9b2568fe604..da69a7a99bdedf618b5c3bfa83777c9af38798af 100644 (file)
@@ -307,13 +307,14 @@ public:
     /// Initialize PgSqlConnection object with parameters needed for connection.
     ///
     /// @param parameters Specify the connection details.
-    /// @param io_service The IOService object, used for all ASIO operations.
+    /// @param io_access_callback The IOService access callback.
     /// @param callback The connection recovery callback.
     PgSqlConnection(const ParameterMap& parameters,
-                    const isc::asiolink::IOServicePtr& io_service = isc::asiolink::IOServicePtr(),
+                    IOServiceAccessCallbackPtr io_access_callback = IOServiceAccessCallbackPtr(),
                     DbCallback callback = DbCallback())
-        : DatabaseConnection(parameters), io_service_(io_service),
-          callback_(callback) {
+        : DatabaseConnection(parameters),
+          io_service_access_callback_(io_access_callback),
+          io_service_(), callback_(callback) {
     }
 
     /// @brief Destructor
@@ -425,6 +426,9 @@ public:
     ///
     /// @note The recover function must be run on the IO Service thread.
     void startRecoverDbConnection() {
+        if (!io_service_ && io_service_access_callback_) {
+            io_service_ = (*io_service_access_callback_)();
+        }
         if (callback_ && io_service_) {
             io_service_->post(std::bind(callback_, reconnectCtl()));
         }
@@ -451,6 +455,10 @@ public:
         return (conn_);
     }
 
+    /// @brief Callback which returns the IOService that can be used to recover
+    /// the connection.
+    IOServiceAccessCallbackPtr io_service_access_callback_;
+
     /// @brief IOService object, used for all ASIO operations.
     isc::asiolink::IOServicePtr io_service_;