32 const ndn::time::seconds lsaDeletionTimepoint)
33 : m_scheduler(scheduler)
34 , m_lsaDeletionTimepoint(lsaDeletionTimepoint)
41 fetcher.afterSegmentValidated.connect(std::bind(&LsaSegmentStorage::afterFetcherSignalEmitted,
48 ndn::Name lsaSegmentsKey = interest.getName();
52 if (lsaSegmentsKey.size() > 0) {
53 if (!lsaSegmentsKey.get(-1).isSegment()) {
54 lsaSegmentsKey.appendSegment(0);
57 auto it = m_lsaSegments.find(lsaSegmentsKey);
58 if (it == m_lsaSegments.end()) {
59 NLSR_LOG_TRACE(
"Data for interest: " << interest.getName() <<
" cannot be found in the lsa storage");
64 NLSR_LOG_TRACE(
"Data for interest: " << interest.getName() <<
" is in the storage.");
75 LsaSegmentStorage::afterFetcherSignalEmitted(
const ndn::Data& lsaSegment)
77 NLSR_LOG_TRACE(
"Received a LSA segment: " << lsaSegment.getName());
80 auto lsaSegmentName = lsaSegment.getName();
82 if (lsaSegmentName.size() > 0) {
84 ndn::Name lsaSegmentsKey(lsaSegmentName.getPrefix(lsaSegmentName.size() - 2));
85 lsaSegmentsKey.append(lsaSegmentName.get(-1));
88 if (m_lsaSegments.find(lsaSegmentsKey) == m_lsaSegments.end()) {
89 NLSR_LOG_TRACE(
"Received LSA segment is new. Storing it in the storage.\n" 90 <<
" LSA data name: " << lsaSegmentName);
93 deleteOldLsas(lsaSegmentName);
95 m_lsaSegments[lsaSegmentsKey] = lsaSegment;
102 scheduleLsaSegmentDeletion(lsaSegmentsKey);
110 LsaSegmentStorage::deleteOldLsas(
const ndn::Name& newLsaName)
112 auto newLsaKey = newLsaName.getPrefix(newLsaName.size() - 3);
113 auto newSeqNo = newLsaName.get(-3).toNumber();
115 std::vector<decltype(m_lsaSegments)::key_type> lsaToDelete;
117 for (
auto& segment : m_lsaSegments) {
118 ndn::Name segmentKey = segment.first;
119 auto oldSeqNo = segmentKey.get(-2).toNumber();
120 auto existingLsaKey = segmentKey.getPrefix(segmentKey.size() - 2);
122 if (newLsaKey == existingLsaKey) {
123 if (newSeqNo > oldSeqNo) {
124 NLSR_LOG_TRACE(
"Outdated LSA: " << segmentKey <<
" with seq no: " <<
125 oldSeqNo <<
" is deleted.");
126 lsaToDelete.push_back(segmentKey);
131 for (
auto& segmentKey : lsaToDelete) {
132 m_lsaSegments.erase(segmentKey);
137 LsaSegmentStorage::scheduleLsaSegmentDeletion(
const ndn::Name& lsaSegmentsKey)
139 m_scheduler.scheduleEvent(m_lsaDeletionTimepoint,
141 m_lsaSegments.erase(lsaSegmentsKey);
Copyright (c) 2014-2018, The University of Memphis, Regents of the University of California.
#define INIT_LOGGER(name)
void connectToFetcher(ndn::util::SegmentFetcher &fetcher)
Get connected to the signal emitted by SegmentFetcher.
LsaSegmentStorage(ndn::Scheduler &scheduler, const ndn::time::seconds lsaDeletionTimepoint)
const ndn::Data * getLsaSegment(const ndn::Interest &interest)
Returns an LSA segment for an interest from LsaSegmentStorage.
#define NLSR_LOG_ERROR(x)
Copyright (c) 2014-2018, The University of Memphis, Regents of the University of California, Arizona Board of Regents.
#define NLSR_LOG_TRACE(x)