Consumer: react fast on sync Interest timeout

refs: #5124

Change-Id: Ic28cd6d10e59645c2a209c5efc446ef28b600462
This commit is contained in:
Ashlesh Gawande
2020-08-02 22:42:28 -07:00
parent 87d4e20b35
commit 8ab7572247
4 changed files with 25 additions and 15 deletions
+10 -5
View File
@@ -15,7 +15,7 @@
*
* You should have received a copy of the GNU Lesser General Public License along with
* PSync, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
**/
*/
#include "PSync/consumer.hpp"
#include "PSync/detail/state.hpp"
@@ -187,7 +187,7 @@ Consumer::sendSyncInterest()
using ndn::util::SegmentFetcher;
SegmentFetcher::Options options;
options.interestLifetime = m_syncInterestLifetime;
options.maxTimeout = m_syncInterestLifetime;;
options.maxTimeout = m_syncInterestLifetime;
options.rttOptions.initialRto = m_syncInterestLifetime;
m_syncFetcher = SegmentFetcher::start(m_face, syncInterest,
@@ -216,9 +216,14 @@ Consumer::sendSyncInterest()
m_syncFetcher->onError.connect([this] (uint32_t errorCode, const std::string& msg) {
NDN_LOG_TRACE("Cannot fetch sync data, error: " << errorCode << " message: " << msg);
ndn::time::milliseconds after(m_rangeUniformRandom(m_rng));
NDN_LOG_TRACE("Scheduling after " << after);
m_scheduler.schedule(after, [this] { sendSyncInterest(); });
if (errorCode == SegmentFetcher::ErrorCode::INTEREST_TIMEOUT) {
sendSyncInterest();
}
else {
ndn::time::milliseconds after(m_rangeUniformRandom(m_rng));
NDN_LOG_TRACE("Scheduling sync Interest after: " << after);
m_scheduler.schedule(after, [this] { sendSyncInterest(); });
}
});
}
+5 -1
View File
@@ -119,7 +119,11 @@ FullProducer::sendSyncInterest()
m_fetcher->onError.connect([this] (uint32_t errorCode, const std::string& msg) {
NDN_LOG_ERROR("Cannot fetch sync data, error: " << errorCode << " message: " << msg);
if (errorCode == SegmentFetcher::ErrorCode::NACK_ERROR) {
// We would like to recover from errors like NoRoute NACK quicker than sync Interest timeout.
// We don't react to Interest timeout here as we have scheduled the next sync Interest
// to be sent in half the sync Interest lifetime + jitter above. So we would react to
// timeout before it happens.
if (errorCode != SegmentFetcher::ErrorCode::INTEREST_TIMEOUT) {
auto after = ndn::time::milliseconds(m_jitter(m_rng));
NDN_LOG_DEBUG("Schedule sync interest after: " << after);
m_scheduledSyncInterestId = m_scheduler.schedule(after, [this] { sendSyncInterest(); });
+2 -2
View File
@@ -66,14 +66,14 @@ BOOST_FIXTURE_TEST_CASE(ConstantTimeoutForFirstSegment, tests::UnitTestTimeFixtu
ndn::time::milliseconds(4000));
consumer.sendHelloInterest();
advanceClocks(ndn::time::milliseconds(4000));
advanceClocks(4_s);
BOOST_CHECK_EQUAL(face.sentInterests.size(), 1);
face.sentInterests.clear();
consumer.stop();
consumer.m_iblt = ndn::Name("test");
consumer.sendSyncInterest();
advanceClocks(ndn::time::milliseconds(4000));
advanceClocks(3999_ms);
BOOST_CHECK_EQUAL(face.sentInterests.size(), 1);
consumer.stop();
}
+8 -7
View File
@@ -15,7 +15,7 @@
*
* You should have received a copy of the GNU Lesser General Public License along with
* PSync, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
**/
*/
#include "PSync/partial-producer.hpp"
#include "PSync/consumer.hpp"
@@ -181,11 +181,11 @@ BOOST_AUTO_TEST_CASE(MissedUpdate)
BOOST_CHECK_EQUAL(numSyncDataRcvd, 0);
// The sync interest sent after hello will timeout
advanceClocks(ndn::time::milliseconds(1000));
advanceClocks(ndn::time::milliseconds(999));
BOOST_CHECK_EQUAL(numSyncDataRcvd, 0);
// Next sync interest will bring back the sync data
advanceClocks(ndn::time::milliseconds(1500));
advanceClocks(ndn::time::milliseconds(1));
BOOST_CHECK_EQUAL(numSyncDataRcvd, 1);
}
@@ -217,7 +217,8 @@ BOOST_AUTO_TEST_CASE(ConsumerSyncTimeout)
advanceClocks(ndn::time::milliseconds(10));
BOOST_CHECK_EQUAL(producer->m_pendingEntries.size(), 1);
advanceClocks(ndn::time::milliseconds(10), 100);
BOOST_CHECK_EQUAL(producer->m_pendingEntries.size(), 0);
// The next Interest is sent after the first one immediately
BOOST_CHECK_EQUAL(producer->m_pendingEntries.size(), 1);
advanceClocks(ndn::time::milliseconds(10), 100);
int numSyncInterests = 0;
@@ -226,7 +227,7 @@ BOOST_AUTO_TEST_CASE(ConsumerSyncTimeout)
numSyncInterests++;
}
}
BOOST_CHECK_EQUAL(numSyncInterests, 2);
BOOST_CHECK_EQUAL(numSyncInterests, 3);
BOOST_CHECK_EQUAL(numSyncDataRcvd, 0);
}
@@ -411,10 +412,10 @@ BOOST_AUTO_TEST_CASE(SegmentedSync)
producer->updateSeqNo(longNameToExceedDataSize.toUri() + "-" + to_string(i), 1);
}
advanceClocks(ndn::time::milliseconds(1000));
advanceClocks(ndn::time::milliseconds(999));
BOOST_CHECK_EQUAL(numSyncDataRcvd, 0);
advanceClocks(ndn::time::milliseconds(1500));
advanceClocks(ndn::time::milliseconds(1));
BOOST_CHECK_EQUAL(numSyncDataRcvd, 1);
// Simulate sending delayed interest for second segment