Commit 8f5ce706 authored by Thomas Markwalder's avatar Thomas Markwalder
Browse files

[5477] Addressed review comments

src/bin/dhcp4/ctrl_dhcp4_srv.*
src/bin/dhcp6/ctrl_dhcp6_srv.*
    Changed dbReconnect() to accept ReconnectCtlPtr
    Added commentary for dbReconnect and dbLostCallback

src/lib/dhcpsrv/database_connection.h
    Removed extraneous typedef

many files:
    Changed DatabaseConnection::Callback to ::DbLostCallback

src/lib/dhcpsrv/tests/database_connection_unittest.cc
    Added commentary to text fixture and tests
parent 8e55883c
...@@ -650,8 +650,7 @@ ControlledDhcpv4Srv::checkConfig(isc::data::ConstElementPtr config) { ...@@ -650,8 +650,7 @@ ControlledDhcpv4Srv::checkConfig(isc::data::ConstElementPtr config) {
} }
ControlledDhcpv4Srv::ControlledDhcpv4Srv(uint16_t port /*= DHCP4_SERVER_PORT*/) ControlledDhcpv4Srv::ControlledDhcpv4Srv(uint16_t port /*= DHCP4_SERVER_PORT*/)
: Dhcpv4Srv(port), io_service_(), timer_mgr_(TimerMgr::instance()), : Dhcpv4Srv(port), io_service_(), timer_mgr_(TimerMgr::instance()) {
db_reconnect_ctl_(NULL) {
if (getInstance()) { if (getInstance()) {
isc_throw(InvalidOperation, isc_throw(InvalidOperation,
"There is another Dhcpv4Srv instance already."); "There is another Dhcpv4Srv instance already.");
...@@ -795,7 +794,7 @@ ControlledDhcpv4Srv::deleteExpiredReclaimedLeases(const uint32_t secs) { ...@@ -795,7 +794,7 @@ ControlledDhcpv4Srv::deleteExpiredReclaimedLeases(const uint32_t secs) {
} }
void void
ControlledDhcpv4Srv::dbReconnect() { ControlledDhcpv4Srv::dbReconnect(ReconnectCtlPtr db_reconnect_ctl) {
bool reopened = false; bool reopened = false;
// Re-open lease and host database with new parameters. // Re-open lease and host database with new parameters.
...@@ -817,24 +816,25 @@ ControlledDhcpv4Srv::dbReconnect() { ...@@ -817,24 +816,25 @@ ControlledDhcpv4Srv::dbReconnect() {
network_state_.enableService(); network_state_.enableService();
// Toss the reconnect control, we're done with it // Toss the reconnect control, we're done with it
db_reconnect_ctl_.reset(); db_reconnect_ctl.reset();
} else { } else {
if (!db_reconnect_ctl_->checkRetries()) { if (!db_reconnect_ctl->checkRetries()) {
LOG_ERROR(dhcp4_logger, DHCP4_DB_RECONNECT_RETRIES_EXHAUSTED) LOG_ERROR(dhcp4_logger, DHCP4_DB_RECONNECT_RETRIES_EXHAUSTED)
.arg(db_reconnect_ctl_->maxRetries()); .arg(db_reconnect_ctl->maxRetries());
shutdown(); shutdown();
return; return;
} }
LOG_INFO(dhcp4_logger, DHCP4_DB_RECONNECT_ATTEMPT_SCHEDULE) LOG_INFO(dhcp4_logger, DHCP4_DB_RECONNECT_ATTEMPT_SCHEDULE)
.arg(db_reconnect_ctl_->maxRetries() - db_reconnect_ctl_->retriesLeft() + 1) .arg(db_reconnect_ctl->maxRetries() - db_reconnect_ctl->retriesLeft() + 1)
.arg(db_reconnect_ctl_->maxRetries()) .arg(db_reconnect_ctl->maxRetries())
.arg(db_reconnect_ctl_->retryInterval()); .arg(db_reconnect_ctl->retryInterval());
if (!TimerMgr::instance()->isTimerRegistered("Dhcp4DbReconnectTimer")) { if (!TimerMgr::instance()->isTimerRegistered("Dhcp4DbReconnectTimer")) {
TimerMgr::instance()->registerTimer("Dhcp4DbReconnectTimer", TimerMgr::instance()->registerTimer("Dhcp4DbReconnectTimer",
boost::bind(&ControlledDhcpv4Srv::dbReconnect, this), boost::bind(&ControlledDhcpv4Srv::dbReconnect, this,
db_reconnect_ctl_->retryInterval() * 1000, db_reconnect_ctl),
db_reconnect_ctl->retryInterval() * 1000,
asiolink::IntervalTimer::ONE_SHOT); asiolink::IntervalTimer::ONE_SHOT);
} }
...@@ -862,11 +862,8 @@ ControlledDhcpv4Srv::dbLostCallback(ReconnectCtlPtr db_reconnect_ctl) { ...@@ -862,11 +862,8 @@ ControlledDhcpv4Srv::dbLostCallback(ReconnectCtlPtr db_reconnect_ctl) {
return(false); return(false);
} }
// Save the reconnect control
db_reconnect_ctl_ = db_reconnect_ctl;
// Invoke reconnect method // Invoke reconnect method
dbReconnect(); dbReconnect(db_reconnect_ctl);
return(true); return(true);
} }
......
...@@ -319,9 +319,43 @@ private: ...@@ -319,9 +319,43 @@ private:
void deleteExpiredReclaimedLeases(const uint32_t secs); void deleteExpiredReclaimedLeases(const uint32_t secs);
/// @brief Attempts to reconnect the server to the DB backend managers /// @brief Attempts to reconnect the server to the DB backend managers
void dbReconnect(); ///
/// This is a self-rescheduling function that attempts to reconnect to the
/// server's DB backends after connectivity to one or more have been
/// lost. Upon entry it will attempt to reconnect via @ref CfgDdbAccess::
/// createManagers. If this is succesful, DHCP servicing is re-enabled and
/// server returns to normal operation.
///
/// If reconnection fails and the maximum number of retries has not been
/// exhausted, it will schedule a call to itself to occur at the
/// configured retry interval. DHCP service remains disabled.
///
/// If the maximum number of retries has been exhausted an error is logged
/// and the server shuts down.
///
/// @param db_reconnect_ctl pointer to the ReconnectCtl containing the
/// configured reconnect parameters
///
void dbReconnect(ReconnectCtlPtr db_reconnect_ctl);
/// @brief Callback DB backends should invoke upon loss of connectivity /// @brief Callback DB backends should invoke upon loss of connectivity
///
/// This function is invoked by DB backends when they detect a loss of
/// connectivity. The parameter, db_reconnect_ctl, conveys the configured
/// maximum number of reconnect retries as well as the interval to wait
/// between retry attempts.
///
/// If either value is zero, reconnect is presumed to be disabled and
/// the function will returns false. This instructs the DB backend
/// layer (the caller) to treat the connectivity loss as fatal.
///
/// Otherwise, the function saves db_reconnect_ctl and invokes
/// dbReconnect to initiate the reconnect process.
///
/// @param db_reconnect_ctl pointer to the ReconnectCtl containing the
/// configured reconnect parameters
///
/// @return false if reconnect is not configured, true otherwise
bool dbLostCallback(ReconnectCtlPtr db_reconnect_ctl); bool dbLostCallback(ReconnectCtlPtr db_reconnect_ctl);
/// @brief Static pointer to the sole instance of the DHCP server. /// @brief Static pointer to the sole instance of the DHCP server.
...@@ -338,9 +372,6 @@ private: ...@@ -338,9 +372,6 @@ private:
/// Shared pointer to the instance of timer @c TimerMgr is held here to /// Shared pointer to the instance of timer @c TimerMgr is held here to
/// make sure that the @c TimerMgr outlives instance of this class. /// make sure that the @c TimerMgr outlives instance of this class.
TimerMgrPtr timer_mgr_; TimerMgrPtr timer_mgr_;
/// @brief Pointer the current DB reconnect control values
ReconnectCtlPtr db_reconnect_ctl_;
}; };
}; // namespace isc::dhcp }; // namespace isc::dhcp
......
...@@ -673,8 +673,7 @@ ControlledDhcpv6Srv::checkConfig(isc::data::ConstElementPtr config) { ...@@ -673,8 +673,7 @@ ControlledDhcpv6Srv::checkConfig(isc::data::ConstElementPtr config) {
} }
ControlledDhcpv6Srv::ControlledDhcpv6Srv(uint16_t port) ControlledDhcpv6Srv::ControlledDhcpv6Srv(uint16_t port)
: Dhcpv6Srv(port), io_service_(), timer_mgr_(TimerMgr::instance()), : Dhcpv6Srv(port), io_service_(), timer_mgr_(TimerMgr::instance()) {
db_reconnect_ctl_(NULL) {
if (server_) { if (server_) {
isc_throw(InvalidOperation, isc_throw(InvalidOperation,
"There is another Dhcpv6Srv instance already."); "There is another Dhcpv6Srv instance already.");
...@@ -817,7 +816,7 @@ ControlledDhcpv6Srv::deleteExpiredReclaimedLeases(const uint32_t secs) { ...@@ -817,7 +816,7 @@ ControlledDhcpv6Srv::deleteExpiredReclaimedLeases(const uint32_t secs) {
} }
void void
ControlledDhcpv6Srv::dbReconnect() { ControlledDhcpv6Srv::dbReconnect(ReconnectCtlPtr db_reconnect_ctl) {
bool reopened = false; bool reopened = false;
// Re-open lease and host database with new parameters. // Re-open lease and host database with new parameters.
...@@ -838,24 +837,25 @@ ControlledDhcpv6Srv::dbReconnect() { ...@@ -838,24 +837,25 @@ ControlledDhcpv6Srv::dbReconnect() {
network_state_.enableService(); network_state_.enableService();
// Toss the reconnct control, we're done with it // Toss the reconnct control, we're done with it
db_reconnect_ctl_.reset(); db_reconnect_ctl.reset();
} else { } else {
if (!db_reconnect_ctl_->checkRetries()) { if (!db_reconnect_ctl->checkRetries()) {
LOG_ERROR(dhcp6_logger, DHCP6_DB_RECONNECT_RETRIES_EXHAUSTED) LOG_ERROR(dhcp6_logger, DHCP6_DB_RECONNECT_RETRIES_EXHAUSTED)
.arg(db_reconnect_ctl_->maxRetries()); .arg(db_reconnect_ctl->maxRetries());
shutdown(); shutdown();
return; return;
} }
LOG_INFO(dhcp6_logger, DHCP6_DB_RECONNECT_ATTEMPT_SCHEDULE) LOG_INFO(dhcp6_logger, DHCP6_DB_RECONNECT_ATTEMPT_SCHEDULE)
.arg(db_reconnect_ctl_->maxRetries() - db_reconnect_ctl_->retriesLeft() + 1) .arg(db_reconnect_ctl->maxRetries() - db_reconnect_ctl->retriesLeft() + 1)
.arg(db_reconnect_ctl_->maxRetries()) .arg(db_reconnect_ctl->maxRetries())
.arg(db_reconnect_ctl_->retryInterval()); .arg(db_reconnect_ctl->retryInterval());
if (!TimerMgr::instance()->isTimerRegistered("Dhcp6DbReconnectTimer")) { if (!TimerMgr::instance()->isTimerRegistered("Dhcp6DbReconnectTimer")) {
TimerMgr::instance()->registerTimer("Dhcp6DbReconnectTimer", TimerMgr::instance()->registerTimer("Dhcp6DbReconnectTimer",
boost::bind(&ControlledDhcpv6Srv::dbReconnect, this), boost::bind(&ControlledDhcpv6Srv::dbReconnect, this,
db_reconnect_ctl_->retryInterval() * 1000, db_reconnect_ctl),
db_reconnect_ctl->retryInterval() * 1000,
asiolink::IntervalTimer::ONE_SHOT); asiolink::IntervalTimer::ONE_SHOT);
} }
...@@ -883,11 +883,8 @@ ControlledDhcpv6Srv::dbLostCallback(ReconnectCtlPtr db_reconnect_ctl) { ...@@ -883,11 +883,8 @@ ControlledDhcpv6Srv::dbLostCallback(ReconnectCtlPtr db_reconnect_ctl) {
return(false); return(false);
} }
// Save the reconnect control
db_reconnect_ctl_ = db_reconnect_ctl;
// Invoke reconnect method // Invoke reconnect method
dbReconnect(); dbReconnect(db_reconnect_ctl);
return(true); return(true);
} }
......
...@@ -319,9 +319,40 @@ private: ...@@ -319,9 +319,40 @@ private:
void deleteExpiredReclaimedLeases(const uint32_t secs); void deleteExpiredReclaimedLeases(const uint32_t secs);
/// @brief Attempts to reconnect the server to the DB backend managers /// @brief Attempts to reconnect the server to the DB backend managers
void dbReconnect(); ///
/// This is a self-rescheduling function that attempts to reconnect to the
/// server's DB backends after connectivity to one or more have been
/// lost. Upon entry it will attempt to reconnect via @ref CfgDdbAccess::
/// createManagers. If this is succesful, DHCP servicing is re-enabled and
/// server returns to normal operation.
///
/// If reconnection fails and the maximum number of retries has not been
/// exhausted, it will schedule a call to itself to occur at the
/// configured retry interval. DHCP service remains disabled.
///
/// If the maximum number of retries has been exhausted an error is logged
/// and the server shuts down.
/// @param db_reconnect_ctl pointer to the ReconnectCtl containing the
/// configured reconnect parameters
///
void dbReconnect(ReconnectCtlPtr db_reconnect_ctl);
/// @brief Callback DB backends should invoke upon loss of connectivity /// @brief Callback DB backends should invoke upon loss of connectivity
///
/// This function is invoked by DB backends when they detect a loss of
/// connectivity. The parameter, db_reconnect_ctl, conveys the configured
/// maximum number of reconnect retries as well as the interval to wait
/// between retry attempts.
///
/// If either value is zero, reconnect is presumed to be disabled and
/// the function will returns false. This instructs the DB backend
/// layer (the caller) to treat the connectivity loss as fatal.
///
/// Otherwise, the function saves db_reconnect_ctl and invokes
/// dbReconnect to initiate the reconnect process.
///
/// @param db_reconnect_ctl pointer to the ReconnectCtl containing the
/// configured reconnect parameters
bool dbLostCallback(ReconnectCtlPtr db_reconnect_ctl); bool dbLostCallback(ReconnectCtlPtr db_reconnect_ctl);
/// @brief Static pointer to the sole instance of the DHCP server. /// @brief Static pointer to the sole instance of the DHCP server.
...@@ -338,9 +369,6 @@ private: ...@@ -338,9 +369,6 @@ private:
/// Shared pointer to the instance of timer @c TimerMgr is held here to /// Shared pointer to the instance of timer @c TimerMgr is held here to
/// make sure that the @c TimerMgr outlives instance of this class. /// make sure that the @c TimerMgr outlives instance of this class.
TimerMgrPtr timer_mgr_; TimerMgrPtr timer_mgr_;
/// @brief Pointer the current DB reconnect control values
ReconnectCtlPtr db_reconnect_ctl_;
}; };
}; // namespace isc::dhcp }; // namespace isc::dhcp
......
...@@ -38,7 +38,7 @@ CfgDbAccess::getHostDbAccessString() const { ...@@ -38,7 +38,7 @@ CfgDbAccess::getHostDbAccessString() const {
void void
CfgDbAccess::createManagers(DatabaseConnection::Callback db_lost_callback) const { CfgDbAccess::createManagers(DatabaseConnection::DbLostCallback db_lost_callback) const {
// Recreate lease manager. // Recreate lease manager.
LeaseMgrFactory::destroy(); LeaseMgrFactory::destroy();
LeaseMgrFactory::create(getLeaseDbAccessString(), db_lost_callback); LeaseMgrFactory::create(getLeaseDbAccessString(), db_lost_callback);
......
...@@ -68,7 +68,7 @@ public: ...@@ -68,7 +68,7 @@ public:
/// @param db_lost_callback function to invoke if connectivity to /// @param db_lost_callback function to invoke if connectivity to
/// either the lease or host managers, once established, is subsequently /// either the lease or host managers, once established, is subsequently
/// lost. /// lost.
void createManagers(DatabaseConnection::Callback db_lost_callback = NULL) const; void createManagers(DatabaseConnection::DbLostCallback db_lost_callback = NULL) const;
/// @brief Unparse an access string /// @brief Unparse an access string
/// ///
......
...@@ -141,8 +141,7 @@ public: ...@@ -141,8 +141,7 @@ public:
typedef std::map<std::string, std::string> ParameterMap; typedef std::map<std::string, std::string> ParameterMap;
/// @brief Defines a callback prototype for propogating events upward /// @brief Defines a callback prototype for propogating events upward
/// typedef boost::function<bool (const ParameterMap& parameters)> Callback; typedef boost::function<bool (ReconnectCtlPtr db_retry)> DbLostCallback;
typedef boost::function<bool (ReconnectCtlPtr db_retry)> Callback;
/// @brief Constructor /// @brief Constructor
/// ///
...@@ -151,7 +150,7 @@ public: ...@@ -151,7 +150,7 @@ public:
/// @param db_lost_callback Optional call back function to invoke if a /// @param db_lost_callback Optional call back function to invoke if a
/// successfully open connection subsequently fails /// successfully open connection subsequently fails
DatabaseConnection(const ParameterMap& parameters, DatabaseConnection(const ParameterMap& parameters,
Callback db_lost_callback = NULL) DbLostCallback db_lost_callback = NULL)
:parameters_(parameters), db_lost_callback_(db_lost_callback) { :parameters_(parameters), db_lost_callback_(db_lost_callback) {
} }
...@@ -221,7 +220,7 @@ private: ...@@ -221,7 +220,7 @@ private:
protected: protected:
/// @brief Optional function to invoke if the connectivity is lost /// @brief Optional function to invoke if the connectivity is lost
Callback db_lost_callback_; DbLostCallback db_lost_callback_;
}; };
}; // end of isc::dhcp namespace }; // end of isc::dhcp namespace
......
...@@ -46,7 +46,7 @@ HostDataSourceFactory::getHostDataSourcePtr() { ...@@ -46,7 +46,7 @@ HostDataSourceFactory::getHostDataSourcePtr() {
void void
HostDataSourceFactory::create(const std::string& dbaccess, HostDataSourceFactory::create(const std::string& dbaccess,
DatabaseConnection::Callback db_lost_callback) { DatabaseConnection::DbLostCallback db_lost_callback) {
// Parse the access string and create a redacted string for logging. // Parse the access string and create a redacted string for logging.
DatabaseConnection::ParameterMap parameters = DatabaseConnection::ParameterMap parameters =
DatabaseConnection::parse(dbaccess); DatabaseConnection::parse(dbaccess);
......
...@@ -67,7 +67,7 @@ public: ...@@ -67,7 +67,7 @@ public:
/// @throw isc::dhcp::InvalidType The "type" keyword in dbaccess does not /// @throw isc::dhcp::InvalidType The "type" keyword in dbaccess does not
/// identify a supported backend. /// identify a supported backend.
static void create(const std::string& dbaccess, static void create(const std::string& dbaccess,
DatabaseConnection::Callback db_lost_callback = NULL); DatabaseConnection::DbLostCallback db_lost_callback = NULL);
/// @brief Destroy host data source /// @brief Destroy host data source
/// ///
......
...@@ -38,7 +38,7 @@ HostMgr::getHostMgrPtr() { ...@@ -38,7 +38,7 @@ HostMgr::getHostMgrPtr() {
void void
HostMgr::create(const std::string& access, HostMgr::create(const std::string& access,
DatabaseConnection::Callback db_lost_callback) { DatabaseConnection::DbLostCallback db_lost_callback) {
getHostMgrPtr().reset(new HostMgr()); getHostMgrPtr().reset(new HostMgr());
if (!access.empty()) { if (!access.empty()) {
......
...@@ -73,7 +73,7 @@ public: ...@@ -73,7 +73,7 @@ public:
/// @param db_lost_callback function to invoke if connectivity to /// @param db_lost_callback function to invoke if connectivity to
/// the host database is lost. /// the host database is lost.
static void create(const std::string& access = "", static void create(const std::string& access = "",
DatabaseConnection::Callback db_lost_callback = NULL); DatabaseConnection::DbLostCallback db_lost_callback = NULL);
/// @brief Returns a sole instance of the @c HostMgr. /// @brief Returns a sole instance of the @c HostMgr.
/// ///
......
...@@ -42,7 +42,7 @@ LeaseMgrFactory::getLeaseMgrPtr() { ...@@ -42,7 +42,7 @@ LeaseMgrFactory::getLeaseMgrPtr() {
void void
LeaseMgrFactory::create(const std::string& dbaccess, LeaseMgrFactory::create(const std::string& dbaccess,
DatabaseConnection::Callback db_lost_callback) { DatabaseConnection::DbLostCallback db_lost_callback) {
const std::string type = "type"; const std::string type = "type";
// Parse the access string and create a redacted string for logging. // Parse the access string and create a redacted string for logging.
......
...@@ -71,7 +71,7 @@ public: ...@@ -71,7 +71,7 @@ public:
/// @throw isc::dhcp::InvalidType The "type" keyword in dbaccess does not /// @throw isc::dhcp::InvalidType The "type" keyword in dbaccess does not
/// identify a supported backend. /// identify a supported backend.
static void create(const std::string& dbaccess, static void create(const std::string& dbaccess,
DatabaseConnection::Callback db_lost_callback = NULL); DatabaseConnection::DbLostCallback db_lost_callback = NULL);
/// @brief Destroy lease manager /// @brief Destroy lease manager
/// ///
......
...@@ -304,7 +304,7 @@ public: ...@@ -304,7 +304,7 @@ public:
} }
PgSqlConnection(const ParameterMap& parameters, PgSqlConnection(const ParameterMap& parameters,
Callback db_lost_callback) DbLostCallback db_lost_callback)
: DatabaseConnection(parameters, db_lost_callback) { : DatabaseConnection(parameters, db_lost_callback) {
} }
......
...@@ -1285,7 +1285,7 @@ public: ...@@ -1285,7 +1285,7 @@ public:
/// This constructor opens database connection and initializes prepared /// This constructor opens database connection and initializes prepared
/// statements used in the queries. /// statements used in the queries.
PgSqlHostDataSourceImpl(const PgSqlConnection::ParameterMap& parameters, PgSqlHostDataSourceImpl(const PgSqlConnection::ParameterMap& parameters,
DatabaseConnection::Callback db_lost_callback); DatabaseConnection::DbLostCallback db_lost_callback);
/// @brief Destructor. /// @brief Destructor.
~PgSqlHostDataSourceImpl(); ~PgSqlHostDataSourceImpl();
...@@ -1701,7 +1701,7 @@ TaggedStatementArray tagged_statements = { { ...@@ -1701,7 +1701,7 @@ TaggedStatementArray tagged_statements = { {
PgSqlHostDataSourceImpl:: PgSqlHostDataSourceImpl::
PgSqlHostDataSourceImpl(const PgSqlConnection::ParameterMap& parameters, PgSqlHostDataSourceImpl(const PgSqlConnection::ParameterMap& parameters,
DatabaseConnection::Callback db_lost_callback) DatabaseConnection::DbLostCallback db_lost_callback)
: host_exchange_(new PgSqlHostWithOptionsExchange(PgSqlHostWithOptionsExchange::DHCP4_ONLY)), : host_exchange_(new PgSqlHostWithOptionsExchange(PgSqlHostWithOptionsExchange::DHCP4_ONLY)),
host_ipv6_exchange_(new PgSqlHostIPv6Exchange(PgSqlHostWithOptionsExchange::DHCP6_ONLY)), host_ipv6_exchange_(new PgSqlHostIPv6Exchange(PgSqlHostWithOptionsExchange::DHCP6_ONLY)),
host_ipv46_exchange_(new PgSqlHostIPv6Exchange(PgSqlHostWithOptionsExchange:: host_ipv46_exchange_(new PgSqlHostIPv6Exchange(PgSqlHostWithOptionsExchange::
...@@ -1929,7 +1929,7 @@ PgSqlHostDataSourceImpl::checkReadOnly() const { ...@@ -1929,7 +1929,7 @@ PgSqlHostDataSourceImpl::checkReadOnly() const {
PgSqlHostDataSource:: PgSqlHostDataSource::
PgSqlHostDataSource(const PgSqlConnection::ParameterMap& parameters, PgSqlHostDataSource(const PgSqlConnection::ParameterMap& parameters,
DatabaseConnection::Callback db_lost_callback) DatabaseConnection::DbLostCallback db_lost_callback)
: impl_(new PgSqlHostDataSourceImpl(parameters, db_lost_callback)) { : impl_(new PgSqlHostDataSourceImpl(parameters, db_lost_callback)) {
} }
......
...@@ -61,7 +61,7 @@ public: ...@@ -61,7 +61,7 @@ public:
/// @throw isc::dhcp::DbOperationError An operation on the open database has /// @throw isc::dhcp::DbOperationError An operation on the open database has
/// failed. /// failed.
PgSqlHostDataSource(const DatabaseConnection::ParameterMap& parameters, PgSqlHostDataSource(const DatabaseConnection::ParameterMap& parameters,
DatabaseConnection::Callback db_lost_callback = NULL); DatabaseConnection::DbLostCallback db_lost_callback = NULL);
/// @brief Virtual destructor. /// @brief Virtual destructor.
/// Frees database resources and closes the database connection through /// Frees database resources and closes the database connection through
......
...@@ -821,7 +821,7 @@ protected: ...@@ -821,7 +821,7 @@ protected:
}; };
PgSqlLeaseMgr::PgSqlLeaseMgr(const DatabaseConnection::ParameterMap& parameters, PgSqlLeaseMgr::PgSqlLeaseMgr(const DatabaseConnection::ParameterMap& parameters,
DatabaseConnection::Callback db_lost_callback) DatabaseConnection::DbLostCallback db_lost_callback)
: LeaseMgr(), exchange4_(new PgSqlLease4Exchange()), : LeaseMgr(), exchange4_(new PgSqlLease4Exchange()),
exchange6_(new PgSqlLease6Exchange()), conn_(parameters, db_lost_callback) { exchange6_(new PgSqlLease6Exchange()), conn_(parameters, db_lost_callback) {
conn_.openDatabase(); conn_.openDatabase();
......
...@@ -59,7 +59,7 @@ public: ...@@ -59,7 +59,7 @@ public:
/// @throw isc::dhcp::DbOperationError An operation on the open database has /// @throw isc::dhcp::DbOperationError An operation on the open database has
/// failed. /// failed.
PgSqlLeaseMgr(const DatabaseConnection::ParameterMap& parameters, PgSqlLeaseMgr(const DatabaseConnection::ParameterMap& parameters,
DatabaseConnection::Callback db_lost_callback = NULL); DatabaseConnection::DbLostCallback db_lost_callback = NULL);
/// @brief Destructor (closes database) /// @brief Destructor (closes database)
virtual ~PgSqlLeaseMgr(); virtual ~PgSqlLeaseMgr();
......
...@@ -13,21 +13,28 @@ ...@@ -13,21 +13,28 @@
using namespace isc::dhcp; using namespace isc::dhcp;
/// @brief Test fixture for excersizing DbLostCallback invocation
class DatabaseConnectionCallbackTest : public ::testing::Test { class DatabaseConnectionCallbackTest : public ::testing::Test {
public: public:
/// Constructor
DatabaseConnectionCallbackTest() DatabaseConnectionCallbackTest()
: db_reconnect_ctl_(0) { : db_reconnect_ctl_(0) {
} }
bool dbLostCallback(ReconnectCtlPtr db_conn_retry) { /// @brief Callback to register with a DatabaseConnection
if (!db_conn_retry) { ///
isc_throw(isc::BadValue, "db_conn_retry should not null"); /// @param db_reconnect_ctl ReconnectCtl containing reconnect
/// parameters
bool dbLostCallback(ReconnectCtlPtr db_reconnect_ctl) {
if (!db_reconnect_ctl) {
isc_throw(isc::BadValue, "db_reconnect_ctl should not null");
} }
db_reconnect_ctl_ = db_conn_retry; db_reconnect_ctl_ = db_reconnect_ctl;
return (true); return (true);