diff options
author | Olivier Roques <olvrqs@gmail.com> | 2019-11-20 13:53:12 +0000 |
---|---|---|
committer | Olivier Roques <olvrqs@gmail.com> | 2019-11-20 15:07:36 +0000 |
commit | 0010de10dcb9183e6c6876fcaaf2283a0ef1ed86 (patch) | |
tree | aab02000bdf77ef5ed5eb4266742aca1a22020d1 /libtransport/src | |
parent | 1d1c54db773d8b9f81f15295fe6ecea872ce2883 (diff) |
[HICN-402] Limit in-flight interests for manifests
Currently, interests for manifests are sent independently of the
transport protocol. When receiving a manifest, interests for next
manifests are sent until the next window would be full of data
segments.
But there is no limit on the number of interests for manifests that
can be sent. After a while, the interest input buffer in the
producer's side is full of them and cannot satisfy the requests
quickly enough. This results in a large drop of bandwidth on the
consumer side. This patch allows to limit the number of in-flight
interests for manifests.
Signed-off-by: Olivier Roques <olvrqs@gmail.com>
Change-Id: Ic497bd55fd92233e4b47b04635fb9bf75506375e
Diffstat (limited to 'libtransport/src')
3 files changed, 25 insertions, 2 deletions
diff --git a/libtransport/src/hicn/transport/protocols/manifest_indexing_manager.cc b/libtransport/src/hicn/transport/protocols/manifest_indexing_manager.cc index 9af6a5c3a..05cabc60d 100644 --- a/libtransport/src/hicn/transport/protocols/manifest_indexing_manager.cc +++ b/libtransport/src/hicn/transport/protocols/manifest_indexing_manager.cc @@ -29,6 +29,7 @@ ManifestIndexManager::ManifestIndexManager( interface::ConsumerSocket *icn_socket, TransportProtocol *next_interest) : IncrementalIndexManager(icn_socket), PacketManager<Interest>(1024), + manifests_in_flight_(0), next_reassembly_segment_(suffix_queue_.end()), next_to_retrieve_segment_(suffix_queue_.end()), suffix_manifest_(core::NextSegmentCalculationStrategy::INCREMENTAL, 0), @@ -86,7 +87,14 @@ bool ManifestIndexManager::onManifest( // Set the iterators to the beginning of the suffix queue next_reassembly_segment_ = suffix_queue_.begin(); // Set number of segments in manifests assuming the first one is full - suffix_manifest_.setNbSegments(std::distance(_it, _end) - 1); + suffix_manifest_.setNbSegments( + std::distance(manifest->getSuffixList().begin(), + manifest->getSuffixList().end()) - + 1); + suffix_manifest_.setSuffixStrategy( + manifest->getNextSegmentCalculationStrategy()); + } else if (manifests_in_flight_) { + manifests_in_flight_--; } if (TRANSPORT_EXPECT_FALSE(manifest->isFinalManifest() || @@ -110,6 +118,10 @@ bool ManifestIndexManager::onManifest( // Manifest namespace Name &name = manifest->getWritableName(); + if (manifests_in_flight_ >= MAX_MANIFESTS_IN_FLIGHT) { + break; + } + // Send as many manifest as required for filling window. do { segment_count += suffix_manifest_.getNbSegments(); @@ -132,8 +144,10 @@ bool ManifestIndexManager::onManifest( std::placeholders::_1, std::placeholders::_2), std::bind(&ManifestIndexManager::onManifestTimeout, this, std::placeholders::_1)); + manifests_in_flight_++; } while (segment_count < current_window_size && - suffix_manifest_.getSuffix() < final_suffix_); + suffix_manifest_.getSuffix() < final_suffix_ && + manifests_in_flight_ < MAX_MANIFESTS_IN_FLIGHT); break; } diff --git a/libtransport/src/hicn/transport/protocols/manifest_indexing_manager.h b/libtransport/src/hicn/transport/protocols/manifest_indexing_manager.h index 5f74ef0bf..74c86eb60 100644 --- a/libtransport/src/hicn/transport/protocols/manifest_indexing_manager.h +++ b/libtransport/src/hicn/transport/protocols/manifest_indexing_manager.h @@ -21,6 +21,9 @@ #include <list> +/* #define MAX_MANIFESTS_IN_FLIGHT std::numeric_limits<uint32_t>::max() */ +#define MAX_MANIFESTS_IN_FLIGHT 10 + namespace transport { namespace protocol { @@ -57,6 +60,7 @@ class ManifestIndexManager : public IncrementalIndexManager, void onManifestTimeout(Interest::Ptr &&i); protected: + uint32_t manifests_in_flight_; SuffixQueue suffix_queue_; SuffixQueue::iterator next_reassembly_segment_; SuffixQueue::iterator next_to_retrieve_segment_; diff --git a/libtransport/src/hicn/transport/utils/suffix_strategy.h b/libtransport/src/hicn/transport/utils/suffix_strategy.h index 99e557380..4358d12f0 100644 --- a/libtransport/src/hicn/transport/utils/suffix_strategy.h +++ b/libtransport/src/hicn/transport/utils/suffix_strategy.h @@ -31,6 +31,11 @@ class SuffixStrategy { return suffix_stragegy_; } + void setSuffixStrategy( + transport::core::NextSegmentCalculationStrategy strategy) { + suffix_stragegy_ = strategy; + } + std::uint32_t getSuffix() { return suffix_; } virtual std::uint32_t getNextSuffix() = 0; |