Fixed peer session recovery, in a case of failed transaction chain.
The AdjRibInWriter need working chain when cleaning, also it needs
to be started with fresh transaction chain when session goes up again.
Hence recreate AdjRibInWriter with a new tx chain, when the current
failed.
Fixed duplicated session avoidance. The peer's session should not be
removed from registry if it was not created during this negotiation process.
Otherwise, the active peer's sesion can be removed from registry, which can
later lead to the duplicated session establishment.
Signed-off-by: Milos Fabian <milfabia@cisco.com>
Change-Id: I46ef33d49a11db8465a719af5ba4e1716da14602
(cherry picked from commit
54e12560f5b823a24da39c4f9cbe274fb88f30ca)
// deliver the message, this method gets called with different exception (definitely not with BGPDocumentedException).
sendMessage(buildErrorNotify(((BGPDocumentedException)e).getError(), ((BGPDocumentedException) e).getData()));
}
// deliver the message, this method gets called with different exception (definitely not with BGPDocumentedException).
sendMessage(buildErrorNotify(((BGPDocumentedException)e).getError(), ((BGPDocumentedException) e).getData()));
}
- this.registry.removePeerSession(getRemoteIp());
+ if (this.state == State.OPEN_CONFIRM) {
+ this.registry.removePeerSession(getRemoteIp());
+ }
negotiationFailedCloseChannel(e);
this.state = State.FINISHED;
}
negotiationFailedCloseChannel(e);
this.state = State.FINISHED;
}
private final Map<TablesKey, AdjRibOutListener> adjRibOutListenerSet = new HashMap();
private final RpcProviderRegistry rpcRegistry;
private RoutedRpcRegistration<BgpPeerRpcService> rpcRegistration;
private final Map<TablesKey, AdjRibOutListener> adjRibOutListenerSet = new HashMap();
private final RpcProviderRegistry rpcRegistry;
private RoutedRpcRegistration<BgpPeerRpcService> rpcRegistration;
+ private final PeerRole peerRole;
public BGPPeer(final String name, final RIB rib, final PeerRole role, final RpcProviderRegistry rpcRegistry) {
public BGPPeer(final String name, final RIB rib, final PeerRole role, final RpcProviderRegistry rpcRegistry) {
this.rib = Preconditions.checkNotNull(rib);
this.name = name;
this.chain = rib.createPeerChain(this);
this.rib = Preconditions.checkNotNull(rib);
this.name = name;
this.chain = rib.createPeerChain(this);
@Override
public void onTransactionChainFailed(final TransactionChain<?, ?> chain, final AsyncTransaction<?, ?> transaction, final Throwable cause) {
LOG.error("Transaction chain failed.", cause);
@Override
public void onTransactionChainFailed(final TransactionChain<?, ?> chain, final AsyncTransaction<?, ?> transaction, final Throwable cause) {
LOG.error("Transaction chain failed.", cause);
this.chain.close();
this.chain = this.rib.createPeerChain(this);
this.chain.close();
this.chain = this.rib.createPeerChain(this);
+ this.ribWriter = AdjRibInWriter.create(this.rib.getYangRibId(), this.peerRole, this.chain);
+ releaseConnection();