fix bug that front-end cannot handle multiple packets to initialize filters
Change-Id: Idb6d169912421722cc8a964cd06a97190f13af6f
diff --git a/catalog/src/query/query-adapter.hpp b/catalog/src/query/query-adapter.hpp
index c0f292c..ab0b126 100644
--- a/catalog/src/query/query-adapter.hpp
+++ b/catalog/src/query/query-adapter.hpp
@@ -522,10 +522,24 @@
_LOG_DEBUG("Interest : " << interestPtr->getName());
- // TODO: save the content in memory, first check the memory, if not exists, start thread to generate it
- // Note that if ChronoSync state changes, we need to clear the saved value, and regenerate it
+ if(m_socket != nullptr) {
+ const ndn::ConstBufferPtr digestPtr = m_socket->getRootDigest();
+ std::string digestStr = ndn::toHex(digestPtr->buf(), digestPtr->size());
+ _LOG_DEBUG("Original digest :" << m_chronosyncDigest);
+ _LOG_DEBUG("New digest : " << digestStr);
+ // if the m_chronosyncDigest and the rootdigest are not equal
+ if (digestStr != m_chronosyncDigest) {
+ // (1) update chronosyncDigest
+ // (2) clear all staled ACK data
+ m_mutex.lock();
+ m_chronosyncDigest = digestStr;
+ m_activeQueryToFirstResponse.erase(ndn::Name("/"));
+ m_mutex.unlock();
+ _LOG_DEBUG("Change digest to " << m_chronosyncDigest);
+ }
+ }
- auto data = m_cache.find(interest.getName());
+ auto data = m_activeQueryToFirstResponse.find(interest.getName());
if (data) {
m_face->put(*data);
}
@@ -551,8 +565,8 @@
const std::string filterValue = fastWriter.write(filters);
if (!filters.empty()) {
- ndn::Name filterDataName(interest->getName());
- filterDataName.append("stateVersion");// TODO: should replace with a state version
+ // use /<prefix>/filters-initialization/<seg> as data name
+ ndn::Name filterDataName(interest->getName().getPrefix(-1));
const char* payload = filterValue.c_str();
size_t payloadLength = filterValue.size();
@@ -562,7 +576,8 @@
payloadLength = PAYLOAD_LIMIT;
ndn::Name segmentName = ndn::Name(filterDataName).appendSegment(seqNo);
std::shared_ptr<ndn::Data> filterData = std::make_shared<ndn::Data>(segmentName);
- filterData->setFreshnessPeriod(ndn::time::milliseconds(10000));
+ // freshnessPeriod 0 means permanent?
+ filterData->setFreshnessPeriod(ndn::time::milliseconds(10));
filterData->setContent(reinterpret_cast<const uint8_t*>(payload + startIndex), payloadLength);
signData(*filterData);
@@ -570,7 +585,9 @@
_LOG_DEBUG("Populate Filter Data :" << segmentName);
m_mutex.lock();
- m_cache.insert(*filterData);
+ // save the filter results in the activeQueryToFirstResponse structure
+ // when version changes, the activeQueryToFirstResponse should be cleaned
+ m_activeQueryToFirstResponse.insert(*filterData);
try {
m_face->put(*filterData);
}
@@ -586,13 +603,13 @@
ndn::Name lastSegment = ndn::Name(filterDataName).appendSegment(seqNo);
std::shared_ptr<ndn::Data> filterData = std::make_shared<ndn::Data>(lastSegment);
- filterData->setFreshnessPeriod(ndn::time::milliseconds(10000));
+ filterData->setFreshnessPeriod(ndn::time::milliseconds(10));
filterData->setContent(reinterpret_cast<const uint8_t*>(payload + startIndex), payloadLength);
filterData->setFinalBlockId(ndn::Name::Component::fromSegment(seqNo));
signData(*filterData);
m_mutex.lock();
- m_cache.insert(*filterData);
+ m_activeQueryToFirstResponse.insert(*filterData);
m_face->put(*filterData);
m_mutex.unlock();
}
@@ -954,7 +971,7 @@
if(m_socket != nullptr) {
const ndn::ConstBufferPtr digestPtr = m_socket->getRootDigest();
std::string digestStr = ndn::toHex(digestPtr->buf(), digestPtr->size());
- _LOG_DEBUG("Original digest" << m_chronosyncDigest);
+ _LOG_DEBUG("Original digest " << m_chronosyncDigest);
_LOG_DEBUG("New digest : " << digestStr);
// if the m_chronosyncDigest and the rootdigest are not equal
if (digestStr != m_chronosyncDigest) {
diff --git a/client/catalog-dev/js/catalog.js b/client/catalog-dev/js/catalog.js
index 84a62c5..158aad9 100644
--- a/client/catalog-dev/js/catalog.js
+++ b/client/catalog-dev/js/catalog.js
@@ -751,7 +751,8 @@
d.push(data.getContent().toString());
- if (interest.getName().get(-1).toSegment() == data.getMetaInfo().getFinalBlockId().toSegment()){
+ if (data.getMetaInfo().getFinalBlockId().value.length !== 0 &&
+ interest.getName().get(-1).toSegment() == data.getMetaInfo().getFinalBlockId().toSegment()){
callback(d.join(""));
} else {
request(interest.getName().get(-1).toSegment() + 1);