rib: fetch face dataset with StatusDataset client
refs #3620 Change-Id: Ibf1a0e064e105389d6b733b2d1f0791dff356208
This commit is contained in:
1 parent
67019110d7
commit
6e21cdb13f
3 files changed
+17
-65
No files matched your search
+11
-51
@@ -318,41 +318,16 @@ RibManager::fetchActiveFaces()
|
||||
{
|
||||
NFD_LOG_DEBUG("Fetching active faces");
|
||||
|
||||
Interest interest(FACES_LIST_DATASET_PREFIX);
|
||||
interest.setChildSelector(1);
|
||||
interest.setMustBeFresh(true);
|
||||
|
||||
shared_ptr<ndn::OBufferStream> buffer = make_shared<ndn::OBufferStream>();
|
||||
|
||||
m_face.expressInterest(interest,
|
||||
bind(&RibManager::fetchSegments, this, _2, buffer),
|
||||
bind(&RibManager::onFetchFaceStatusTimeout, this));
|
||||
m_nfdController.fetch<ndn::nfd::FaceDataset>(
|
||||
bind(&RibManager::removeInvalidFaces, this, _1),
|
||||
bind(&RibManager::onFetchActiveFacesFailure, this, _1, _2),
|
||||
ndn::nfd::CommandOptions());
|
||||
}
|
||||
|
||||
void
|
||||
RibManager::fetchSegments(const Data& data, shared_ptr<ndn::OBufferStream> buffer)
|
||||
RibManager::onFetchActiveFacesFailure(uint32_t code, const std::string& reason)
|
||||
{
|
||||
buffer->write(reinterpret_cast<const char*>(data.getContent().value()),
|
||||
data.getContent().value_size());
|
||||
|
||||
uint64_t currentSegment = data.getName().get(-1).toSegment();
|
||||
|
||||
const name::Component& finalBlockId = data.getMetaInfo().getFinalBlockId();
|
||||
|
||||
if (finalBlockId.empty() || finalBlockId.toSegment() > currentSegment) {
|
||||
m_face.expressInterest(data.getName().getPrefix(-1).appendSegment(currentSegment+1),
|
||||
bind(&RibManager::fetchSegments, this, _2, buffer),
|
||||
bind(&RibManager::onFetchFaceStatusTimeout, this));
|
||||
}
|
||||
else {
|
||||
removeInvalidFaces(buffer);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
RibManager::onFetchFaceStatusTimeout()
|
||||
{
|
||||
std::cerr << "Face Status Dataset request timed out" << std::endl;
|
||||
NFD_LOG_DEBUG("Face Status Dataset request failure " << code << " " << reason);
|
||||
scheduleActiveFaceFetch(ACTIVE_FACE_FETCH_INTERVAL);
|
||||
}
|
||||
|
||||
@@ -373,34 +348,19 @@ RibManager::scheduleActiveFaceFetch(const time::seconds& timeToWait)
|
||||
}
|
||||
|
||||
void
|
||||
RibManager::removeInvalidFaces(shared_ptr<ndn::OBufferStream> buffer)
|
||||
RibManager::removeInvalidFaces(const std::vector<ndn::nfd::FaceStatus>& activeFaces)
|
||||
{
|
||||
NFD_LOG_DEBUG("Checking for invalid face registrations");
|
||||
|
||||
ndn::ConstBufferPtr buf = buffer->buf();
|
||||
|
||||
Block block;
|
||||
size_t offset = 0;
|
||||
FaceIdSet activeFaces;
|
||||
|
||||
while (offset < buf->size()) {
|
||||
bool isOk = false;
|
||||
std::tie(isOk, block) = Block::fromBuffer(buf, offset);
|
||||
if (!isOk) {
|
||||
std::cerr << "ERROR: cannot decode FaceStatus TLV" << std::endl;
|
||||
break;
|
||||
}
|
||||
|
||||
offset += block.size();
|
||||
|
||||
ndn::nfd::FaceStatus status(block);
|
||||
activeFaces.insert(status.getFaceId());
|
||||
FaceIdSet activeFaceIds;
|
||||
for (const ndn::nfd::FaceStatus& item : activeFaces) {
|
||||
activeFaceIds.insert(item.getFaceId());
|
||||
}
|
||||
|
||||
// Look for face IDs that were registered but not active to find missed
|
||||
// face destroyed events
|
||||
for (auto&& faceId : m_registeredFaces) {
|
||||
if (activeFaces.find(faceId) == activeFaces.end()) {
|
||||
if (activeFaceIds.count(faceId) == 0) {
|
||||
NFD_LOG_DEBUG("Removing invalid face ID: " << faceId);
|
||||
|
||||
scheduler::schedule(time::seconds(0),
|
||||
|
||||
+3
-6
@@ -115,10 +115,7 @@ private: // Face monitor
|
||||
fetchActiveFaces();
|
||||
|
||||
void
|
||||
fetchSegments(const Data& data, shared_ptr<ndn::OBufferStream> buffer);
|
||||
|
||||
void
|
||||
onFetchFaceStatusTimeout();
|
||||
onFetchActiveFacesFailure(uint32_t code, const std::string& reason);
|
||||
|
||||
void
|
||||
onFaceDestroyedEvent(uint64_t faceId);
|
||||
@@ -130,10 +127,10 @@ PUBLIC_WITH_TESTS_ELSE_PRIVATE:
|
||||
/**
|
||||
* @brief remove invalid faces
|
||||
*
|
||||
* @param buffer Face dataset contents
|
||||
* @param status Face dataset
|
||||
*/
|
||||
void
|
||||
removeInvalidFaces(shared_ptr<ndn::OBufferStream> buffer);
|
||||
removeInvalidFaces(const std::vector<ndn::nfd::FaceStatus>& activeFaces);
|
||||
|
||||
/**
|
||||
* @brief response to face events
|
||||
|
||||
@@ -570,15 +570,10 @@ BOOST_AUTO_TEST_CASE(RemoveInvalidFaces)
|
||||
|
||||
ndn::nfd::FaceStatus status;
|
||||
status.setFaceId(1);
|
||||
std::vector<ndn::nfd::FaceStatus> activeFaces;
|
||||
activeFaces.push_back(status);
|
||||
|
||||
auto data = makeData("/localhost/nfd/faces/list");
|
||||
data->setContent(status.wireEncode());
|
||||
|
||||
auto buffer = make_shared<ndn::OBufferStream>();
|
||||
buffer->write(reinterpret_cast<const char*>(data->getContent().value()),
|
||||
data->getContent().value_size());
|
||||
|
||||
m_manager.removeInvalidFaces(buffer);
|
||||
m_manager.removeInvalidFaces(activeFaces);
|
||||
advanceClocks(time::milliseconds(100));
|
||||
BOOST_REQUIRE_EQUAL(m_rib.size(), 1);
|
||||
|
||||
|
||||
Reference in new issue
Block a user