table: add CS enablement flags
This commit also: * deletes never-implemented and unused Cs::erase method * groups CS configuration methods together * uses Table::emplace in Cs::insert refs #4050 Change-Id: If8cf29dd33921da2f2c4ce56e02395d43cd3ee99
This commit is contained in:
committed by
Alex Afanasyev
parent
0c3e57b399
commit
3d2049fbc1
+46
-35
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/**
|
||||
* Copyright (c) 2014-2016, Regents of the University of California,
|
||||
/*
|
||||
* Copyright (c) 2014-2018, Regents of the University of California,
|
||||
* Arizona Board of Regents,
|
||||
* Colorado State University,
|
||||
* University Pierre & Marie Curie, Sorbonne University,
|
||||
@@ -44,42 +44,20 @@ makeDefaultPolicy()
|
||||
}
|
||||
|
||||
Cs::Cs(size_t nMaxPackets)
|
||||
: m_shouldAdmit(true)
|
||||
, m_shouldServe(true)
|
||||
{
|
||||
this->setPolicyImpl(makeDefaultPolicy());
|
||||
m_policy->setLimit(nMaxPackets);
|
||||
}
|
||||
|
||||
void
|
||||
Cs::setLimit(size_t nMaxPackets)
|
||||
{
|
||||
m_policy->setLimit(nMaxPackets);
|
||||
}
|
||||
|
||||
size_t
|
||||
Cs::getLimit() const
|
||||
{
|
||||
return m_policy->getLimit();
|
||||
}
|
||||
|
||||
void
|
||||
Cs::setPolicy(unique_ptr<Policy> policy)
|
||||
{
|
||||
BOOST_ASSERT(policy != nullptr);
|
||||
BOOST_ASSERT(m_policy != nullptr);
|
||||
size_t limit = m_policy->getLimit();
|
||||
this->setPolicyImpl(std::move(policy));
|
||||
m_policy->setLimit(limit);
|
||||
}
|
||||
|
||||
void
|
||||
Cs::insert(const Data& data, bool isUnsolicited)
|
||||
{
|
||||
NFD_LOG_DEBUG("insert " << data.getName());
|
||||
|
||||
if (m_policy->getLimit() == 0) {
|
||||
// shortcut for disabled CS
|
||||
if (!m_shouldAdmit || m_policy->getLimit() == 0) {
|
||||
return;
|
||||
}
|
||||
NFD_LOG_DEBUG("insert " << data.getName());
|
||||
|
||||
// recognize CachePolicy
|
||||
shared_ptr<lp::CachePolicyTag> tag = data.getTag<lp::CachePolicyTag>();
|
||||
@@ -90,10 +68,9 @@ Cs::insert(const Data& data, bool isUnsolicited)
|
||||
}
|
||||
}
|
||||
|
||||
bool isNewEntry = false;
|
||||
iterator it;
|
||||
// use .insert because gcc46 does not support .emplace
|
||||
std::tie(it, isNewEntry) = m_table.insert(EntryImpl(data.shared_from_this(), isUnsolicited));
|
||||
bool isNewEntry = false;
|
||||
std::tie(it, isNewEntry) = m_table.emplace(data.shared_from_this(), isUnsolicited);
|
||||
EntryImpl& entry = const_cast<EntryImpl&>(*it);
|
||||
|
||||
entry.updateStaleTime();
|
||||
@@ -119,6 +96,10 @@ Cs::find(const Interest& interest,
|
||||
BOOST_ASSERT(static_cast<bool>(hitCallback));
|
||||
BOOST_ASSERT(static_cast<bool>(missCallback));
|
||||
|
||||
if (!m_shouldServe || m_policy->getLimit() == 0) {
|
||||
missCallback(interest);
|
||||
return;
|
||||
}
|
||||
const Name& prefix = interest.getName();
|
||||
bool isRightmost = interest.getChildSelector() == 1;
|
||||
NFD_LOG_DEBUG("find " << prefix << (isRightmost ? " R" : " L"));
|
||||
@@ -191,6 +172,25 @@ Cs::findRightmostAmongExact(const Interest& interest, iterator first, iterator l
|
||||
return find_last_if(first, last, bind(&EntryImpl::canSatisfy, _1, interest));
|
||||
}
|
||||
|
||||
void
|
||||
Cs::dump()
|
||||
{
|
||||
NFD_LOG_DEBUG("dump table");
|
||||
for (const EntryImpl& entry : m_table) {
|
||||
NFD_LOG_TRACE(entry.getFullName());
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Cs::setPolicy(unique_ptr<Policy> policy)
|
||||
{
|
||||
BOOST_ASSERT(policy != nullptr);
|
||||
BOOST_ASSERT(m_policy != nullptr);
|
||||
size_t limit = m_policy->getLimit();
|
||||
this->setPolicyImpl(std::move(policy));
|
||||
m_policy->setLimit(limit);
|
||||
}
|
||||
|
||||
void
|
||||
Cs::setPolicyImpl(unique_ptr<Policy> policy)
|
||||
{
|
||||
@@ -205,12 +205,23 @@ Cs::setPolicyImpl(unique_ptr<Policy> policy)
|
||||
}
|
||||
|
||||
void
|
||||
Cs::dump()
|
||||
Cs::enableAdmit(bool shouldAdmit)
|
||||
{
|
||||
NFD_LOG_DEBUG("dump table");
|
||||
for (const EntryImpl& entry : m_table) {
|
||||
NFD_LOG_TRACE(entry.getFullName());
|
||||
if (m_shouldAdmit == shouldAdmit) {
|
||||
return;
|
||||
}
|
||||
m_shouldAdmit = shouldAdmit;
|
||||
NFD_LOG_INFO((shouldAdmit ? "Enabling" : "Disabling") << " Data admittance");
|
||||
}
|
||||
|
||||
void
|
||||
Cs::enableServe(bool shouldServe)
|
||||
{
|
||||
if (m_shouldServe == shouldServe) {
|
||||
return;
|
||||
}
|
||||
m_shouldServe = shouldServe;
|
||||
NFD_LOG_INFO((shouldServe ? "Enabling" : "Disabling") << " Data serving");
|
||||
}
|
||||
|
||||
} // namespace cs
|
||||
|
||||
+69
-35
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2014-2017, Regents of the University of California,
|
||||
* Copyright (c) 2014-2018, Regents of the University of California,
|
||||
* Arizona Board of Regents,
|
||||
* Colorado State University,
|
||||
* University Pierre & Marie Curie, Sorbonne University,
|
||||
@@ -85,37 +85,7 @@ public:
|
||||
const HitCallback& hitCallback,
|
||||
const MissCallback& missCallback) const;
|
||||
|
||||
void
|
||||
erase(const Name& exactName)
|
||||
{
|
||||
BOOST_ASSERT_MSG(false, "not implemented");
|
||||
}
|
||||
|
||||
/** \brief changes capacity (in number of packets)
|
||||
*/
|
||||
void
|
||||
setLimit(size_t nMaxPackets);
|
||||
|
||||
/** \return capacity (in number of packets)
|
||||
*/
|
||||
size_t
|
||||
getLimit() const;
|
||||
|
||||
/** \brief changes cs replacement policy
|
||||
* \pre size() == 0
|
||||
*/
|
||||
void
|
||||
setPolicy(unique_ptr<Policy> policy);
|
||||
|
||||
/** \return cs replacement policy
|
||||
*/
|
||||
Policy*
|
||||
getPolicy() const
|
||||
{
|
||||
return m_policy.get();
|
||||
}
|
||||
|
||||
/** \return number of stored packets
|
||||
/** \brief get number of stored packets
|
||||
*/
|
||||
size_t
|
||||
size() const
|
||||
@@ -123,9 +93,66 @@ public:
|
||||
return m_table.size();
|
||||
}
|
||||
|
||||
PUBLIC_WITH_TESTS_ELSE_PRIVATE:
|
||||
public: // configuration
|
||||
/** \brief get capacity (in number of packets)
|
||||
*/
|
||||
size_t
|
||||
getLimit() const
|
||||
{
|
||||
return m_policy->getLimit();
|
||||
}
|
||||
|
||||
/** \brief change capacity (in number of packets)
|
||||
*/
|
||||
void
|
||||
dump();
|
||||
setLimit(size_t nMaxPackets)
|
||||
{
|
||||
return m_policy->setLimit(nMaxPackets);
|
||||
}
|
||||
|
||||
/** \brief get replacement policy
|
||||
*/
|
||||
Policy*
|
||||
getPolicy() const
|
||||
{
|
||||
return m_policy.get();
|
||||
}
|
||||
|
||||
/** \brief change replacement policy
|
||||
* \pre size() == 0
|
||||
*/
|
||||
void
|
||||
setPolicy(unique_ptr<Policy> policy);
|
||||
|
||||
/** \brief get CS_ENABLE_ADMIT flag
|
||||
* \sa https://redmine.named-data.net/projects/nfd/wiki/CsMgmt#Update-config
|
||||
*/
|
||||
bool
|
||||
shouldAdmit() const
|
||||
{
|
||||
return m_shouldAdmit;
|
||||
}
|
||||
|
||||
/** \brief set CS_ENABLE_ADMIT flag
|
||||
* \sa https://redmine.named-data.net/projects/nfd/wiki/CsMgmt#Update-config
|
||||
*/
|
||||
void
|
||||
enableAdmit(bool shouldAdmit);
|
||||
|
||||
/** \brief get CS_ENABLE_SERVE flag
|
||||
* \sa https://redmine.named-data.net/projects/nfd/wiki/CsMgmt#Update-config
|
||||
*/
|
||||
bool
|
||||
shouldServe() const
|
||||
{
|
||||
return m_shouldServe;
|
||||
}
|
||||
|
||||
/** \brief set CS_ENABLE_SERVE flag
|
||||
* \sa https://redmine.named-data.net/projects/nfd/wiki/CsMgmt#Update-config
|
||||
*/
|
||||
void
|
||||
enableServe(bool shouldServe);
|
||||
|
||||
public: // enumeration
|
||||
struct EntryFromEntryImpl
|
||||
@@ -177,10 +204,17 @@ private: // find
|
||||
void
|
||||
setPolicyImpl(unique_ptr<Policy> policy);
|
||||
|
||||
PUBLIC_WITH_TESTS_ELSE_PRIVATE:
|
||||
void
|
||||
dump();
|
||||
|
||||
private:
|
||||
Table m_table;
|
||||
unique_ptr<Policy> m_policy;
|
||||
ndn::util::signal::ScopedConnection m_beforeEvictConnection;
|
||||
signal::ScopedConnection m_beforeEvictConnection;
|
||||
|
||||
bool m_shouldAdmit; ///< if false, no Data will be admitted
|
||||
bool m_shouldServe; ///< if false, all lookups will miss
|
||||
};
|
||||
|
||||
} // namespace cs
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2014-2017, Regents of the University of California,
|
||||
* Copyright (c) 2014-2018, Regents of the University of California,
|
||||
* Arizona Board of Regents,
|
||||
* Colorado State University,
|
||||
* University Pierre & Marie Curie, Sorbonne University,
|
||||
@@ -383,6 +383,37 @@ BOOST_FIXTURE_TEST_CASE(ZeroCapacity, FindFixture)
|
||||
CHECK_CS_FIND(0);
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(EnablementFlags, FindFixture)
|
||||
{
|
||||
BOOST_CHECK_EQUAL(m_cs.shouldAdmit(), true);
|
||||
BOOST_CHECK_EQUAL(m_cs.shouldServe(), true);
|
||||
|
||||
insert(1, "/A");
|
||||
m_cs.enableAdmit(false);
|
||||
insert(2, "/B");
|
||||
m_cs.enableAdmit(true);
|
||||
insert(3, "/C");
|
||||
|
||||
startInterest("/A");
|
||||
CHECK_CS_FIND(1);
|
||||
startInterest("/B");
|
||||
CHECK_CS_FIND(0);
|
||||
startInterest("/C");
|
||||
CHECK_CS_FIND(3);
|
||||
|
||||
m_cs.enableServe(false);
|
||||
startInterest("/A");
|
||||
CHECK_CS_FIND(0);
|
||||
startInterest("/C");
|
||||
CHECK_CS_FIND(0);
|
||||
|
||||
m_cs.enableServe(true);
|
||||
startInterest("/A");
|
||||
CHECK_CS_FIND(1);
|
||||
startInterest("/C");
|
||||
CHECK_CS_FIND(3);
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(CachePolicyNoCache, FindFixture)
|
||||
{
|
||||
insert(1, "/A", [] (Data& data) {
|
||||
|
||||
Reference in New Issue
Block a user