From: Francis Dupont Date: Wed, 17 Jan 2018 18:28:57 +0000 (+0100) Subject: [5469] Moved to composite index in C++ code too X-Git-Tag: trac5458a_base~29^2~6 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e0abc5ac7c7b3caeb4ea3c3a5a65e040be33fc1b;p=thirdparty%2Fkea.git [5469] Moved to composite index in C++ code too --- diff --git a/src/hooks/dhcp/lease_cmds/lease_cmds.cc b/src/hooks/dhcp/lease_cmds/lease_cmds.cc index 0c48e2046d..7c8b01aa73 100644 --- a/src/hooks/dhcp/lease_cmds/lease_cmds.cc +++ b/src/hooks/dhcp/lease_cmds/lease_cmds.cc @@ -503,11 +503,26 @@ LeaseCmdsImpl::leaseGetAllHandler(CalloutHandle& handle) { } } else { Lease6Collection leases = - LeaseMgrFactory::instance().getLeases6((*subnet_id)->intValue()); + LeaseMgrFactory::instance().getLeases6((*subnet_id)->intValue(), + Lease::TYPE_NA); for (auto lease = leases.begin(); lease != leases.end(); ++lease) { ElementPtr lease_json = (*lease)->toElement(); leases_json->add(lease_json); } + + leases = LeaseMgrFactory::instance().getLeases6((*subnet_id)->intValue(), + Lease::TYPE_TA); + for (auto lease = leases.begin(); lease != leases.end(); ++lease) { + ElementPtr lease_json = (*lease)->toElement(); + leases_json->add(lease_json); + } + + leases = LeaseMgrFactory::instance().getLeases6((*subnet_id)->intValue(), + Lease::TYPE_PD); + for (auto lease = leases.begin(); lease != leases.end(); ++lease) { + ElementPtr lease_json = (*lease)->toElement(); + leases_json->add(lease_json); + } } } diff --git a/src/lib/dhcpsrv/cql_lease_mgr.cc b/src/lib/dhcpsrv/cql_lease_mgr.cc index 5dcdfd8f9b..fb114dfdf5 100644 --- a/src/lib/dhcpsrv/cql_lease_mgr.cc +++ b/src/lib/dhcpsrv/cql_lease_mgr.cc @@ -1719,7 +1719,7 @@ CqlLeaseMgr::getLeases6(Lease::Type lease_type, const DUID &duid, uint32_t iaid, } Lease6Collection -CqlLeaseMgr::getLeases6(SubnetID) const { +CqlLeaseMgr::getLeases6(SubnetID, Lease::Type) const { isc_throw(NotImplemented, "getLeases6(subnet_id) is not implemented"); } diff --git a/src/lib/dhcpsrv/cql_lease_mgr.h b/src/lib/dhcpsrv/cql_lease_mgr.h index af0097289c..c699577d89 100644 --- a/src/lib/dhcpsrv/cql_lease_mgr.h +++ b/src/lib/dhcpsrv/cql_lease_mgr.h @@ -268,12 +268,15 @@ public: uint32_t iaid, SubnetID subnet_id) const override; - /// @brief Returns all IPv6 leases for the particular subnet identifier. + /// @brief Returns all IPv6 leases for the particular subnet identifier + /// and lease type. /// /// @param subnet_id subnet identifier. + /// @param type specifies lease type: (NA, TA or PD) /// /// @return Lease collection (may be empty if no IPv6 lease found). - virtual Lease6Collection getLeases6(SubnetID subnet_id) const; + virtual Lease6Collection getLeases6(SubnetID subnet_id, + Lease::Type type) const; /// @brief Returns all IPv6 leases. /// diff --git a/src/lib/dhcpsrv/dhcpsrv_messages.mes b/src/lib/dhcpsrv/dhcpsrv_messages.mes index 8e3c7cfebd..2fc38426d5 100644 --- a/src/lib/dhcpsrv/dhcpsrv_messages.mes +++ b/src/lib/dhcpsrv/dhcpsrv_messages.mes @@ -514,9 +514,10 @@ lease from the memory file database for a client with the specified IAID A debug message issued when the server is attempting to obtain all IPv4 leases for a given subnet identifier from the memory file database. -% DHCPSRV_MEMFILE_GET_SUBID6 obtaining IPv6 leases for subnet ID %1 +% DHCPSRV_MEMFILE_GET_SUBID_TYPE6 obtaining IPv6 leases for subnet ID %1 and type %2 A debug message issued when the server is attempting to obtain all IPv6 -leases for a given subnet identifier from the memory file database. +leases for a given subnet identifier and lease type from the memory file +database. % DHCPSRV_MEMFILE_GET_SUBID_CLIENTID obtaining IPv4 lease for subnet ID %1 and client ID %2 A debug message issued when the server is attempting to obtain an IPv4 @@ -751,9 +752,9 @@ lease from the MySQL database for a client with the specified IAID A debug message issued when the server is attempting to obtain all IPv4 leases for a given subnet identifier from the MySQL database. -% DHCPSRV_MYSQL_GET_SUBID6 obtaining IPv6 leases for subnet ID %1 +% DHCPSRV_MYSQL_GET_SUBID_TYPE6 obtaining IPv6 leases for subnet ID %1 and type %2 A debug message issued when the server is attempting to obtain all IPv6 -leases for a given subnet identifier from the MySQL database. +leases for a given subnet identifier and lease type from the MySQL database. % DHCPSRV_MYSQL_GET_SUBID_CLIENTID obtaining IPv4 lease for subnet ID %1 and client ID %2 A debug message issued when the server is attempting to obtain an IPv4 @@ -921,9 +922,10 @@ lease from the PostgreSQL database for a client with the specified IAID A debug message issued when the server is attempting to obtain all IPv4 leases for a given subnet identifier from the PostgreSQL database. -% DHCPSRV_PGSQL_GET_SUBID6 obtaining IPv6 leases for subnet ID %1 +% DHCPSRV_PGSQL_GET_SUBID_TYPE6 obtaining IPv6 leases for subnet ID %1 and type %2 A debug message issued when the server is attempting to obtain all IPv6 -leases for a given subnet identifier from the PostgreSQL database. +leases for a given subnet identifier and lease type from the PostgreSQL +database. % DHCPSRV_PGSQL_GET_SUBID_CLIENTID obtaining IPv4 lease for subnet ID %1 and client ID %2 A debug message issued when the server is attempting to obtain an IPv4 diff --git a/src/lib/dhcpsrv/lease_mgr.h b/src/lib/dhcpsrv/lease_mgr.h index f7775845bd..c4bbf48292 100644 --- a/src/lib/dhcpsrv/lease_mgr.h +++ b/src/lib/dhcpsrv/lease_mgr.h @@ -341,12 +341,15 @@ public: Lease6Ptr getLease6(Lease::Type type, const DUID& duid, uint32_t iaid, SubnetID subnet_id) const; - /// @brief Returns all IPv6 leases for the particular subnet identifier. + /// @brief Returns all IPv6 leases for the particular subnet identifier + /// and lease type. /// /// @param subnet_id subnet identifier. + /// @param type specifies lease type: (NA, TA or PD) /// /// @return Lease collection (may be empty if no IPv6 lease found). - virtual Lease6Collection getLeases6(SubnetID subnet_id) const = 0; + virtual Lease6Collection getLeases6(SubnetID subnet_id, + Lease::Type type) const = 0; /// @brief Returns all IPv6 leases. /// diff --git a/src/lib/dhcpsrv/memfile_lease_mgr.cc b/src/lib/dhcpsrv/memfile_lease_mgr.cc index 61aaf577b1..871905b57f 100644 --- a/src/lib/dhcpsrv/memfile_lease_mgr.cc +++ b/src/lib/dhcpsrv/memfile_lease_mgr.cc @@ -832,9 +832,10 @@ Memfile_LeaseMgr::getLeases6(Lease::Type type, } Lease6Collection -Memfile_LeaseMgr::getLeases6(SubnetID subnet_id) const { - LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL, DHCPSRV_MEMFILE_GET_SUBID6) - .arg(subnet_id); +Memfile_LeaseMgr::getLeases6(SubnetID subnet_id, Lease::Type type) const { + LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL, DHCPSRV_MEMFILE_GET_SUBID_TYPE6) + .arg(subnet_id) + .arg(Lease::typeToText(type)); Lease6Collection collection; const Lease6StorageSubnetIdIndex& idx = storage6_.get(); @@ -843,7 +844,10 @@ Memfile_LeaseMgr::getLeases6(SubnetID subnet_id) const { idx.equal_range(subnet_id); for (auto lease = l.first; lease != l.second; ++lease) { - collection.push_back(Lease6Ptr(new Lease6(**lease))); + // Filter out the leases which lease type doesn't match. + if ((*lease)->type_ == type) { + collection.push_back(Lease6Ptr(new Lease6(**lease))); + } } return (collection); diff --git a/src/lib/dhcpsrv/memfile_lease_mgr.h b/src/lib/dhcpsrv/memfile_lease_mgr.h index 0cb5bc829b..c42d799b91 100644 --- a/src/lib/dhcpsrv/memfile_lease_mgr.h +++ b/src/lib/dhcpsrv/memfile_lease_mgr.h @@ -271,12 +271,15 @@ public: uint32_t iaid, SubnetID subnet_id) const; - /// @brief Returns all IPv6 leases for the particular subnet identifier. + /// @brief Returns all IPv6 leases for the particular subnet identifier + /// and lease type. /// /// @param subnet_id subnet identifier. + /// @param type specifies lease type: (NA, TA or PD) /// /// @return Lease collection (may be empty if no IPv6 lease found). - virtual Lease6Collection getLeases6(SubnetID subnet_id) const; + virtual Lease6Collection getLeases6(SubnetID subnet_id, + Lease::Type type) const; /// @brief Returns all IPv6 leases. /// diff --git a/src/lib/dhcpsrv/mysql_lease_mgr.cc b/src/lib/dhcpsrv/mysql_lease_mgr.cc index 9f03556488..19dd8e44be 100644 --- a/src/lib/dhcpsrv/mysql_lease_mgr.cc +++ b/src/lib/dhcpsrv/mysql_lease_mgr.cc @@ -189,7 +189,7 @@ tagged_statements = { { "FROM lease6 " "WHERE duid = ? AND iaid = ? AND subnet_id = ? " "AND lease_type = ?"}, - {MySqlLeaseMgr::GET_LEASE6_SUBID, + {MySqlLeaseMgr::GET_LEASE6_SUBID_TYPE, "SELECT address, duid, valid_lifetime, " "expire, subnet_id, pref_lifetime, " "lease_type, iaid, prefix_len, " @@ -197,7 +197,7 @@ tagged_statements = { { "hwaddr, hwtype, hwaddr_source, " "state " "FROM lease6 " - "WHERE subnet_id = ?"}, + "WHERE subnet_id = ? and lease_type = ?"}, {MySqlLeaseMgr::GET_LEASE6_EXPIRE, "SELECT address, duid, valid_lifetime, " "expire, subnet_id, pref_lifetime, " @@ -1927,12 +1927,14 @@ MySqlLeaseMgr::getLeases6(Lease::Type lease_type, } Lease6Collection -MySqlLeaseMgr::getLeases6(SubnetID subnet_id) const { - LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL, DHCPSRV_MYSQL_GET_SUBID6) - .arg(subnet_id); +MySqlLeaseMgr::getLeases6(SubnetID subnet_id, Lease::Type type) const { + LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL, + DHCPSRV_MYSQL_GET_SUBID_TYPE6) + .arg(subnet_id) + .arg(Lease::typeToText(type)); // Set up the WHERE clause value - MYSQL_BIND inbind[1]; + MYSQL_BIND inbind[2]; memset(inbind, 0, sizeof(inbind)); // Subnet ID @@ -1940,9 +1942,14 @@ MySqlLeaseMgr::getLeases6(SubnetID subnet_id) const { inbind[0].buffer = reinterpret_cast(&subnet_id); inbind[0].is_unsigned = MLM_TRUE; + // LEASE_TYPE + inbind[1].buffer_type = MYSQL_TYPE_TINY; + inbind[1].buffer = reinterpret_cast(&type); + inbind[1].is_unsigned = MLM_TRUE; + // ... and get the data Lease6Collection result; - getLeaseCollection(GET_LEASE6_SUBID, inbind, result); + getLeaseCollection(GET_LEASE6_SUBID_TYPE, inbind, result); return (result); } diff --git a/src/lib/dhcpsrv/mysql_lease_mgr.h b/src/lib/dhcpsrv/mysql_lease_mgr.h index 91265cc72b..bafafbd8c1 100644 --- a/src/lib/dhcpsrv/mysql_lease_mgr.h +++ b/src/lib/dhcpsrv/mysql_lease_mgr.h @@ -268,12 +268,15 @@ public: virtual Lease6Collection getLeases6(Lease::Type type, const DUID& duid, uint32_t iaid, SubnetID subnet_id) const; - /// @brief Returns all IPv6 leases for the particular subnet identifier. + /// @brief Returns all IPv6 leases for the particular subnet identifier + /// and lease type. /// /// @param subnet_id subnet identifier. + /// @param type specifies lease type: (NA, TA or PD) /// /// @return Lease collection (may be empty if no IPv6 lease found). - virtual Lease6Collection getLeases6(SubnetID subnet_id) const; + virtual Lease6Collection getLeases6(SubnetID subnet_id, + Lease::Type type) const; /// @brief Returns all IPv6 leases. /// @@ -452,7 +455,7 @@ public: GET_LEASE6_ADDR, // Get lease6 by address GET_LEASE6_DUID_IAID, // Get lease6 by DUID and IAID GET_LEASE6_DUID_IAID_SUBID, // Get lease6 by DUID, IAID and subnet ID - GET_LEASE6_SUBID, // Get IPv6 leases by subnet ID + GET_LEASE6_SUBID_TYPE, // Get IPv6 leases by subnet ID and type GET_LEASE6_EXPIRE, // Get lease6 by expiration. GET_VERSION, // Obtain version number INSERT_LEASE4, // Add entry to lease4 table diff --git a/src/lib/dhcpsrv/pgsql_lease_mgr.cc b/src/lib/dhcpsrv/pgsql_lease_mgr.cc index c9e68499dd..156a54290f 100644 --- a/src/lib/dhcpsrv/pgsql_lease_mgr.cc +++ b/src/lib/dhcpsrv/pgsql_lease_mgr.cc @@ -168,15 +168,15 @@ PgSqlTaggedStatement tagged_statements[] = { "WHERE lease_type = $1 " "AND duid = $2 AND iaid = $3 AND subnet_id = $4"}, - // GET_LEASE6_SUBID - { 1, { OID_INT8 }, + // GET_LEASE6_SUBID_TYPE + { 2, { OID_INT8, OID_INT2 }, "get_lease6_subid", "SELECT address, duid, valid_lifetime, " "extract(epoch from expire)::bigint, subnet_id, pref_lifetime, " "lease_type, iaid, prefix_len, fqdn_fwd, fqdn_rev, hostname, " "state " "FROM lease6 " - "WHERE subnet_id = $1"}, + "WHERE subnet_id = $1 AND lease_type = $2"}, // GET_LEASE6_EXPIRE { 3, { OID_INT8, OID_TIMESTAMP, OID_INT8 }, @@ -1225,9 +1225,10 @@ PgSqlLeaseMgr::getLeases6(Lease::Type lease_type, const DUID& duid, } Lease6Collection -PgSqlLeaseMgr::getLeases6(SubnetID subnet_id) const { - LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL, DHCPSRV_PGSQL_GET_SUBID6) - .arg(subnet_id); +PgSqlLeaseMgr::getLeases6(SubnetID subnet_id, Lease::Type type) const { + LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL, DHCPSRV_PGSQL_GET_SUBID_TYPE6) + .arg(subnet_id) + .arg(Lease::typeToText(type)); // Set up the WHERE clause value PsqlBindArray bind_array; @@ -1236,9 +1237,13 @@ PgSqlLeaseMgr::getLeases6(SubnetID subnet_id) const { std::string subnet_id_str = boost::lexical_cast(subnet_id); bind_array.add(subnet_id_str); + // LEASE_TYPE + std::string lease_type_str = boost::lexical_cast(type); + bind_array.add(lease_type_str); + // ... and get the data Lease6Collection result; - getLeaseCollection(GET_LEASE6_SUBID, bind_array, result); + getLeaseCollection(GET_LEASE6_SUBID_TYPE, bind_array, result); return (result); } diff --git a/src/lib/dhcpsrv/pgsql_lease_mgr.h b/src/lib/dhcpsrv/pgsql_lease_mgr.h index 54ca6df8ec..9f41350c9c 100644 --- a/src/lib/dhcpsrv/pgsql_lease_mgr.h +++ b/src/lib/dhcpsrv/pgsql_lease_mgr.h @@ -242,12 +242,15 @@ public: virtual Lease6Collection getLeases6(Lease::Type type, const DUID& duid, uint32_t iaid, SubnetID subnet_id) const; - /// @brief Returns all IPv6 leases for the particular subnet identifier. + /// @brief Returns all IPv6 leases for the particular subnet identifier + /// and lease type. /// /// @param subnet_id subnet identifier. + /// @param type specifies lease type: (NA, TA or PD) /// /// @return Lease collection (may be empty if no IPv6 lease found). - virtual Lease6Collection getLeases6(SubnetID subnet_id) const; + virtual Lease6Collection getLeases6(SubnetID subnet_id, + Lease::Type type) const; /// @brief Returns all IPv6 leases. /// @@ -443,7 +446,7 @@ public: GET_LEASE6_ADDR, // Get lease6 by address GET_LEASE6_DUID_IAID, // Get lease6 by DUID and IAID GET_LEASE6_DUID_IAID_SUBID, // Get lease6 by DUID, IAID and subnet ID - GET_LEASE6_SUBID, // Get IPv6 leases by subnet ID + GET_LEASE6_SUBID_TYPE, // Get IPv6 leases by subnet ID and type GET_LEASE6_EXPIRE, // Get expired lease6 GET_VERSION, // Obtain version number INSERT_LEASE4, // Add entry to lease4 table diff --git a/src/lib/dhcpsrv/tests/generic_lease_mgr_unittest.cc b/src/lib/dhcpsrv/tests/generic_lease_mgr_unittest.cc index 3b1850d527..8ff4c4ecdd 100644 --- a/src/lib/dhcpsrv/tests/generic_lease_mgr_unittest.cc +++ b/src/lib/dhcpsrv/tests/generic_lease_mgr_unittest.cc @@ -1255,9 +1255,14 @@ GenericLeaseMgrTest::testGetLeases6SubnetId() { } // There should be exactly two leases for the subnet id that the second - // lease belongs to. - Lease6Collection returned = lmptr_->getLeases6(leases[1]->subnet_id_); - ASSERT_EQ(2, returned.size()); + // lease belongs to, one TA and one PD. + Lease6Collection returned = + lmptr_->getLeases6(leases[1]->subnet_id_, Lease::TYPE_NA); + EXPECT_EQ(0, returned.size()); + returned = lmptr_->getLeases6(leases[1]->subnet_id_,Lease::TYPE_TA); + EXPECT_EQ(1, returned.size()); + returned = lmptr_->getLeases6(leases[1]->subnet_id_,Lease::TYPE_PD); + EXPECT_EQ(1, returned.size()); } void diff --git a/src/lib/dhcpsrv/tests/lease_mgr_unittest.cc b/src/lib/dhcpsrv/tests/lease_mgr_unittest.cc index 88ea5a064a..3a20e7b58e 100644 --- a/src/lib/dhcpsrv/tests/lease_mgr_unittest.cc +++ b/src/lib/dhcpsrv/tests/lease_mgr_unittest.cc @@ -181,9 +181,10 @@ public: /// @brief Returns all IPv6 leases for the particular subnet identifier. /// /// @param subnet_id subnet identifier. + /// @param type lease type. /// /// @return Lease collection (may be empty if no IPv6 lease found). - virtual Lease6Collection getLeases6(SubnetID) const { + virtual Lease6Collection getLeases6(SubnetID, Lease::Type) const { return (Lease6Collection()); }