Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ISC Open Source Projects
Kea
Commits
532c3630
Commit
532c3630
authored
Feb 13, 2013
by
Marcin Siodelski
Browse files
[2701] Added composite indexes to container holding V4 leases in memfile.
parent
27b34684
Changes
4
Hide whitespace changes
Inline
Side-by-side
src/lib/dhcp/duid.h
View file @
532c3630
...
...
@@ -105,7 +105,7 @@ public:
ClientId
(
const
uint8_t
*
clientid
,
size_t
len
);
/// @brief Returns reference to the client-id data
const
std
::
vector
<
uint8_t
>
getClientId
()
const
;
std
::
vector
<
uint8_t
>
getClientId
()
const
;
/// @brief Returns textual representation of a DUID (e.g. 00:01:02:03:ff)
std
::
string
toText
()
const
;
...
...
src/lib/dhcpsrv/alloc_engine.cc
View file @
532c3630
...
...
@@ -285,8 +285,9 @@ AllocEngine::allocateAddress4(const SubnetPtr& subnet,
}
// Check if there's existing lease for that subnet/clientid/hwaddr combination.
Lease4Ptr
existing
=
LeaseMgrFactory
::
instance
().
getLease4
(
hwaddr
->
hwaddr
_
,
subnet
->
getID
());
Lease4Ptr
existing
=
LeaseMgrFactory
::
instance
().
getLease4
(
*
hwaddr
,
subnet
->
getID
());
if
(
existing
)
{
std
::
cout
<<
"Got lease using HWADdr"
<<
std
::
endl
;
// We have a lease already. This is a returning client, probably after
// its reboot.
existing
=
renewLease4
(
subnet
,
clientid
,
hwaddr
,
existing
,
fake_allocation
);
...
...
@@ -301,6 +302,7 @@ AllocEngine::allocateAddress4(const SubnetPtr& subnet,
if
(
clientid
)
{
existing
=
LeaseMgrFactory
::
instance
().
getLease4
(
*
clientid
,
subnet
->
getID
());
if
(
existing
)
{
std
::
cout
<<
"Got lease using Clientid"
<<
std
::
endl
;
// we have a lease already. This is a returning client, probably after
// its reboot.
existing
=
renewLease4
(
subnet
,
clientid
,
hwaddr
,
existing
,
fake_allocation
);
...
...
src/lib/dhcpsrv/memfile_lease_mgr.cc
View file @
532c3630
...
...
@@ -56,7 +56,9 @@ Lease4Ptr Memfile_LeaseMgr::getLease4(const isc::asiolink::IOAddress& addr) cons
LOG_DEBUG
(
dhcpsrv_logger
,
DHCPSRV_DBG_TRACE_DETAIL
,
DHCPSRV_MEMFILE_GET_ADDR4
).
arg
(
addr
.
toText
());
Lease4Storage
::
iterator
l
=
storage4_
.
find
(
addr
);
typedef
Lease4Storage
::
nth_index
<
0
>::
type
SearchIndex
;
const
SearchIndex
&
idx
=
storage4_
.
get
<
0
>
();
Lease4Storage
::
iterator
l
=
idx
.
find
(
addr
);
if
(
l
==
storage4_
.
end
())
{
return
(
Lease4Ptr
());
}
else
{
...
...
@@ -77,6 +79,16 @@ Lease4Ptr Memfile_LeaseMgr::getLease4(const HWAddr& hwaddr,
DHCPSRV_MEMFILE_GET_SUBID_HWADDR
).
arg
(
subnet_id
)
.
arg
(
hwaddr
.
toText
());
typedef
Lease4Storage
::
nth_index
<
1
>::
type
SearchIndex
;
const
SearchIndex
&
idx
=
storage4_
.
get
<
1
>
();
SearchIndex
::
const_iterator
lease
=
idx
.
find
(
boost
::
make_tuple
(
hwaddr
.
hwaddr_
,
subnet_id
));
if
(
lease
==
idx
.
end
())
{
return
Lease4Ptr
();
}
return
(
*
lease
);
Lease4Storage
::
iterator
l
;
for
(
l
=
storage4_
.
begin
();
l
!=
storage4_
.
end
();
++
l
)
{
if
(
((
*
l
)
->
hwaddr_
==
hwaddr
.
hwaddr_
)
&&
...
...
@@ -100,6 +112,17 @@ Lease4Ptr Memfile_LeaseMgr::getLease4(const ClientId& client_id,
LOG_DEBUG
(
dhcpsrv_logger
,
DHCPSRV_DBG_TRACE_DETAIL
,
DHCPSRV_MEMFILE_GET_SUBID_CLIENTID
).
arg
(
subnet_id
)
.
arg
(
client_id
.
toText
());
typedef
Lease4Storage
::
nth_index
<
2
>::
type
SearchIndex
;
const
SearchIndex
&
idx
=
storage4_
.
get
<
2
>
();
SearchIndex
::
const_iterator
lease
=
idx
.
find
(
boost
::
make_tuple
(
client_id
.
getClientId
(),
subnet_id
));
if
(
lease
==
idx
.
end
())
{
return
Lease4Ptr
();
}
return
(
*
lease
);
Lease4Storage
::
iterator
l
;
for
(
l
=
storage4_
.
begin
();
l
!=
storage4_
.
end
();
++
l
)
{
if
(
(
*
(
*
l
)
->
client_id_
==
client_id
)
&&
...
...
src/lib/dhcpsrv/memfile_lease_mgr.h
View file @
532c3630
...
...
@@ -22,6 +22,7 @@
#include <boost/multi_index/member.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/composite_key.hpp>
namespace
isc
{
namespace
dhcp
{
...
...
@@ -220,6 +221,30 @@ public:
protected:
template
<
typename
KeyExtractor1
,
typename
KeyExtractor2
>
class
KeyFromKey
{
public:
typedef
typename
KeyExtractor1
::
result_type
result_type
;
/// @brief Constructor.
KeyFromKey
()
:
key1_
(
KeyExtractor1
()),
key2_
(
KeyExtractor2
())
{
};
/// @brief Extract key with another key.
///
/// @param arg the key value.
///
/// @tparam key value type.
template
<
typename
T
>
result_type
operator
()
(
T
&
arg
)
const
{
return
(
key1_
(
key2_
(
arg
)));
}
private:
KeyExtractor1
key1_
;
///< key 1.
KeyExtractor2
key2_
;
///< key 2.
};
typedef
boost
::
multi_index_container
<
// this is a multi-index container...
Lease6Ptr
,
// it will hold shared_ptr to leases6
boost
::
multi_index
::
indexed_by
<
// and will be sorted by
...
...
@@ -238,8 +263,27 @@ protected:
// IPv6 address that are unique. That particular key is a member
// of the Lease6 structure, is of type IOAddress and can be accessed
// by doing &Lease6::addr_
boost
::
multi_index
::
order
ed_unique
<
boost
::
multi_index
::
hash
ed_unique
<
boost
::
multi_index
::
member
<
Lease
,
isc
::
asiolink
::
IOAddress
,
&
Lease
::
addr_
>
>
,
boost
::
multi_index
::
ordered_unique
<
boost
::
multi_index
::
composite_key
<
Lease4
,
boost
::
multi_index
::
member
<
Lease4
,
std
::
vector
<
uint8_t
>
,
&
Lease4
::
hwaddr_
>
,
boost
::
multi_index
::
member
<
Lease
,
SubnetID
,
&
Lease
::
subnet_id_
>
>
>
,
boost
::
multi_index
::
ordered_unique
<
boost
::
multi_index
::
composite_key
<
Lease4
,
KeyFromKey
<
boost
::
multi_index
::
const_mem_fun
<
ClientId
,
std
::
vector
<
uint8_t
>
,
&
ClientId
::
getClientId
>
,
boost
::
multi_index
::
member
<
Lease4
,
ClientIdPtr
,
&
Lease4
::
client_id_
>
>
,
boost
::
multi_index
::
member
<
Lease
,
uint32_t
,
&
Lease
::
subnet_id_
>
>
>
>
>
Lease4Storage
;
// Let the whole contraption be called Lease6Storage.
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment