In a resiliency case, a PCC has redundant PCEP sessions towards
multiple PCEs. In such a case, a PCC gives control on an LSP to a
single PCE only, and only this PCE is responsible for the path
computation for the delegated LSP: the PCC achieves this by setting
the D flag only towards the active PCE [RFC8231] selected for delegation. The election of the active
PCE to delegate an LSP is controlled by each PCC. The PCC usually
elects the active PCE by a local configured policy (by setting a
priority). Upon PCEP session failure, or active PCE failure, PCC may
decide to elect a new active PCE by sending new PCRpt message with D
flag set to this new active PCE. When the failed PCE or PCEP session
comes back online, it will be up to the implementation to do
preemption. Doing preemption may lead to some
disruption on the existing path if path results from both PCEs are not
exactly the same. By considering a network with multiple PCCs and
implementing multiple stateful PCEs for redundancy purpose, there is
no guarantee that at any time all the PCCs delegate their LSPs to the
same PCE.¶
+----------+
| PCC1 | LSP1
+----------+
/ \
/ \
+---------+ +---------+
| PCE1 | | PCE2 |
+---------+ +---------+
\ /
*fail* \ /
+----------+
| PCC2 | LSP2
+----------+
¶
In the example above, we consider that by configuration, both PCCs
will firstly delegate their LSPs to PCE1. So, PCE1 is responsible for
computing a path for both LSP1 and LSP2. If the PCEP session between
PCC2 and PCE1 fails, PCC2 will delegate LSP2 to PCE2. So PCE1 becomes
responsible only for LSP1 path computation while PCE2 is responsible
for the path computation of LSP2. When the PCC2-PCE1 session is back
online, PCC2 will keep using PCE2 as active PCE (consider no
preemption in this example). So the result is a permanent situation
where each PCE is responsible for a subset of path computation.¶
This situation is called a split-brain scenario, as there are
multiple computation brains running at the same time while a central
computation unit was required in some deployments/use cases.¶
Further, there are use cases where a particular LSP path
computation is linked to another LSP path computation: the most common
use case is path disjointness (see [RFC8800]) and Bidirectional LSPs (see [RFC9059]). The set of LSPs that are dependent to each other
may start from a different head-end.¶
_________________________________________
/ \
/ +------+ +------+ \
| | PCE1 | | PCE2 | |
| +------+ +------+ |
| |
| +------+ +------+ |
| | PCC1 | ----------------------> | PCC2 | |
| +------+ +------+ |
| |
| |
| +------+ +------+ |
| | PCC3 | ----------------------> | PCC4 | |
| +------+ +------+ |
| |
\ /
\_________________________________________/
_________________________________________
/ \
/ +------+ +------+ \
| | PCE1 | | PCE2 | |
| +------+ +------+ |
| |
| +------+ 10 +------+ |
| | PCC1 | ----- R1 ---- R2 ------- | PCC2 | |
| +------+ | | +------+ |
| | | |
| | | |
| +------+ | | +------+ |
| | PCC3 | ----- R3 ---- R4 ------- | PCC4 | |
| +------+ +------+ |
| |
\ /
\_________________________________________/
¶
In the figure above, the requirement is to create two link-disjoint
LSPs: PCC1->PCC2 and PCC3->PCC4. In the topology, all links cost
metric is set to 1 except for the link 'R1-R2' which has a metric of
10. The PCEs are responsible for the path computation and PCE1 is the
active primary PCE for all PCCs in the nominal case.¶
The rest of this section lists various scenarios for illustrative purposes, there are many other cases where the solution defined in this document is applicable.¶
Scenario 1:¶
In the normal case (PCE1 as active primary PCE), consider that
PCC1->PCC2 LSP is configured first with the link disjointness
constraint, PCE1 sends a PCUpd message to PCC1 with the ERO:
R1->R3->R4->R2->PCC2 (shortest path). PCC1 signals and
installs the path. When PCC3->PCC4 is configured, the PCEs already
knows the path of PCC1->PCC2 and can compute a link-disjoint path:
the solution requires to move PCC1->PCC2 onto a new path to let
room for the new LSP. PCE1 sends a PCUpd message to PCC1 with the new
ERO: R1->R2->PCC2 and a PCUpd to PCC3 with the following ERO:
R3->R4->PCC4. In the normal case, there is no issue for PCE1 to
compute a link-disjoint path.¶
Scenario 2:¶
Consider that PCC1 lost its PCEP session with PCE1 (all other PCEP
sessions are UP). PCC1 delegates its LSP to PCE2.¶
+----------+
| PCC1 | LSP: PCC1->PCC2
+----------+
\
\ D=1
+---------+ +---------+
| PCE1 | | PCE2 |
+---------+ +---------+
D=1 \ / D=0
\ /
+----------+
| PCC3 | LSP: PCC3->PCC4
+----------+
¶
Consider that the PCC1->PCC2 LSP is configured first with the
link disjointness constraint, PCE2 (which is the new active primary
PCE for PCC1) sends a PCUpd message to PCC1 with the ERO:
R1->R3->R4->R2->PCC2 (shortest path). When PCC3->PCC4
is configured, PCE1 is not aware of LSPs from PCC1 any more, so it
cannot compute a disjoint path for PCC3->PCC4 and will send a PCUpd
message to PCC3 with the shortest path ERO: R3->R4->PCC4. When
PCC3->PCC4 LSP will be reported to PCE2 by PCC3, PCE2 will ensure
disjointness computation and will correctly move PCC1->PCC2 (as it
owns delegation for this LSP) on the following path:
R1->R2->PCC2. With this sequence of event and these PCEP
sessions, disjointness is ensured.¶
Scenario 3:¶
+----------+
| PCC1 | LSP: PCC1->PCC2
+----------+
/ \
D=1 / \ D=0
+---------+ +---------+
| PCE1 | | PCE2 |
+---------+ +---------+
/ D=1
/
+----------+
| PCC3 | LSP: PCC3->PCC4
+----------+
¶
Consider the above PCEP sessions and the PCC1->PCC2 LSP is
configured first with the link disjointness constraint, PCE1 computes
the shortest path as it is the only LSP in the disjoint association
group that it is aware of: R1->R3->R4->R2->PCC2 (shortest
path). When PCC3->PCC4 is configured, PCE2 must compute a disjoint
path for this LSP. The only solution found is to move PCC1->PCC2
LSP on another path, but PCE2 cannot do it as it does not have
delegation for this LSP. In this set-up, PCEs are not able to find a
disjoint path.¶
Scenario 4:¶
+----------+
| PCC1 | LSP: PCC1->PCC2
+----------+
/ \
D=1 / \ D=0
+---------+ +---------+
| PCE1 | | PCE2 |
+---------+ +---------+
D=0 \ / D=1
\ /
+----------+
| PCC3 | LSP: PCC3->PCC4
+----------+
¶
Consider the above PCEP sessions and that PCEs are configured to
fall-back to the shortest path if disjointness cannot be found as
described in [RFC8800]. The
PCC1->PCC2 LSP is configured first, PCE1 computes the shortest path
as it is the only LSP in the disjoint association group that it is
aware of: R1->R3->R4->R2->PCC2 (shortest path). When
PCC3->PCC4 is configured, PCE2 must compute a disjoint path for
this LSP. The only solution found is to move PCC1->PCC2 LSP on
another path, but PCE2 cannot do it as it does not have delegation for
this LSP. PCE2 then provides the shortest path for PCC3->PCC4:
R3->R4->PCC4. When PCC3 receives the ERO, it reports it back to
both PCEs. When PCE1 becomes aware of the PCC3->PCC4 path, it
recomputes the constrained shortest path first (CSPF) algorithm and
provides a new path for PCC1->PCC2: R1->R2->PCC2. The new
path is reported back to all PCEs by PCC1. PCE2 recomputes also CSPF
to take into account the new reported path. The new computation does
not lead to any path update.¶
Scenario 5:¶
_____________________________________
/ \
/ +------+ +------+ \
| | PCE1 | | PCE2 | |
| +------+ +------+ |
| |
| +------+ 100 +------+ |
| | | -------------------- | | |
| | PCC1 | ----- R1 ----------- | PCC2 | |
| +------+ | +------+ |
| | | | |
| 6 | | 2 | 2 |
| | | | |
| +------+ | +------+ |
| | PCC3 | ----- R3 ----------- | PCC4 | |
| +------+ 10 +------+ |
| |
\ /
\_____________________________________/
¶
Now, consider a new network topology with the same PCEP sessions as
the previous example. Suppose that both LSPs are configured almost at
the same time. PCE1 will compute a path for PCC1->PCC2 while PCE2
will compute a path for PCC3->PCC4. As each PCE is not aware of the
path of the second LSP in the association group (not reported yet),
each PCE is computing the shortest path for the LSP. PCE1 computes
ERO: R1->PCC2 for PCC1->PCC2 and PCE2 computes ERO:
R3->R1->PCC2->PCC4 for PCC3->PCC4. When these shortest
paths will be reported to each PCE. Each PCE will recompute
disjointness. PCE1 will provide a new path for PCC1->PCC2 with ERO:
PCC1->PCC2. PCE2 will provide also a new path for PCC3->PCC4
with ERO: R3->PCC4. When those new paths will be reported to both
PCEs, this will trigger CSPF again. PCE1 will provide a new more
optimal path for PCC1->PCC2 with ERO: R1->PCC2 and PCE2 will
also provide a more optimal path for PCC3->PCC4 with ERO:
R3->R1->PCC2->PCC4. So we come back to the initial state.
When those paths will be reported to both PCEs, this will trigger CSPF
again. An infinite loop of CSPF computation is then happening with a
permanent flap of paths because of the split-brain situation.¶
Another common example to note would be two LSPs with link-diverse paths that share a common node in its path but delegated to different PCEs. In case of the common node failure, both PCEs would detect the same and each could independently compute a new path that might both choose the same new link.¶
This permanent computation loop comes from the inconsistency
between the state of the LSPs as seen by each PCE due to the
split-brain: each PCE is trying to modify at the same time its
delegated path based on the last received path information which de
facto invalidates this received path information.¶
Scenario 6: multi-domain¶
Domain/Area 1 Domain/Area 2
________________ ________________
/ \ / \
/ +------+ | | +------+ \
| | PCE1 | | | | PCE3 | |
| +------+ | | +------+ |
| | | |
| +------+ | | +------+ |
| | PCE2 | | | | PCE4 | |
| +------+ | | +------+ |
| | | |
| +------+ | | +------+ |
| | PCC1 | | | | PCC2 | |
| +------+ | | +------+ |
| | | |
| | | |
| +------+ | | +------+ |
| | PCC3 | | | | PCC4 | |
| +------+ | | +------+ |
\ | | |
\_______________/ \________________/
¶
In the example above, suppose that the disjoint LSPs from PCC1 to
PCC2 and from PCC4 to PCC3 are created. All the PCEs have the
knowledge of both domain topologies (e.g. using BGP-LS [RFC9552]). For operation/management
reasons, each domain uses its own group of redundant PCEs. PCE1/PCE2
in domain 1 have PCEP sessions with PCC1 and PCC3 while PCE3/PCE4 in
domain 2 have PCEP sessions with PCC2 and PCC4. As PCE1/2 does not
know about LSPs from PCC2/4 and PCE3/4 do not know about LSPs from
PCC1/3, there is no possibility to compute the disjointness
constraint. This scenario can also be seen as a split-brain scenario.
This multi-domain architecture (with multiple groups of PCEs) can also
be used in a single domain, where an operator wants to limit the
failure domain by creating multiple groups of PCEs maintaining a
subset of PCCs. As for the multi-domain example, there will be no
possibility to compute the disjoint path starting from head-ends
managed by different PCE groups.¶
In this document, we specify a solution that addresses the
possibility to compute LSP association based constraints (like
disjointness) in split-brain scenarios while preventing computation
loops.¶