blob: 5a60fefc0395ad64f5c2a9ae19e9dc9abc9a51a3 [file] [log] [blame]
Junxiao Shi0fcb41e2014-01-24 10:29:43 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Davide Pesavento84c65c02017-07-05 18:40:34 +00002/*
Junxiao Shi3d2049f2018-01-26 23:46:06 +00003 * Copyright (c) 2014-2018, Regents of the University of California,
Junxiao Shi5640ec82015-01-07 21:51:19 -07004 * Arizona Board of Regents,
5 * Colorado State University,
6 * University Pierre & Marie Curie, Sorbonne University,
7 * Washington University in St. Louis,
8 * Beijing Institute of Technology,
9 * The University of Memphis.
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -080010 *
Alexander Afanasyev9bcbc7c2014-04-06 19:37:37 -070011 * This file is part of NFD (Named Data Networking Forwarding Daemon).
12 * See AUTHORS.md for complete list of NFD authors and contributors.
13 *
14 * NFD is free software: you can redistribute it and/or modify it under the terms
15 * of the GNU General Public License as published by the Free Software Foundation,
16 * either version 3 of the License, or (at your option) any later version.
17 *
18 * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
19 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
20 * PURPOSE. See the GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License along with
23 * NFD, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
Junxiao Shia9388182014-12-13 23:16:09 -070024 */
25
26/** \file
Alexander Afanasyev9bcbc7c2014-04-06 19:37:37 -070027 *
Junxiao Shia9388182014-12-13 23:16:09 -070028 * \brief implements the ContentStore
29 *
30 * This ContentStore implementation consists of two data structures,
31 * a Table, and a set of cleanup queues.
32 *
33 * The Table is a container (std::set) sorted by full Names of stored Data packets.
34 * Data packets are wrapped in Entry objects.
35 * Each Entry contain the Data packet itself,
36 * and a few addition attributes such as the staleness of the Data packet.
37 *
38 * The cleanup queues are three doubly linked lists which stores Table iterators.
39 * The three queues keep track of unsolicited, stale, and fresh Data packet, respectively.
40 * Table iterator is placed into, removed from, and moved between suitable queues
41 * whenever an Entry is added, removed, or has other attribute changes.
42 * The Table iterator of an Entry should be in exactly one queue at any moment.
43 * Within each queue, the iterators are kept in first-in-first-out order.
44 * Eviction procedure exhausts the first queue before moving onto the next queue,
45 * in the order of unsolicited, stale, and fresh queue.
Junxiao Shi0fcb41e2014-01-24 10:29:43 -070046 */
47
Alexander Afanasyev613e2a92014-04-15 13:36:58 -070048#ifndef NFD_DAEMON_TABLE_CS_HPP
49#define NFD_DAEMON_TABLE_CS_HPP
Alexander Afanasyevb927a3a2014-01-24 10:41:47 -080050
Minsheng Zhangcb6e05f2015-04-20 15:51:47 -050051#include "cs-policy.hpp"
52#include "cs-internal.hpp"
Junxiao Shifc206962015-01-16 11:12:22 -070053#include "cs-entry-impl.hpp"
Minsheng Zhangcb6e05f2015-04-20 15:51:47 -050054#include <ndn-cxx/util/signal.hpp>
Junxiao Shifc206962015-01-16 11:12:22 -070055#include <boost/iterator/transform_iterator.hpp>
Ilya Moiseenko96b80bb2014-04-05 20:53:27 -040056
Alexander Afanasyev18bbf812014-01-29 01:40:23 -080057namespace nfd {
Junxiao Shia9388182014-12-13 23:16:09 -070058namespace cs {
Junxiao Shi0fcb41e2014-01-24 10:29:43 -070059
Junxiao Shia9388182014-12-13 23:16:09 -070060/** \brief represents the ContentStore
Junxiao Shi0fcb41e2014-01-24 10:29:43 -070061 */
Alexander Afanasyevb927a3a2014-01-24 10:41:47 -080062class Cs : noncopyable
Junxiao Shi0fcb41e2014-01-24 10:29:43 -070063{
64public:
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -080065 explicit
Junxiao Shib4a5acd2016-12-07 19:59:18 +000066 Cs(size_t nMaxPackets = 10);
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -080067
Junxiao Shi0fcb41e2014-01-24 10:29:43 -070068 /** \brief inserts a Data packet
Junxiao Shi0fcb41e2014-01-24 10:29:43 -070069 */
Minsheng Zhangffe8bbb2016-03-10 13:40:37 -070070 void
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -080071 insert(const Data& data, bool isUnsolicited = false);
72
mzhang4eab72492015-02-25 11:16:09 -060073 typedef std::function<void(const Interest&, const Data& data)> HitCallback;
74 typedef std::function<void(const Interest&)> MissCallback;
75
Junxiao Shia9388182014-12-13 23:16:09 -070076 /** \brief finds the best matching Data packet
mzhang4eab72492015-02-25 11:16:09 -060077 * \param interest the Interest for lookup
78 * \param hitCallback a callback if a match is found; must not be empty
79 * \param missCallback a callback if there's no match; must not be empty
80 * \note A lookup invokes either callback exactly once.
81 * The callback may be invoked either before or after find() returns
Junxiao Shi0fcb41e2014-01-24 10:29:43 -070082 */
mzhang4eab72492015-02-25 11:16:09 -060083 void
84 find(const Interest& interest,
85 const HitCallback& hitCallback,
86 const MissCallback& missCallback) const;
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -080087
Junxiao Shi3d2049f2018-01-26 23:46:06 +000088 /** \brief get number of stored packets
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -080089 */
90 size_t
Junxiao Shifc206962015-01-16 11:12:22 -070091 size() const
92 {
93 return m_table.size();
94 }
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -080095
Junxiao Shi3d2049f2018-01-26 23:46:06 +000096public: // configuration
97 /** \brief get capacity (in number of packets)
98 */
99 size_t
100 getLimit() const
101 {
102 return m_policy->getLimit();
103 }
104
105 /** \brief change capacity (in number of packets)
106 */
Junxiao Shia9388182014-12-13 23:16:09 -0700107 void
Junxiao Shi3d2049f2018-01-26 23:46:06 +0000108 setLimit(size_t nMaxPackets)
109 {
110 return m_policy->setLimit(nMaxPackets);
111 }
112
113 /** \brief get replacement policy
114 */
115 Policy*
116 getPolicy() const
117 {
118 return m_policy.get();
119 }
120
121 /** \brief change replacement policy
122 * \pre size() == 0
123 */
124 void
125 setPolicy(unique_ptr<Policy> policy);
126
127 /** \brief get CS_ENABLE_ADMIT flag
128 * \sa https://redmine.named-data.net/projects/nfd/wiki/CsMgmt#Update-config
129 */
130 bool
131 shouldAdmit() const
132 {
133 return m_shouldAdmit;
134 }
135
136 /** \brief set CS_ENABLE_ADMIT flag
137 * \sa https://redmine.named-data.net/projects/nfd/wiki/CsMgmt#Update-config
138 */
139 void
140 enableAdmit(bool shouldAdmit);
141
142 /** \brief get CS_ENABLE_SERVE flag
143 * \sa https://redmine.named-data.net/projects/nfd/wiki/CsMgmt#Update-config
144 */
145 bool
146 shouldServe() const
147 {
148 return m_shouldServe;
149 }
150
151 /** \brief set CS_ENABLE_SERVE flag
152 * \sa https://redmine.named-data.net/projects/nfd/wiki/CsMgmt#Update-config
153 */
154 void
155 enableServe(bool shouldServe);
Junxiao Shia9388182014-12-13 23:16:09 -0700156
Junxiao Shifc206962015-01-16 11:12:22 -0700157public: // enumeration
158 struct EntryFromEntryImpl
159 {
160 typedef const Entry& result_type;
161
162 const Entry&
163 operator()(const EntryImpl& entry) const
164 {
165 return entry;
166 }
Junxiao Shia9388182014-12-13 23:16:09 -0700167 };
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -0800168
Junxiao Shifc206962015-01-16 11:12:22 -0700169 /** \brief ContentStore iterator (public API)
170 */
Minsheng Zhangcb6e05f2015-04-20 15:51:47 -0500171 typedef boost::transform_iterator<EntryFromEntryImpl, iterator, const Entry&> const_iterator;
Junxiao Shifc206962015-01-16 11:12:22 -0700172
173 const_iterator
174 begin() const
175 {
176 return boost::make_transform_iterator(m_table.begin(), EntryFromEntryImpl());
177 }
178
179 const_iterator
180 end() const
181 {
182 return boost::make_transform_iterator(m_table.end(), EntryFromEntryImpl());
183 }
184
185private: // find
Junxiao Shi5640ec82015-01-07 21:51:19 -0700186 /** \brief find leftmost match in [first,last)
187 * \return the leftmost match, or last if not found
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -0800188 */
Minsheng Zhangcb6e05f2015-04-20 15:51:47 -0500189 iterator
190 findLeftmost(const Interest& interest, iterator left, iterator right) const;
Junxiao Shi5640ec82015-01-07 21:51:19 -0700191
192 /** \brief find rightmost match in [first,last)
193 * \return the rightmost match, or last if not found
194 */
Minsheng Zhangcb6e05f2015-04-20 15:51:47 -0500195 iterator
196 findRightmost(const Interest& interest, iterator first, iterator last) const;
Junxiao Shi5640ec82015-01-07 21:51:19 -0700197
198 /** \brief find rightmost match among entries with exact Names in [first,last)
199 * \return the rightmost match, or last if not found
200 */
Minsheng Zhangcb6e05f2015-04-20 15:51:47 -0500201 iterator
202 findRightmostAmongExact(const Interest& interest, iterator first, iterator last) const;
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -0800203
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -0800204 void
Junxiao Shi52555b02016-11-25 21:39:06 +0000205 setPolicyImpl(unique_ptr<Policy> policy);
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -0800206
Junxiao Shi3d2049f2018-01-26 23:46:06 +0000207PUBLIC_WITH_TESTS_ELSE_PRIVATE:
208 void
209 dump();
210
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -0800211private:
Junxiao Shia9388182014-12-13 23:16:09 -0700212 Table m_table;
Minsheng Zhangcb6e05f2015-04-20 15:51:47 -0500213 unique_ptr<Policy> m_policy;
Junxiao Shi3d2049f2018-01-26 23:46:06 +0000214 signal::ScopedConnection m_beforeEvictConnection;
215
216 bool m_shouldAdmit; ///< if false, no Data will be admitted
217 bool m_shouldServe; ///< if false, all lookups will miss
Junxiao Shi0fcb41e2014-01-24 10:29:43 -0700218};
219
Junxiao Shia9388182014-12-13 23:16:09 -0700220} // namespace cs
221
222using cs::Cs;
223
Alexander Afanasyev18bbf812014-01-29 01:40:23 -0800224} // namespace nfd
Alexander Afanasyevb927a3a2014-01-24 10:41:47 -0800225
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700226#endif // NFD_DAEMON_TABLE_CS_HPP