blob: a8cd68e4e86405550e07fee2925b0293cabac795 [file] [log] [blame]
Yingdi Yuf7ede412014-08-30 20:37:52 -07001/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
2/*
Ashlesh Gawande9a306fe2019-01-04 11:38:18 -06003 * Copyright (c) 2012-2019 University of California, Los Angeles
Yingdi Yuf7ede412014-08-30 20:37:52 -07004 *
5 * This file is part of ChronoSync, synchronization library for distributed realtime
6 * applications for NDN.
7 *
8 * ChronoSync is free software: you can redistribute it and/or modify it under the terms
9 * of the GNU General Public License as published by the Free Software Foundation, either
10 * version 3 of the License, or (at your option) any later version.
11 *
12 * ChronoSync is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
13 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14 * PURPOSE. See the GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * ChronoSync, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
18 *
19 * @author Zhenkai Zhu <http://irl.cs.ucla.edu/~zhenkai/>
20 * @author Chaoyi Bian <bcy@pku.edu.cn>
21 * @author Alexander Afanasyev <http://lasr.cs.ucla.edu/afanasyev/index.html>
22 * @author Yingdi Yu <yingdi@cs.ucla.edu>
Sonu Mishra0dadc572016-12-12 23:59:41 -080023 * @author Sonu Mishra <https://www.linkedin.com/in/mishrasonu>
Yingdi Yuf7ede412014-08-30 20:37:52 -070024 */
25
26#include "logic.hpp"
27#include "logger.hpp"
Alexander Afanasyev6ee98ff2018-02-13 19:12:28 -050028#include "bzip2-helper.hpp"
Yingdi Yuf7ede412014-08-30 20:37:52 -070029
Alexander Afanasyev89036292018-02-13 17:19:50 -050030#include <ndn-cxx/util/backports.hpp>
Ashlesh Gawande687cf922017-05-30 15:04:16 -050031#include <ndn-cxx/util/string-helper.hpp>
32
Alexander Afanasyev36eb3ed2017-01-11 12:35:58 -080033INIT_LOGGER(Logic);
Yingdi Yuf7ede412014-08-30 20:37:52 -070034
Yingdi Yuf7ede412014-08-30 20:37:52 -070035#define _LOG_DEBUG_ID(v) _LOG_DEBUG("Instance" << m_instanceId << ": " << v)
Yingdi Yuf7ede412014-08-30 20:37:52 -070036
37namespace chronosync {
38
Yingdi Yuf7ede412014-08-30 20:37:52 -070039const uint8_t EMPTY_DIGEST_VALUE[] = {
40 0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14,
41 0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24,
42 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c,
43 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55
44};
45
Ashlesh Gawande08784d42017-09-06 23:40:21 -050046int Logic::s_instanceCounter = 0;
Yingdi Yuf7ede412014-08-30 20:37:52 -070047
Yingdi Yucd339022014-11-05 17:51:19 -080048const ndn::Name Logic::DEFAULT_NAME;
Qiuhan Ding8c095fd2014-11-19 17:38:32 -080049const ndn::Name Logic::EMPTY_NAME;
Ashlesh Gawande08784d42017-09-06 23:40:21 -050050const std::shared_ptr<Validator> Logic::DEFAULT_VALIDATOR;
Yingdi Yuf7ede412014-08-30 20:37:52 -070051const time::steady_clock::Duration Logic::DEFAULT_RESET_TIMER = time::seconds(0);
52const time::steady_clock::Duration Logic::DEFAULT_CANCEL_RESET_TIMER = time::milliseconds(500);
53const time::milliseconds Logic::DEFAULT_RESET_INTEREST_LIFETIME(1000);
54const time::milliseconds Logic::DEFAULT_SYNC_INTEREST_LIFETIME(1000);
55const time::milliseconds Logic::DEFAULT_SYNC_REPLY_FRESHNESS(1000);
Sonu Mishra4d3a2e02017-01-18 20:27:51 -080056const time::milliseconds Logic::DEFAULT_RECOVERY_INTEREST_LIFETIME(1000);
Yingdi Yuf7ede412014-08-30 20:37:52 -070057
Ashlesh Gawande08784d42017-09-06 23:40:21 -050058const ConstBufferPtr Logic::EMPTY_DIGEST(new ndn::Buffer(EMPTY_DIGEST_VALUE, 32));
Yingdi Yuf7ede412014-08-30 20:37:52 -070059const ndn::name::Component Logic::RESET_COMPONENT("reset");
Sonu Mishra4d3a2e02017-01-18 20:27:51 -080060const ndn::name::Component Logic::RECOVERY_COMPONENT("recovery");
Yingdi Yuf7ede412014-08-30 20:37:52 -070061
Alexander Afanasyev89036292018-02-13 17:19:50 -050062const size_t NDNLP_EXPECTED_OVERHEAD = 20;
63
64/**
65 * Get maximum packet limit
66 *
67 * By default, it returns `ndn::MAX_NDN_PACKET_SIZE`.
68 * The returned value can be customized using the environment variable `CHRONOSYNC_MAX_PACKET_SIZE`,
69 * but the returned value will be at least 500 and no more than `ndn::MAX_NDN_PACKET_SIZE`.
70 */
71#ifndef CHRONOSYNC_HAVE_TESTS
72static
73#endif // CHRONOSYNC_HAVE_TESTS
74size_t
75getMaxPacketLimit()
76{
77 static size_t limit = 0;
78#ifndef CHRONOSYNC_HAVE_TESTS
79 if (limit != 0) {
80 return limit;
81 }
82#endif // CHRONOSYNC_HAVE_TESTS
83
84 if (getenv("CHRONOSYNC_MAX_PACKET_SIZE") != nullptr) {
85 try {
86 limit = ndn::clamp<size_t>(boost::lexical_cast<size_t>(getenv("CHRONOSYNC_MAX_PACKET_SIZE")),
87 500, ndn::MAX_NDN_PACKET_SIZE);
88 }
89 catch (const boost::bad_lexical_cast&) {
90 limit = ndn::MAX_NDN_PACKET_SIZE;
91 }
92 }
93 else {
94 limit = ndn::MAX_NDN_PACKET_SIZE;
95 }
96
97 return limit;
98}
99
Yingdi Yuf7ede412014-08-30 20:37:52 -0700100Logic::Logic(ndn::Face& face,
101 const Name& syncPrefix,
Qiuhan Ding8c095fd2014-11-19 17:38:32 -0800102 const Name& defaultUserPrefix,
Yingdi Yuf7ede412014-08-30 20:37:52 -0700103 const UpdateCallback& onUpdate,
Qiuhan Ding8c095fd2014-11-19 17:38:32 -0800104 const Name& defaultSigningId,
Ashlesh Gawande08784d42017-09-06 23:40:21 -0500105 std::shared_ptr<Validator> validator,
Yingdi Yuf7ede412014-08-30 20:37:52 -0700106 const time::steady_clock::Duration& resetTimer,
107 const time::steady_clock::Duration& cancelResetTimer,
108 const time::milliseconds& resetInterestLifetime,
109 const time::milliseconds& syncInterestLifetime,
Sonu Mishra4d3a2e02017-01-18 20:27:51 -0800110 const time::milliseconds& syncReplyFreshness,
Alexander Afanasyevbf5bc6c2018-02-19 11:26:09 -0500111 const time::milliseconds& recoveryInterestLifetime,
112 const name::Component& session)
Yingdi Yuf7ede412014-08-30 20:37:52 -0700113 : m_face(face)
114 , m_syncPrefix(syncPrefix)
Davide Pesaventod7de2d42019-08-01 20:55:50 -0400115 , m_syncReset(Name(syncPrefix).append("reset"))
Qiuhan Ding8c095fd2014-11-19 17:38:32 -0800116 , m_defaultUserPrefix(defaultUserPrefix)
Yingdi Yuf7ede412014-08-30 20:37:52 -0700117 , m_interestTable(m_face.getIoService())
Yingdi Yuf7ede412014-08-30 20:37:52 -0700118 , m_isInReset(false)
Davide Pesaventod7de2d42019-08-01 20:55:50 -0400119 , m_needPeriodReset(resetTimer > time::nanoseconds::zero())
Yingdi Yuf7ede412014-08-30 20:37:52 -0700120 , m_onUpdate(onUpdate)
121 , m_scheduler(m_face.getIoService())
Ashlesh Gawande9a306fe2019-01-04 11:38:18 -0600122 , m_rng(ndn::random::getRandomNumberEngine())
Ashlesh Gawande4a9ecd52018-02-06 14:36:19 -0600123 , m_rangeUniformRandom(100, 500)
124 , m_reexpressionJitter(100, 500)
Yingdi Yuf7ede412014-08-30 20:37:52 -0700125 , m_resetTimer(resetTimer)
126 , m_cancelResetTimer(cancelResetTimer)
127 , m_resetInterestLifetime(resetInterestLifetime)
128 , m_syncInterestLifetime(syncInterestLifetime)
129 , m_syncReplyFreshness(syncReplyFreshness)
Sonu Mishra4d3a2e02017-01-18 20:27:51 -0800130 , m_recoveryInterestLifetime(recoveryInterestLifetime)
Yingdi Yucd339022014-11-05 17:51:19 -0800131 , m_validator(validator)
Alexander Afanasyev90587b82018-02-11 20:36:53 -0500132 , m_instanceId(s_instanceCounter++)
Yingdi Yuf7ede412014-08-30 20:37:52 -0700133{
Yingdi Yuf7ede412014-08-30 20:37:52 -0700134 _LOG_DEBUG_ID(">> Logic::Logic");
Davide Pesaventod7de2d42019-08-01 20:55:50 -0400135 addUserNode(m_defaultUserPrefix, defaultSigningId, session, false);
Yingdi Yuf7ede412014-08-30 20:37:52 -0700136
137 _LOG_DEBUG_ID("Listen to: " << m_syncPrefix);
Junxiao Shi8e4e76d2019-02-08 15:25:08 -0700138 m_syncRegisteredPrefix = m_face.setInterestFilter(
139 ndn::InterestFilter(m_syncPrefix).allowLoopback(false),
140 bind(&Logic::onSyncInterest, this, _1, _2),
141 bind(&Logic::onSyncRegisterFailed, this, _1, _2));
Yingdi Yuf7ede412014-08-30 20:37:52 -0700142
Qiuhan Dinge246b622014-12-03 21:57:48 -0800143 sendSyncInterest();
Yingdi Yuf7ede412014-08-30 20:37:52 -0700144 _LOG_DEBUG_ID("<< Logic::Logic");
145}
146
147Logic::~Logic()
148{
Nick Gordon0b3beab2018-03-02 13:03:28 -0600149 _LOG_DEBUG_ID(">> Logic::~Logic");
Yingdi Yu9d5679a2015-02-01 00:17:58 -0800150 m_interestTable.clear();
Nick Gordon0b3beab2018-03-02 13:03:28 -0600151 m_scheduler.cancelAllEvents();
152 _LOG_DEBUG_ID("<< Logic::~Logic");
Yingdi Yuf7ede412014-08-30 20:37:52 -0700153}
154
155void
Qiuhan Dingfb8c9e02015-01-30 14:04:55 -0800156Logic::reset(bool isOnInterest)
Yingdi Yuf7ede412014-08-30 20:37:52 -0700157{
158 m_isInReset = true;
159
160 m_state.reset();
161 m_log.clear();
162
Qiuhan Dingfb8c9e02015-01-30 14:04:55 -0800163 if (!isOnInterest)
164 sendResetInterest();
Yingdi Yuf7ede412014-08-30 20:37:52 -0700165
Yingdi Yuf7ede412014-08-30 20:37:52 -0700166 sendSyncInterest();
167
Davide Pesaventod057cf12019-03-20 23:38:40 -0400168 m_delayedInterestProcessingId = m_scheduler.schedule(m_cancelResetTimer, [this] { cancelReset(); });
Yingdi Yuf7ede412014-08-30 20:37:52 -0700169}
170
171void
Qiuhan Ding8c095fd2014-11-19 17:38:32 -0800172Logic::setDefaultUserPrefix(const Name& defaultUserPrefix)
Yingdi Yuf7ede412014-08-30 20:37:52 -0700173{
Qiuhan Ding8c095fd2014-11-19 17:38:32 -0800174 if (defaultUserPrefix != EMPTY_NAME) {
175 if (m_nodeList.find(defaultUserPrefix) != m_nodeList.end()) {
176 m_defaultUserPrefix = defaultUserPrefix;
Qiuhan Ding8c095fd2014-11-19 17:38:32 -0800177 }
178 }
Yingdi Yuf7ede412014-08-30 20:37:52 -0700179}
180
181void
Davide Pesaventod7de2d42019-08-01 20:55:50 -0400182Logic::addUserNode(const Name& userPrefix, const Name& signingId, const name::Component& session, bool shouldSendReset)
Yingdi Yuf7ede412014-08-30 20:37:52 -0700183{
Qiuhan Ding8c095fd2014-11-19 17:38:32 -0800184 if (userPrefix == EMPTY_NAME)
Yingdi Yuf7ede412014-08-30 20:37:52 -0700185 return;
Qiuhan Ding8c095fd2014-11-19 17:38:32 -0800186 if (m_defaultUserPrefix == EMPTY_NAME) {
187 m_defaultUserPrefix = userPrefix;
Qiuhan Ding8c095fd2014-11-19 17:38:32 -0800188 }
189 if (m_nodeList.find(userPrefix) == m_nodeList.end()) {
190 m_nodeList[userPrefix].userPrefix = userPrefix;
191 m_nodeList[userPrefix].signingId = signingId;
192 Name sessionName = userPrefix;
Alexander Afanasyevbf5bc6c2018-02-19 11:26:09 -0500193 if (!session.empty()) {
194 sessionName.append(session);
195 }
196 else {
Davide Pesaventod7de2d42019-08-01 20:55:50 -0400197 sessionName.appendNumber(time::toUnixTimestamp(time::system_clock::now()).count());
Alexander Afanasyevbf5bc6c2018-02-19 11:26:09 -0500198 }
Qiuhan Ding8c095fd2014-11-19 17:38:32 -0800199 m_nodeList[userPrefix].sessionName = sessionName;
200 m_nodeList[userPrefix].seqNo = 0;
Davide Pesaventod7de2d42019-08-01 20:55:50 -0400201 reset(!shouldSendReset);
Qiuhan Ding8c095fd2014-11-19 17:38:32 -0800202 }
203}
Yingdi Yuf7ede412014-08-30 20:37:52 -0700204
Qiuhan Ding8c095fd2014-11-19 17:38:32 -0800205void
206Logic::removeUserNode(const Name& userPrefix)
207{
208 auto userNode = m_nodeList.find(userPrefix);
209 if (userNode != m_nodeList.end()) {
210 m_nodeList.erase(userNode);
211 if (m_defaultUserPrefix == userPrefix) {
212 if (!m_nodeList.empty()) {
213 m_defaultUserPrefix = m_nodeList.begin()->second.userPrefix;
Qiuhan Ding8c095fd2014-11-19 17:38:32 -0800214 }
215 else {
216 m_defaultUserPrefix = EMPTY_NAME;
Qiuhan Ding8c095fd2014-11-19 17:38:32 -0800217 }
Yingdi Yuf7ede412014-08-30 20:37:52 -0700218 }
Qiuhan Dingfb8c9e02015-01-30 14:04:55 -0800219 reset(false);
Qiuhan Ding8c095fd2014-11-19 17:38:32 -0800220 }
221}
Yingdi Yuf7ede412014-08-30 20:37:52 -0700222
Qiuhan Ding8c095fd2014-11-19 17:38:32 -0800223const Name&
224Logic::getSessionName(Name prefix)
225{
226 if (prefix == EMPTY_NAME)
227 prefix = m_defaultUserPrefix;
228 auto node = m_nodeList.find(prefix);
229 if (node != m_nodeList.end())
230 return node->second.sessionName;
231 else
Alexander Afanasyeve9eda8a2017-03-09 14:40:03 -0800232 BOOST_THROW_EXCEPTION(Error("Refer to non-existent node:" + prefix.toUri()));
Qiuhan Ding8c095fd2014-11-19 17:38:32 -0800233}
Yingdi Yuf7ede412014-08-30 20:37:52 -0700234
Qiuhan Ding8c095fd2014-11-19 17:38:32 -0800235const SeqNo&
236Logic::getSeqNo(Name prefix)
237{
238 if (prefix == EMPTY_NAME)
239 prefix = m_defaultUserPrefix;
240 auto node = m_nodeList.find(prefix);
241 if (node != m_nodeList.end())
242 return node->second.seqNo;
243 else
Alexander Afanasyeve9eda8a2017-03-09 14:40:03 -0800244 BOOST_THROW_EXCEPTION(Logic::Error("Refer to non-existent node:" + prefix.toUri()));
Yingdi Yuf7ede412014-08-30 20:37:52 -0700245
Qiuhan Ding8c095fd2014-11-19 17:38:32 -0800246}
247
248void
Alexander Afanasyeve9eda8a2017-03-09 14:40:03 -0800249Logic::updateSeqNo(const SeqNo& seqNo, const Name& updatePrefix)
Qiuhan Ding8c095fd2014-11-19 17:38:32 -0800250{
251 Name prefix;
252 if (updatePrefix == EMPTY_NAME) {
253 if (m_defaultUserPrefix == EMPTY_NAME)
254 return;
255 prefix = m_defaultUserPrefix;
256 }
257 else
258 prefix = updatePrefix;
259
260 auto it = m_nodeList.find(prefix);
261 if (it != m_nodeList.end()) {
262 NodeInfo& node = it->second;
263 _LOG_DEBUG_ID(">> Logic::updateSeqNo");
264 _LOG_DEBUG_ID("seqNo: " << seqNo << " m_seqNo: " << node.seqNo);
265 if (seqNo < node.seqNo || seqNo == 0)
266 return;
267
268 node.seqNo = seqNo;
269 _LOG_DEBUG_ID("updateSeqNo: m_seqNo " << node.seqNo);
270
271 if (!m_isInReset) {
272 _LOG_DEBUG_ID("updateSeqNo: not in Reset ");
Ashlesh Gawande08784d42017-09-06 23:40:21 -0500273 ConstBufferPtr previousRoot = m_state.getRootDigest();
Qiuhan Ding8c095fd2014-11-19 17:38:32 -0800274 {
Davide Pesavento5473abe2017-10-09 01:35:33 -0400275 std::string hash = ndn::toHex(previousRoot->data(), previousRoot->size(), false);
Qiuhan Ding8c095fd2014-11-19 17:38:32 -0800276 _LOG_DEBUG_ID("Hash: " << hash);
277 }
278
279 bool isInserted = false;
280 bool isUpdated = false;
281 SeqNo oldSeq;
Ashlesh Gawande08784d42017-09-06 23:40:21 -0500282 std::tie(isInserted, isUpdated, oldSeq) = m_state.update(node.sessionName, node.seqNo);
Qiuhan Ding8c095fd2014-11-19 17:38:32 -0800283
284 _LOG_DEBUG_ID("Insert: " << std::boolalpha << isInserted);
285 _LOG_DEBUG_ID("Updated: " << std::boolalpha << isUpdated);
286 if (isInserted || isUpdated) {
287 DiffStatePtr commit = make_shared<DiffState>();
288 commit->update(node.sessionName, node.seqNo);
289 commit->setRootDigest(m_state.getRootDigest());
290 insertToDiffLog(commit, previousRoot);
291
292 satisfyPendingSyncInterests(prefix, commit);
Alexander Afanasyevfcbf81d2018-02-19 10:25:46 -0500293 // formAndSendExcludeInterest(prefix, *commit, previousRoot);
Qiuhan Ding8c095fd2014-11-19 17:38:32 -0800294 }
Yingdi Yuf7ede412014-08-30 20:37:52 -0700295 }
296 }
297}
298
299ConstBufferPtr
300Logic::getRootDigest() const
301{
302 return m_state.getRootDigest();
303}
304
305void
306Logic::printState(std::ostream& os) const
307{
Nick Gordon0b3beab2018-03-02 13:03:28 -0600308 for (const auto& leaf : m_state.getLeaves()) {
309 os << *leaf << "\n";
310 }
Yingdi Yuf7ede412014-08-30 20:37:52 -0700311}
312
313std::set<Name>
314Logic::getSessionNames() const
315{
316 std::set<Name> sessionNames;
Nick Gordon0b3beab2018-03-02 13:03:28 -0600317 for (const auto& leaf : m_state.getLeaves()) {
318 sessionNames.insert(leaf->getSessionName());
319 }
Yingdi Yuf7ede412014-08-30 20:37:52 -0700320 return sessionNames;
321}
322
323void
324Logic::onSyncInterest(const Name& prefix, const Interest& interest)
325{
326 _LOG_DEBUG_ID(">> Logic::onSyncInterest");
327 Name name = interest.getName();
328
329 _LOG_DEBUG_ID("InterestName: " << name);
330
Sonu Mishra4d3a2e02017-01-18 20:27:51 -0800331 if (name.size() >= 1 && RESET_COMPONENT == name.get(-1)) {
332 processResetInterest(interest);
333 }
334 else if (name.size() >= 2 && RECOVERY_COMPONENT == name.get(-2)) {
335 processRecoveryInterest(interest);
336 }
Ashlesh Gawande1d1092d2018-08-03 14:36:49 -0500337 else {
Ashlesh Gawande08784d42017-09-06 23:40:21 -0500338 processSyncInterest(interest);
Yingdi Yuf7ede412014-08-30 20:37:52 -0700339 }
Yingdi Yuf7ede412014-08-30 20:37:52 -0700340
341 _LOG_DEBUG_ID("<< Logic::onSyncInterest");
342}
343
344void
345Logic::onSyncRegisterFailed(const Name& prefix, const std::string& msg)
346{
347 //Sync prefix registration failed
348 _LOG_DEBUG_ID(">> Logic::onSyncRegisterFailed");
349}
350
351void
Alexander Afanasyeve9eda8a2017-03-09 14:40:03 -0800352Logic::onSyncData(const Interest& interest, const Data& data)
Yingdi Yuf7ede412014-08-30 20:37:52 -0700353{
354 _LOG_DEBUG_ID(">> Logic::onSyncData");
Ashlesh Gawande1d1092d2018-08-03 14:36:49 -0500355 if (m_validator != nullptr)
356 m_validator->validate(data,
357 bind(&Logic::onSyncDataValidated, this, _1),
358 bind(&Logic::onSyncDataValidationFailed, this, _1));
359 else
360 onSyncDataValidated(data);
Sonu Mishraf42aa2c2017-01-22 18:47:33 -0800361
Yingdi Yuf7ede412014-08-30 20:37:52 -0700362 _LOG_DEBUG_ID("<< Logic::onSyncData");
363}
364
365void
Alexander Afanasyeve9eda8a2017-03-09 14:40:03 -0800366Logic::onResetData(const Interest& interest, const Data& data)
Yingdi Yuf7ede412014-08-30 20:37:52 -0700367{
368 // This should not happened, drop the received data.
369}
370
371void
Ashlesh Gawandea1ad6042019-10-07 15:56:11 -0500372Logic::onSyncNack(const Interest& interest, const ndn::lp::Nack& nack)
373{
374 _LOG_DEBUG_ID(">> Logic::onSyncNack");
375 if (nack.getReason() == ndn::lp::NackReason::NO_ROUTE) {
376 auto after = ndn::time::milliseconds(m_reexpressionJitter(m_rng));
377 _LOG_DEBUG_ID("Schedule sync interest after: " << after);
378 m_scheduler.schedule(after, [this] { sendSyncInterest(); });
379 }
380 _LOG_DEBUG_ID("<< Logic::onSyncNack");
381}
382
383void
Yingdi Yuf7ede412014-08-30 20:37:52 -0700384Logic::onSyncTimeout(const Interest& interest)
385{
386 // It is OK. Others will handle the time out situation.
387 _LOG_DEBUG_ID(">> Logic::onSyncTimeout");
388 _LOG_DEBUG_ID("Interest: " << interest.getName());
389 _LOG_DEBUG_ID("<< Logic::onSyncTimeout");
390}
391
392void
Ashlesh Gawande08784d42017-09-06 23:40:21 -0500393Logic::onSyncDataValidationFailed(const Data& data)
Yingdi Yuf7ede412014-08-30 20:37:52 -0700394{
395 // SyncReply cannot be validated.
396}
397
398void
Ashlesh Gawande1d1092d2018-08-03 14:36:49 -0500399Logic::onSyncDataValidated(const Data& data)
Yingdi Yuf7ede412014-08-30 20:37:52 -0700400{
Ashlesh Gawande08784d42017-09-06 23:40:21 -0500401 Name name = data.getName();
Yingdi Yuf7ede412014-08-30 20:37:52 -0700402 ConstBufferPtr digest = make_shared<ndn::Buffer>(name.get(-1).value(), name.get(-1).value_size());
403
Alexander Afanasyevfcbf81d2018-02-19 10:25:46 -0500404 try {
405 auto contentBuffer = bzip2::decompress(reinterpret_cast<const char*>(data.getContent().value()),
406 data.getContent().value_size());
Ashlesh Gawande1d1092d2018-08-03 14:36:49 -0500407 processSyncData(name, digest, Block(std::move(contentBuffer)));
Alexander Afanasyevfcbf81d2018-02-19 10:25:46 -0500408 }
409 catch (const std::ios_base::failure& error) {
410 _LOG_WARN("Error decompressing content of " << data.getName() << " (" << error.what() << ")");
411 }
Yingdi Yuf7ede412014-08-30 20:37:52 -0700412}
413
414void
Ashlesh Gawande08784d42017-09-06 23:40:21 -0500415Logic::processSyncInterest(const Interest& interest, bool isTimedProcessing/*=false*/)
Yingdi Yuf7ede412014-08-30 20:37:52 -0700416{
417 _LOG_DEBUG_ID(">> Logic::processSyncInterest");
418
Ashlesh Gawande08784d42017-09-06 23:40:21 -0500419 Name name = interest.getName();
420 ConstBufferPtr digest = make_shared<ndn::Buffer>(name.get(-1).value(), name.get(-1).value_size());
Yingdi Yuf7ede412014-08-30 20:37:52 -0700421
422 ConstBufferPtr rootDigest = m_state.getRootDigest();
423
424 // If the digest of the incoming interest is the same as root digest
425 // Put the interest into InterestTable
426 if (*rootDigest == *digest) {
427 _LOG_DEBUG_ID("Oh, we are in the same state");
428 m_interestTable.insert(interest, digest, false);
429
430 if (!m_isInReset)
431 return;
432
433 if (!isTimedProcessing) {
434 _LOG_DEBUG_ID("Non timed processing in reset");
435 // Still in reset, our own seq has not been put into state yet
436 // Do not hurry, some others may be also resetting and may send their reply
Ashlesh Gawande4a9ecd52018-02-06 14:36:19 -0600437 time::milliseconds after(m_rangeUniformRandom(m_rng));
Yingdi Yuf7ede412014-08-30 20:37:52 -0700438 _LOG_DEBUG_ID("After: " << after);
Davide Pesaventod057cf12019-03-20 23:38:40 -0400439 m_delayedInterestProcessingId = m_scheduler.schedule(after,
440 [=] { processSyncInterest(interest, true); });
Yingdi Yuf7ede412014-08-30 20:37:52 -0700441 }
442 else {
443 _LOG_DEBUG_ID("Timed processing in reset");
444 // Now we can get out of reset state by putting our own stuff into m_state.
445 cancelReset();
446 }
447
448 return;
449 }
450
451 // If the digest of incoming interest is an "empty" digest
Sonu Mishrae10acbc2017-01-18 14:14:05 -0800452 if (*digest == *EMPTY_DIGEST) {
Yingdi Yuf7ede412014-08-30 20:37:52 -0700453 _LOG_DEBUG_ID("Poor guy, he knows nothing");
Qiuhan Ding8c095fd2014-11-19 17:38:32 -0800454 sendSyncData(m_defaultUserPrefix, name, m_state);
Yingdi Yuf7ede412014-08-30 20:37:52 -0700455 return;
456 }
457
458 DiffStateContainer::iterator stateIter = m_log.find(digest);
459 // If the digest of incoming interest can be found from the log
460 if (stateIter != m_log.end()) {
461 _LOG_DEBUG_ID("It is ok, you are so close");
Qiuhan Ding8c095fd2014-11-19 17:38:32 -0800462 sendSyncData(m_defaultUserPrefix, name, *(*stateIter)->diff());
Yingdi Yuf7ede412014-08-30 20:37:52 -0700463 return;
464 }
465
466 if (!isTimedProcessing) {
467 _LOG_DEBUG_ID("Let's wait, just wait for a while");
468 // Do not hurry, some incoming SyncReplies may help us to recognize the digest
Yingdi Yu53f5f042015-01-31 16:33:25 -0800469 m_interestTable.insert(interest, digest, true);
Yingdi Yuf7ede412014-08-30 20:37:52 -0700470
471 m_delayedInterestProcessingId =
Davide Pesaventod057cf12019-03-20 23:38:40 -0400472 m_scheduler.schedule(time::milliseconds(m_rangeUniformRandom(m_rng)),
473 [=] { processSyncInterest(interest, true); });
Yingdi Yuf7ede412014-08-30 20:37:52 -0700474 }
475 else {
476 // OK, nobody is helping us, just tell the truth.
Sonu Mishra4d3a2e02017-01-18 20:27:51 -0800477 _LOG_DEBUG_ID("OK, nobody is helping us, let us try to recover");
Yingdi Yuf7ede412014-08-30 20:37:52 -0700478 m_interestTable.erase(digest);
Sonu Mishra4d3a2e02017-01-18 20:27:51 -0800479 sendRecoveryInterest(digest);
Yingdi Yuf7ede412014-08-30 20:37:52 -0700480 }
481
482 _LOG_DEBUG_ID("<< Logic::processSyncInterest");
483}
484
485void
486Logic::processResetInterest(const Interest& interest)
487{
488 _LOG_DEBUG_ID(">> Logic::processResetInterest");
Qiuhan Dingfb8c9e02015-01-30 14:04:55 -0800489 reset(true);
Yingdi Yuf7ede412014-08-30 20:37:52 -0700490}
491
492void
493Logic::processSyncData(const Name& name,
Ashlesh Gawande08784d42017-09-06 23:40:21 -0500494 ConstBufferPtr digest,
Ashlesh Gawande1d1092d2018-08-03 14:36:49 -0500495 const Block& syncReplyBlock)
Yingdi Yuf7ede412014-08-30 20:37:52 -0700496{
497 _LOG_DEBUG_ID(">> Logic::processSyncData");
Yingdi Yuf7ede412014-08-30 20:37:52 -0700498 DiffStatePtr commit = make_shared<DiffState>();
Ashlesh Gawande08784d42017-09-06 23:40:21 -0500499 ConstBufferPtr previousRoot = m_state.getRootDigest();
Yingdi Yuf7ede412014-08-30 20:37:52 -0700500
501 try {
502 m_interestTable.erase(digest); // Remove satisfied interest from PIT
503
504 State reply;
505 reply.wireDecode(syncReplyBlock);
506
507 std::vector<MissingDataInfo> v;
Davide Pesaventod057cf12019-03-20 23:38:40 -0400508 BOOST_FOREACH(ConstLeafPtr leaf, reply.getLeaves().get<ordered>()) {
509 BOOST_ASSERT(leaf != nullptr);
Yingdi Yuf7ede412014-08-30 20:37:52 -0700510
Davide Pesaventod057cf12019-03-20 23:38:40 -0400511 const Name& info = leaf->getSessionName();
512 SeqNo seq = leaf->getSeq();
Yingdi Yuf7ede412014-08-30 20:37:52 -0700513
Davide Pesaventod057cf12019-03-20 23:38:40 -0400514 bool isInserted = false;
515 bool isUpdated = false;
516 SeqNo oldSeq;
517 std::tie(isInserted, isUpdated, oldSeq) = m_state.update(info, seq);
518 if (isInserted || isUpdated) {
519 commit->update(info, seq);
Yingdi Yuf7ede412014-08-30 20:37:52 -0700520
Davide Pesaventod057cf12019-03-20 23:38:40 -0400521 oldSeq++;
522 MissingDataInfo mdi = {info, oldSeq, seq};
523 v.push_back(mdi);
Yingdi Yuf7ede412014-08-30 20:37:52 -0700524 }
Davide Pesaventod057cf12019-03-20 23:38:40 -0400525 }
Yingdi Yuf7ede412014-08-30 20:37:52 -0700526
527 if (!v.empty()) {
528 m_onUpdate(v);
529
530 commit->setRootDigest(m_state.getRootDigest());
531 insertToDiffLog(commit, previousRoot);
532 }
533 else {
534 _LOG_DEBUG_ID("What? nothing new");
535 }
536 }
Alexander Afanasyeve9eda8a2017-03-09 14:40:03 -0800537 catch (const State::Error&) {
Yingdi Yuf7ede412014-08-30 20:37:52 -0700538 _LOG_DEBUG_ID("Something really fishy happened during state decoding");
539 // Something really fishy happened during state decoding;
540 commit.reset();
541 return;
542 }
543
Ashlesh Gawande1d1092d2018-08-03 14:36:49 -0500544 if (static_cast<bool>(commit) && !commit->getLeaves().empty()) {
Yingdi Yuf7ede412014-08-30 20:37:52 -0700545 // state changed and it is safe to express a new interest
Junxiao Shic4902122019-02-08 15:13:50 -0700546 auto after = time::milliseconds(m_reexpressionJitter(m_rng));
Yingdi Yuf7ede412014-08-30 20:37:52 -0700547 _LOG_DEBUG_ID("Reschedule sync interest after: " << after);
Davide Pesaventod057cf12019-03-20 23:38:40 -0400548 m_reexpressingInterestId = m_scheduler.schedule(after, [this] { sendSyncInterest(); });
Yingdi Yuf7ede412014-08-30 20:37:52 -0700549 }
550}
551
552void
Qiuhan Ding8c095fd2014-11-19 17:38:32 -0800553Logic::satisfyPendingSyncInterests(const Name& updatedPrefix, ConstDiffStatePtr commit)
Yingdi Yuf7ede412014-08-30 20:37:52 -0700554{
555 _LOG_DEBUG_ID(">> Logic::satisfyPendingSyncInterests");
556 try {
557 _LOG_DEBUG_ID("InterestTable size: " << m_interestTable.size());
Ashlesh Gawande08784d42017-09-06 23:40:21 -0500558 auto it = m_interestTable.begin();
559 while (it != m_interestTable.end()) {
Yingdi Yuf7ede412014-08-30 20:37:52 -0700560 ConstUnsatisfiedInterestPtr request = *it;
Ashlesh Gawande08784d42017-09-06 23:40:21 -0500561 ++it;
Yingdi Yuf7ede412014-08-30 20:37:52 -0700562 if (request->isUnknown)
Ashlesh Gawande08784d42017-09-06 23:40:21 -0500563 sendSyncData(updatedPrefix, request->interest.getName(), m_state);
Yingdi Yuf7ede412014-08-30 20:37:52 -0700564 else
Ashlesh Gawande08784d42017-09-06 23:40:21 -0500565 sendSyncData(updatedPrefix, request->interest.getName(), *commit);
Yingdi Yuf7ede412014-08-30 20:37:52 -0700566 }
567 m_interestTable.clear();
568 }
Alexander Afanasyeve9eda8a2017-03-09 14:40:03 -0800569 catch (const InterestTable::Error&) {
Yingdi Yuf7ede412014-08-30 20:37:52 -0700570 // ok. not really an error
571 }
572 _LOG_DEBUG_ID("<< Logic::satisfyPendingSyncInterests");
573}
574
575void
Ashlesh Gawande08784d42017-09-06 23:40:21 -0500576Logic::insertToDiffLog(DiffStatePtr commit, ConstBufferPtr previousRoot)
Yingdi Yuf7ede412014-08-30 20:37:52 -0700577{
578 _LOG_DEBUG_ID(">> Logic::insertToDiffLog");
579 // Connect to the history
580 if (!m_log.empty())
581 (*m_log.find(previousRoot))->setNext(commit);
582
583 // Insert the commit
584 m_log.erase(commit->getRootDigest());
585 m_log.insert(commit);
586 _LOG_DEBUG_ID("<< Logic::insertToDiffLog");
587}
588
589void
590Logic::sendResetInterest()
591{
592 _LOG_DEBUG_ID(">> Logic::sendResetInterest");
593
594 if (m_needPeriodReset) {
595 _LOG_DEBUG_ID("Need Period Reset");
596 _LOG_DEBUG_ID("ResetTimer: " << m_resetTimer);
597
Davide Pesaventod7de2d42019-08-01 20:55:50 -0400598 m_resetInterestId = m_scheduler.schedule(m_resetTimer + time::milliseconds(m_reexpressionJitter(m_rng)),
Davide Pesaventod057cf12019-03-20 23:38:40 -0400599 [this] { sendResetInterest(); });
Yingdi Yuf7ede412014-08-30 20:37:52 -0700600 }
601
602 Interest interest(m_syncReset);
603 interest.setMustBeFresh(true);
Ashlesh Gawande1d1092d2018-08-03 14:36:49 -0500604 interest.setCanBePrefix(false); // no data is expected
Yingdi Yuf7ede412014-08-30 20:37:52 -0700605 interest.setInterestLifetime(m_resetInterestLifetime);
Junxiao Shi8e4e76d2019-02-08 15:25:08 -0700606
607 // Assigning to m_pendingResetInterest cancels the previous reset Interest.
608 // This is harmless since no Data is expected.
609 m_pendingResetInterest = m_face.expressInterest(interest,
Nick Gordon0b3beab2018-03-02 13:03:28 -0600610 bind(&Logic::onResetData, this, _1, _2),
611 bind(&Logic::onSyncTimeout, this, _1), // Nack
612 bind(&Logic::onSyncTimeout, this, _1));
Yingdi Yuf7ede412014-08-30 20:37:52 -0700613 _LOG_DEBUG_ID("<< Logic::sendResetInterest");
614}
615
616void
617Logic::sendSyncInterest()
618{
619 _LOG_DEBUG_ID(">> Logic::sendSyncInterest");
620
621 Name interestName;
622 interestName.append(m_syncPrefix)
623 .append(ndn::name::Component(*m_state.getRootDigest()));
624
Junxiao Shi8e4e76d2019-02-08 15:25:08 -0700625 m_pendingSyncInterestName = interestName;
Yingdi Yuf7ede412014-08-30 20:37:52 -0700626
627#ifdef _DEBUG
628 printDigest(m_state.getRootDigest());
629#endif
630
Davide Pesaventod057cf12019-03-20 23:38:40 -0400631 m_reexpressingInterestId = m_scheduler.schedule(m_syncInterestLifetime / 2 +
Davide Pesaventod7de2d42019-08-01 20:55:50 -0400632 time::milliseconds(m_reexpressionJitter(m_rng)),
Davide Pesaventod057cf12019-03-20 23:38:40 -0400633 [this] { sendSyncInterest(); });
Yingdi Yuf7ede412014-08-30 20:37:52 -0700634
635 Interest interest(interestName);
636 interest.setMustBeFresh(true);
Ashlesh Gawande1d1092d2018-08-03 14:36:49 -0500637 interest.setCanBePrefix(true);
Yingdi Yuf7ede412014-08-30 20:37:52 -0700638 interest.setInterestLifetime(m_syncInterestLifetime);
639
Junxiao Shi8e4e76d2019-02-08 15:25:08 -0700640 m_pendingSyncInterest = m_face.expressInterest(interest,
641 bind(&Logic::onSyncData, this, _1, _2),
Ashlesh Gawandea1ad6042019-10-07 15:56:11 -0500642 bind(&Logic::onSyncNack, this, _1, _2),
Junxiao Shi8e4e76d2019-02-08 15:25:08 -0700643 bind(&Logic::onSyncTimeout, this, _1));
Yingdi Yuf7ede412014-08-30 20:37:52 -0700644
645 _LOG_DEBUG_ID("Send interest: " << interest.getName());
646 _LOG_DEBUG_ID("<< Logic::sendSyncInterest");
647}
648
649void
Alexander Afanasyev6ee98ff2018-02-13 19:12:28 -0500650Logic::trimState(State& partialState, const State& state, size_t nExcludedStates)
Ashlesh Gawande4a9ecd52018-02-06 14:36:19 -0600651{
652 partialState.reset();
Alexander Afanasyev6ee98ff2018-02-13 19:12:28 -0500653
Ashlesh Gawande4a9ecd52018-02-06 14:36:19 -0600654 std::vector<ConstLeafPtr> leaves;
655 for (const ConstLeafPtr& leaf : state.getLeaves()) {
656 leaves.push_back(leaf);
657 }
658
659 std::shuffle(leaves.begin(), leaves.end(), m_rng);
660
Alexander Afanasyev6ee98ff2018-02-13 19:12:28 -0500661 size_t statesToEncode = leaves.size() - std::min(leaves.size() - 1, nExcludedStates);
Ashlesh Gawande4a9ecd52018-02-06 14:36:19 -0600662 for (const auto& constLeafPtr : leaves) {
Alexander Afanasyev6ee98ff2018-02-13 19:12:28 -0500663 if (statesToEncode == 0) {
Ashlesh Gawande4a9ecd52018-02-06 14:36:19 -0600664 break;
665 }
666 partialState.update(constLeafPtr->getSessionName(), constLeafPtr->getSeq());
Alexander Afanasyev6ee98ff2018-02-13 19:12:28 -0500667 --statesToEncode;
Ashlesh Gawande4a9ecd52018-02-06 14:36:19 -0600668 }
669}
670
Alexander Afanasyev6ee98ff2018-02-13 19:12:28 -0500671Data
672Logic::encodeSyncReply(const Name& nodePrefix, const Name& name, const State& state)
673{
674 Data syncReply(name);
675 syncReply.setFreshnessPeriod(m_syncReplyFreshness);
676
677 auto finalizeReply = [this, &nodePrefix, &syncReply] (const State& state) {
678 auto contentBuffer = bzip2::compress(reinterpret_cast<const char*>(state.wireEncode().wire()),
679 state.wireEncode().size());
680 syncReply.setContent(contentBuffer);
681
682 if (m_nodeList[nodePrefix].signingId.empty())
683 m_keyChain.sign(syncReply);
684 else
685 m_keyChain.sign(syncReply, security::signingByIdentity(m_nodeList[nodePrefix].signingId));
686 };
687
688 finalizeReply(state);
689
690 size_t nExcludedStates = 1;
691 while (syncReply.wireEncode().size() > getMaxPacketLimit() - NDNLP_EXPECTED_OVERHEAD) {
692 if (nExcludedStates == 1) {
693 // To show this debug message only once
694 _LOG_DEBUG("Sync reply size exceeded maximum packet limit (" << (getMaxPacketLimit() - NDNLP_EXPECTED_OVERHEAD) << ")");
695 }
696 State partialState;
697 trimState(partialState, state, nExcludedStates);
698 finalizeReply(partialState);
699
700 BOOST_ASSERT(state.getLeaves().size() != 0);
701 nExcludedStates *= 2;
702 }
703
704 return syncReply;
705}
706
Ashlesh Gawande4a9ecd52018-02-06 14:36:19 -0600707void
Qiuhan Ding8c095fd2014-11-19 17:38:32 -0800708Logic::sendSyncData(const Name& nodePrefix, const Name& name, const State& state)
Yingdi Yuf7ede412014-08-30 20:37:52 -0700709{
710 _LOG_DEBUG_ID(">> Logic::sendSyncData");
Ashlesh Gawande4a9ecd52018-02-06 14:36:19 -0600711 if (m_nodeList.find(nodePrefix) == m_nodeList.end())
712 return;
713
Alexander Afanasyev6ee98ff2018-02-13 19:12:28 -0500714 m_face.put(encodeSyncReply(nodePrefix, name, state));
Yingdi Yuf7ede412014-08-30 20:37:52 -0700715
716 // checking if our own interest got satisfied
Junxiao Shi8e4e76d2019-02-08 15:25:08 -0700717 if (m_pendingSyncInterestName == name) {
Yingdi Yuf7ede412014-08-30 20:37:52 -0700718 // remove outstanding interest
Junxiao Shi8e4e76d2019-02-08 15:25:08 -0700719 m_pendingSyncInterest.cancel();
Yingdi Yuf7ede412014-08-30 20:37:52 -0700720
721 // re-schedule sending Sync interest
Ashlesh Gawande4a9ecd52018-02-06 14:36:19 -0600722 time::milliseconds after(m_reexpressionJitter(m_rng));
Yingdi Yuf7ede412014-08-30 20:37:52 -0700723 _LOG_DEBUG_ID("Satisfy our own interest");
724 _LOG_DEBUG_ID("Reschedule sync interest after " << after);
Davide Pesaventod057cf12019-03-20 23:38:40 -0400725 m_reexpressingInterestId = m_scheduler.schedule(after, [this] { sendSyncInterest(); });
Yingdi Yuf7ede412014-08-30 20:37:52 -0700726 }
727 _LOG_DEBUG_ID("<< Logic::sendSyncData");
728}
729
730void
731Logic::cancelReset()
732{
733 _LOG_DEBUG_ID(">> Logic::cancelReset");
734 if (!m_isInReset)
735 return;
736
737 m_isInReset = false;
Qiuhan Ding8c095fd2014-11-19 17:38:32 -0800738 for (const auto& node : m_nodeList) {
739 updateSeqNo(node.second.seqNo, node.first);
740 }
Yingdi Yuf7ede412014-08-30 20:37:52 -0700741 _LOG_DEBUG_ID("<< Logic::cancelReset");
742}
743
744void
Ashlesh Gawande08784d42017-09-06 23:40:21 -0500745Logic::printDigest(ConstBufferPtr digest)
Yingdi Yuf7ede412014-08-30 20:37:52 -0700746{
Davide Pesavento5473abe2017-10-09 01:35:33 -0400747 std::string hash = ndn::toHex(digest->data(), digest->size(), false);
Yingdi Yuf7ede412014-08-30 20:37:52 -0700748 _LOG_DEBUG_ID("Hash: " << hash);
749}
750
Sonu Mishra4d3a2e02017-01-18 20:27:51 -0800751void
Ashlesh Gawande08784d42017-09-06 23:40:21 -0500752Logic::sendRecoveryInterest(ConstBufferPtr digest)
Sonu Mishra4d3a2e02017-01-18 20:27:51 -0800753{
754 _LOG_DEBUG_ID(">> Logic::sendRecoveryInterest");
755
756 Name interestName;
757 interestName.append(m_syncPrefix)
758 .append(RECOVERY_COMPONENT)
759 .append(ndn::name::Component(*digest));
760
761 Interest interest(interestName);
762 interest.setMustBeFresh(true);
Ashlesh Gawande1d1092d2018-08-03 14:36:49 -0500763 interest.setCanBePrefix(true);
Sonu Mishra4d3a2e02017-01-18 20:27:51 -0800764 interest.setInterestLifetime(m_recoveryInterestLifetime);
765
Junxiao Shi8e4e76d2019-02-08 15:25:08 -0700766 m_pendingRecoveryInterests[interestName[-1].toUri()] = m_face.expressInterest(interest,
Nick Gordon0b3beab2018-03-02 13:03:28 -0600767 bind(&Logic::onRecoveryData, this, _1, _2),
768 bind(&Logic::onRecoveryTimeout, this, _1), // Nack
769 bind(&Logic::onRecoveryTimeout, this, _1));
Sonu Mishra4d3a2e02017-01-18 20:27:51 -0800770 _LOG_DEBUG_ID("interest: " << interest.getName());
771 _LOG_DEBUG_ID("<< Logic::sendRecoveryInterest");
772}
773
774void
775Logic::processRecoveryInterest(const Interest& interest)
776{
777 _LOG_DEBUG_ID(">> Logic::processRecoveryInterest");
778
Ashlesh Gawande08784d42017-09-06 23:40:21 -0500779 Name name = interest.getName();
Sonu Mishra4d3a2e02017-01-18 20:27:51 -0800780 ConstBufferPtr digest = make_shared<ndn::Buffer>(name.get(-1).value(), name.get(-1).value_size());
781
782 ConstBufferPtr rootDigest = m_state.getRootDigest();
783
784 DiffStateContainer::iterator stateIter = m_log.find(digest);
785
786 if (stateIter != m_log.end() || *digest == *EMPTY_DIGEST || *rootDigest == *digest) {
787 _LOG_DEBUG_ID("I can help you recover");
788 sendSyncData(m_defaultUserPrefix, name, m_state);
789 return;
790 }
791 _LOG_DEBUG_ID("<< Logic::processRecoveryInterest");
792}
793
794void
Alexander Afanasyeve9eda8a2017-03-09 14:40:03 -0800795Logic::onRecoveryData(const Interest& interest, const Data& data)
Sonu Mishra4d3a2e02017-01-18 20:27:51 -0800796{
797 _LOG_DEBUG_ID(">> Logic::onRecoveryData");
Junxiao Shi8e4e76d2019-02-08 15:25:08 -0700798 m_pendingRecoveryInterests.erase(interest.getName()[-1].toUri());
Ashlesh Gawande08784d42017-09-06 23:40:21 -0500799 onSyncDataValidated(data);
Sonu Mishra4d3a2e02017-01-18 20:27:51 -0800800 _LOG_DEBUG_ID("<< Logic::onRecoveryData");
801}
802
803void
804Logic::onRecoveryTimeout(const Interest& interest)
805{
806 _LOG_DEBUG_ID(">> Logic::onRecoveryTimeout");
Junxiao Shi8e4e76d2019-02-08 15:25:08 -0700807 m_pendingRecoveryInterests.erase(interest.getName()[-1].toUri());
Sonu Mishra4d3a2e02017-01-18 20:27:51 -0800808 _LOG_DEBUG_ID("Interest: " << interest.getName());
809 _LOG_DEBUG_ID("<< Logic::onRecoveryTimeout");
810}
811
Alexander Afanasyeve9eda8a2017-03-09 14:40:03 -0800812} // namespace chronosync