Project

General

Profile

Actions

Feature #1941

closed

FibUpdater

Added by Junxiao Shi about 10 years ago. Updated over 9 years ago.

Status:
Closed
Priority:
Normal
Assignee:
Category:
RIB
Target version:
Start date:
Due date:
% Done:

100%

Estimated time:
12.00 h

Description

Currently, FIB updates are generated by RibManager class. This is semantically incorrect, because RibManager's responsibility is to accept RIB register/unregister commands, while FIB updates can result from not only RIB register/unregister commands, but also Route expiration.

This Task is to implement the proposed design: send FIB updates from a separate FibUpdater module, and trigger FIB updates from a RibUpdateBatch.
This design has been approved and clarified.

Design

RibManager updates the RIB only; it does not directly update the FIB.

RibManager can respond to prefix registration commands right away without waiting for Rib::beginApplyUpdate to complete, because a successful response indicates the acceptance, not the completion, of a RibMgmt command.

RIB updates are batched. A batch of RIB updates is packaged into a RibUpdateBatch object. All RIB updates in the same RibUpdateBatch object must refer to the same face.

When RibManager receives one or more RIB updates, it generates a RibUpdateBatch, and passes it to Rib::beginApplyUpdate() to begin the RIB
update procedure.

When one or more Route expires, the RIB itself generates a RibUpdateBatch, and begin the RIB update procedure.

Note: before #1698, RibUpdateBatch may contain only one RIB update.

The RIB update procedure has admission control: if a previous RibUpdateBatch is in progress, the new batch will be put in a queue until the previous batch is complete.

To apply a batch of RIB updates, the current collection of RIB entries and the RibUpdateBatch are passed to FibUpdater component to compute the optimal set of FIB updates, and the FibUpdater component shall send these FIB updates.

FIB updates should be send sequentially, in order to avoid #1990 and avoid overloading NFD; given that NFD is local, this shouldn't cause long latency.

FIB updates for RibUpdateBatch's face should be sent before FIB updates for other faces.

If any FIB update fails,

(a) in case of a non-recoverable error (eg. signing key of RIB Daemon is not trusted, more than 10 timeouts for the same command), the RIB Daemon shall crash;

(b) in case of a non-existent face error of the same face, the RibUpdateBatch is abandoned;

(c) in case of a non-existent face error of a different face, the FIB update is skipped;

(d) in other cases (eg. timeout), the FIB update is retried.

The updates can be skipped in case (c) because they are for inherited routes. Inherited routes can only affect the calculation of updates for the same face, which is an invalid face, and do not alter the route flags.

If the RibUpdateBatch is abandoned, the RIB is unchanged; otherwise, after all FIB updates are successful, the RIB entries are updated.


Files

Fib-Updater.pdf (4.97 KB) Fib-Updater.pdf FibUpdater Class and Sequence Diagram Vince Lehman, 11/11/2014 01:51 PM
fib-update-summary.pdf (85.4 KB) fib-update-summary.pdf FIB Update Summary Vince Lehman, 12/09/2014 01:03 PM

Related issues 2 (1 open1 closed)

Blocks NFD - Feature #1698: Queuing FIB updates generated as a response to different RIB updatesNew06/25/2014

Actions
Blocks NFD - Feature #1697: Calculate FIB cost as the lowest cost among all inherited RoutesRejected

Actions
Actions

Also available in: Atom PDF