Bug #4132
closedMulticastStrategy/AsfStrategy should not reject forwarded Interests
100%
Description
Topology:
A--R--B
- All connections are made with point-to-point faces.
Steps to reproduce:
- on R, set an affected strategy on
/A
namespace - on R, add a route for
/A
prefix toward A - on A and B, add a route for
/
prefix toward R - on B, express an Interest
/A/1
; the Interest is forwarded to A - after suppression period (if any) has elapsed, but before InterestLifetime expires: on A, express an Interest
/A/1
Actual: NFD log indicates ERROR: [Forwarder] onInterestReject interest=/A/1 cannot reject forwarded Interest
.
Expected: no such error message.
Updated by Junxiao Shi over 7 years ago
- Description updated (diff)
- Category set to Forwarding
- Target version set to v0.6
This error message is observed on NDN testbed on 20170613 during 0.5.1-72-gf4056d0
deployment.
This error message is harmless, as the rejecting operation has no effect after emitting this error message.
The quick solution is to avoid calling this->rejectPendingInterest
unless suppresion decision is NEW.
The final solution is eliminating "straggler timer" altogether.
Updated by Junxiao Shi over 7 years ago
- Subject changed from MulticastStrategy/AsfStrategy should reject forwarded Interests to MulticastStrategy/AsfStrategy should not reject forwarded Interests
- Assignee set to Ashlesh Gawande
This is assigned to Ashlesh, maintainer of these strategies.
Updated by Ashlesh Gawande over 7 years ago
So basically this happens when node A tries to send an Interest it just received.
Is there any issue/documentation about removing straggling timer?
Would this still be an issue if per upstream suppression timer is implemented (4066).
Updated by Junxiao Shi over 7 years ago
- Related to Feature #4200: Replace straggler timer with per-strategy decision added
Updated by Davide Pesavento over 6 years ago
- Target version changed from v0.6 to v0.7
Updated by Junxiao Shi over 6 years ago
- Related to deleted (Feature #4200: Replace straggler timer with per-strategy decision)
Updated by Junxiao Shi over 6 years ago
- Blocks Feature #4200: Replace straggler timer with per-strategy decision added
Updated by Junxiao Shi over 6 years ago
Updated by Junxiao Shi over 6 years ago
- Blocks deleted (Feature #4200: Replace straggler timer with per-strategy decision)
Updated by Junxiao Shi over 6 years ago
- Priority changed from Normal to Urgent
- Estimated time set to 2.00 h
#4200 is merged, so multicast strategy and ASF strategy have stopped working.
Updated by Ashlesh Gawande over 6 years ago
- Status changed from New to In Progress
But unit test in multicast and ASF still work?
Okay so for this described scenario the strategies won't work. I am working on adding unit tests then to reproduce.
Updated by Davide Pesavento over 6 years ago
- Related to Feature #4200: Replace straggler timer with per-strategy decision added
Updated by Ashlesh Gawande over 6 years ago
I am working on top of NFD commit 3cf75dc10be93d024a5ee125e22aef9a7ab25986 (i.e. before straggler timer, #4200).
I am unable to reproduce the scenario as described. The following unit test does not trigger the given log message.
Junxiao, are you able to reproduce using this commit? Could you elaborate on how the strategies have stopped working?
BOOST_AUTO_TEST_CASE(RejectPendingInterest)
{
/*
* +---------+ +---------+ +----------+
* | nodeA |-----------| nodeR |------------| nodeB |
* +---------+ 1ms +---------+ 1ms +----------+
*/
TopologyTester topo;
TopologyNode nodeA = topo.addForwarder("A"),
nodeR = topo.addForwarder("R"),
nodeB = topo.addForwarder("B");
for (TopologyNode node : {nodeA, nodeR, nodeB}) {
topo.setStrategy<MulticastStrategy>(node);
//topo.setStrategy<AsfStrategy>(node);
}
shared_ptr<TopologyLink> linkAR = topo.addLink("AR", time::milliseconds(1), {nodeA, nodeR}),
linkRB = topo.addLink("RB", time::milliseconds(1), {nodeR, nodeB});
shared_ptr<TopologyAppLink> pingFromB = topo.addAppFace("cB", nodeB),
pingFromA = topo.addAppFace("cA", nodeB),
pingServer = topo.addAppFace("p", nodeA, Name("/A"));
topo.registerPrefix(nodeR, linkAR->getFace(nodeR), Name("/A"), 1);
topo.registerPrefix(nodeA, linkAR->getFace(nodeA), Name("/"), 1);
topo.registerPrefix(nodeB, linkRB->getFace(nodeB), Name("/"), 1);
shared_ptr<Interest> interest = makeInterest(Name("/A/1"));
pingFromB->getClientFace().expressInterest(*interest, nullptr, nullptr, nullptr);
this->advanceClocks(time::milliseconds(1), time::milliseconds(15));
pingFromA->getClientFace().expressInterest(*interest, nullptr, nullptr, nullptr);
this->advanceClocks(time::milliseconds(1), time::milliseconds(15));
}
I think this is because per upstream suppression is being used in multicast and ASF strategies (#note3).
Multicast strategy rejects pending interest when:
nEligibleNextHops == 0 && !isSuppressed
ASF strategy rejects pending interest when:
nexthops.size() == 0 or faceToUse == nullptr
Updated by Junxiao Shi over 6 years ago
- Status changed from In Progress to Closed
- % Done changed from 0 to 100
avoid calling
this->rejectPendingInterest
unless suppression decision is NEW.
It seems that this solution is already implemented.
https://github.com/named-data/NFD/blob/981db808cb37e0bf95d86c721f1dbcd9bc1bdf5c/daemon/fw/multicast-strategy.cpp#L103
Updated by Ashlesh Gawande over 4 years ago
- Related to Bug #5123: MulticastStrategy rejects (forwarded interest's) PIT entry when the same Interest is received from a different face added