final Peer peer = RIBImpl.this.peers.take();
LOG.debug("Advertizing loc-rib to new peer {}.", peer);
for (final BgpTableType key : RIBImpl.this.localTables) {
- final AdjRIBsTransactionImpl trans = new AdjRIBsTransactionImpl(RIBImpl.this.ribOuts, RIBImpl.this.comparator, RIBImpl.this.chain.newWriteOnlyTransaction());
- final AbstractAdjRIBs<?, ?, ?> adj = (AbstractAdjRIBs<?, ?, ?>) RIBImpl.this.tables.get(new TablesKey(key.getAfi(), key.getSafi()));
- adj.addAllEntries(trans);
- Futures.addCallback(trans.commit(), new FutureCallback<Void>() {
- @Override
- public void onSuccess(final Void result) {
- LOG.trace("Advertizing {} to peer {} committed successfully", key.getAfi(), peer);
- }
- @Override
- public void onFailure(final Throwable t) {
- LOG.error("Failed to update peer {} with RIB {}", peer, t);
- }
- });
+
+ synchronized (RIBImpl.this) {
+ final AdjRIBsTransactionImpl trans = new AdjRIBsTransactionImpl(RIBImpl.this.ribOuts, RIBImpl.this.comparator, RIBImpl.this.chain.newWriteOnlyTransaction());
+ final AbstractAdjRIBs<?, ?, ?> adj = (AbstractAdjRIBs<?, ?, ?>) RIBImpl.this.tables.get(new TablesKey(key.getAfi(), key.getSafi()));
+ adj.addAllEntries(trans);
+ Futures.addCallback(trans.commit(), new FutureCallback<Void>() {
+ @Override
+ public void onSuccess(final Void result) {
+ LOG.trace("Advertizing {} to peer {} committed successfully", key.getAfi(), peer);
+ }
+ @Override
+ public void onFailure(final Throwable t) {
+ LOG.error("Failed to update peer {} with RIB {}", peer, t);
+ }
+ });
+ }
}
} catch (final InterruptedException e) {
LOG.info("Scheduler thread was interrupted.", e);
public RIBImpl(final RibId ribId, final AsNumber localAs, final Ipv4Address localBgpId, final RIBExtensionConsumerContext extensions,
final BGPDispatcher dispatcher, final ReconnectStrategyFactory tcpStrategyFactory,
final ReconnectStrategyFactory sessionStrategyFactory, final DataBroker dps, final List<BgpTableType> localTables) {
- super(InstanceIdentifier.builder(BgpRib.class).child(Rib.class, new RibKey(Preconditions.checkNotNull(ribId))).toInstance());
+ super(InstanceIdentifier.builder(BgpRib.class).child(Rib.class, new RibKey(Preconditions.checkNotNull(ribId))).build());
this.chain = dps.createTransactionChain(this);
this.localAs = Preconditions.checkNotNull(localAs);
this.comparator = new BGPObjectComparator(localAs);
final PathAttributes2 mpu = attrs.getAugmentation(PathAttributes2.class);
if (mpu != null) {
final MpUnreachNlri nlri = mpu.getMpUnreachNlri();
-
final AdjRIBsIn<?, ?> ari = this.tables.get(new TablesKey(nlri.getAfi(), nlri.getSafi()));
- if (ari != null) {
- ari.removeRoutes(trans, peer, nlri);
+ // EOR messages do not contain withdrawn routes
+ if (nlri.getWithdrawnRoutes() != null) {
+ if (ari != null) {
+ ari.removeRoutes(trans, peer, nlri);
+ } else {
+ LOG.debug("Not removing objects from unhandled NLRI {}", nlri);
+ }
} else {
- LOG.debug("Not removing objects from unhandled NLRI {}", nlri);
+ ari.markUptodate(trans, peer);
}
}
}
}
@Override
- public void close() throws InterruptedException, ExecutionException {
+ public synchronized void close() throws InterruptedException, ExecutionException {
final WriteTransaction t = this.chain.newWriteOnlyTransaction();
t.delete(LogicalDatastoreType.OPERATIONAL, getInstanceIdentifier());
t.submit().get();