blob: 5e3bfbe86c57d179711ae6fa44ad671224e86ee0 [file] [log] [blame]
Junxiao Shi0fcb41e2014-01-24 10:29:43 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Junxiao Shi5640ec82015-01-07 21:51:19 -07003 * Copyright (c) 2014-2015, Regents of the University of California,
4 * 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
Junxiao Shifc206962015-01-16 11:12:22 -070051#include "cs-entry-impl.hpp"
52#include <boost/iterator/transform_iterator.hpp>
Ilya Moiseenko96b80bb2014-04-05 20:53:27 -040053
Alexander Afanasyev18bbf812014-01-29 01:40:23 -080054namespace nfd {
Junxiao Shia9388182014-12-13 23:16:09 -070055namespace cs {
Junxiao Shi0fcb41e2014-01-24 10:29:43 -070056
Junxiao Shia9388182014-12-13 23:16:09 -070057/** \brief represents the ContentStore
Junxiao Shi0fcb41e2014-01-24 10:29:43 -070058 */
Alexander Afanasyevb927a3a2014-01-24 10:41:47 -080059class Cs : noncopyable
Junxiao Shi0fcb41e2014-01-24 10:29:43 -070060{
61public:
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -080062 explicit
Steve DiBenedetto3a4f83d2014-06-02 14:58:54 -060063 Cs(size_t nMaxPackets = 10);
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -080064
Junxiao Shi0fcb41e2014-01-24 10:29:43 -070065 /** \brief inserts a Data packet
Junxiao Shia9388182014-12-13 23:16:09 -070066 * \return true
Junxiao Shi0fcb41e2014-01-24 10:29:43 -070067 */
68 bool
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -080069 insert(const Data& data, bool isUnsolicited = false);
70
mzhang4eab72492015-02-25 11:16:09 -060071 typedef std::function<void(const Interest&, const Data& data)> HitCallback;
72 typedef std::function<void(const Interest&)> MissCallback;
73
Junxiao Shia9388182014-12-13 23:16:09 -070074 /** \brief finds the best matching Data packet
mzhang4eab72492015-02-25 11:16:09 -060075 * \param interest the Interest for lookup
76 * \param hitCallback a callback if a match is found; must not be empty
77 * \param missCallback a callback if there's no match; must not be empty
78 * \note A lookup invokes either callback exactly once.
79 * The callback may be invoked either before or after find() returns
Junxiao Shi0fcb41e2014-01-24 10:29:43 -070080 */
mzhang4eab72492015-02-25 11:16:09 -060081 void
82 find(const Interest& interest,
83 const HitCallback& hitCallback,
84 const MissCallback& missCallback) const;
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -080085
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -080086 void
Junxiao Shia9388182014-12-13 23:16:09 -070087 erase(const Name& exactName)
88 {
89 BOOST_ASSERT_MSG(false, "not implemented");
90 }
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -080091
Junxiao Shia9388182014-12-13 23:16:09 -070092 /** \brief changes capacity (in number of packets)
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -080093 */
94 void
95 setLimit(size_t nMaxPackets);
96
Junxiao Shia9388182014-12-13 23:16:09 -070097 /** \return capacity (in number of packets)
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -080098 */
99 size_t
Junxiao Shia9388182014-12-13 23:16:09 -0700100 getLimit() const
101 {
102 return m_limit;
103 }
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -0800104
Junxiao Shia9388182014-12-13 23:16:09 -0700105 /** \return number of stored packets
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -0800106 */
107 size_t
Junxiao Shifc206962015-01-16 11:12:22 -0700108 size() const
109 {
110 return m_table.size();
111 }
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -0800112
Junxiao Shia9388182014-12-13 23:16:09 -0700113PUBLIC_WITH_TESTS_ELSE_PRIVATE:
114 void
115 dump();
116
Junxiao Shifc206962015-01-16 11:12:22 -0700117public: // enumeration
118 struct EntryFromEntryImpl
119 {
120 typedef const Entry& result_type;
121
122 const Entry&
123 operator()(const EntryImpl& entry) const
124 {
125 return entry;
126 }
Junxiao Shia9388182014-12-13 23:16:09 -0700127 };
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -0800128
Junxiao Shifc206962015-01-16 11:12:22 -0700129 /** \brief ContentStore iterator (public API)
130 */
131 typedef boost::transform_iterator<EntryFromEntryImpl, TableIt, const Entry&> const_iterator;
132
133 const_iterator
134 begin() const
135 {
136 return boost::make_transform_iterator(m_table.begin(), EntryFromEntryImpl());
137 }
138
139 const_iterator
140 end() const
141 {
142 return boost::make_transform_iterator(m_table.end(), EntryFromEntryImpl());
143 }
144
145private: // find
Junxiao Shi5640ec82015-01-07 21:51:19 -0700146 /** \brief find leftmost match in [first,last)
147 * \return the leftmost match, or last if not found
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -0800148 */
Junxiao Shi5640ec82015-01-07 21:51:19 -0700149 TableIt
150 findLeftmost(const Interest& interest, TableIt left, TableIt right) const;
151
152 /** \brief find rightmost match in [first,last)
153 * \return the rightmost match, or last if not found
154 */
155 TableIt
156 findRightmost(const Interest& interest, TableIt first, TableIt last) const;
157
158 /** \brief find rightmost match among entries with exact Names in [first,last)
159 * \return the rightmost match, or last if not found
160 */
161 TableIt
162 findRightmostAmongExact(const Interest& interest, TableIt first, TableIt last) const;
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -0800163
Junxiao Shifc206962015-01-16 11:12:22 -0700164private: // cleanup
Junxiao Shia9388182014-12-13 23:16:09 -0700165 /** \brief attaches an entry to a suitable cleanup queue
166 * \note if the entry is already attached to a queue, it's automatically detached
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -0800167 */
168 void
Junxiao Shia9388182014-12-13 23:16:09 -0700169 attachQueue(TableIt it);
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -0800170
Junxiao Shia9388182014-12-13 23:16:09 -0700171 /** \brief detaches an entry from its current cleanup queue
172 * \warning if the entry is unattached, this will cause undefined behavior
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -0800173 */
Junxiao Shia9388182014-12-13 23:16:09 -0700174 void
175 detachQueue(TableIt it);
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -0800176
Junxiao Shia9388182014-12-13 23:16:09 -0700177 /** \brief moves an entry from FIFO queue to STALE queue
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -0800178 */
Junxiao Shia9388182014-12-13 23:16:09 -0700179 void
180 moveToStaleQueue(TableIt it);
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -0800181
Junxiao Shia9388182014-12-13 23:16:09 -0700182 /** \brief picks an entry for eviction
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -0800183 */
Junxiao Shia9388182014-12-13 23:16:09 -0700184 std::tuple<TableIt, std::string/*reason*/>
185 evictPick();
186
187 /** \brief evicts zero or more entries so that number of stored entries
188 * is not greater than capacity
189 */
190 void
191 evict();
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -0800192
193private:
Junxiao Shia9388182014-12-13 23:16:09 -0700194 size_t m_limit;
195 Table m_table;
Junxiao Shifc206962015-01-16 11:12:22 -0700196 Queue m_queues[QUEUE_MAX];
Junxiao Shi0fcb41e2014-01-24 10:29:43 -0700197};
198
Junxiao Shia9388182014-12-13 23:16:09 -0700199} // namespace cs
200
201using cs::Cs;
202
Alexander Afanasyev18bbf812014-01-29 01:40:23 -0800203} // namespace nfd
Alexander Afanasyevb927a3a2014-01-24 10:41:47 -0800204
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700205#endif // NFD_DAEMON_TABLE_CS_HPP