*/
package org.opendaylight.bgpcep.pcep.topology.provider;
+import io.netty.util.Timer;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.opendaylight.bgpcep.pcep.server.PceServerProvider;
import org.opendaylight.mdsal.binding.api.DataBroker;
* @return PceServerProvider
*/
PceServerProvider getPceServerProvider();
+
+ /**
+ * Return the timer to use used for scheduling various timeouts.
+ *
+ * @return A Timer.
+ */
+ Timer getTimer();
}
import static java.util.Objects.requireNonNull;
import static org.opendaylight.bgpcep.pcep.topology.provider.TopologyUtils.friendlyId;
+import io.netty.util.HashedWheelTimer;
+import io.netty.util.Timeout;
+import io.netty.util.Timer;
+import io.netty.util.TimerTask;
import java.util.Collection;
+import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.TimeUnit;
import org.checkerframework.checker.lock.qual.GuardedBy;
import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.bgpcep.pcep.server.PceServerProvider;
private final @NonNull PCEPDispatcher pcepDispatcher;
private final @NonNull DataBroker dataBroker;
+ // Timer used for RPC timeouts and session statistics scheduling
+ private final @NonNull HashedWheelTimer privateTimer = new HashedWheelTimer();
+ private final @NonNull Timer timer = new Timer() {
+ @Override
+ public Timeout newTimeout(final TimerTask task, final long delay, final TimeUnit unit) {
+ return privateTimer.newTimeout(task, delay, unit);
+ }
+
+ @Override
+ public Set<Timeout> stop() {
+ // Do not allow the timer to be shut down
+ throw new UnsupportedOperationException();
+ }
+ };
+
// We are reusing our monitor as the universal lock. We have to account for three distinct threads competing for
// our state:
// 1) the typical DTCL callback thread invoking onDataTreeChanged()
return pceServerProvider;
}
+ @Override
+ public Timer getTimer() {
+ return timer;
+ }
+
@Override
public synchronized void close() {
if (reg == null) {
instances.values().forEach(PCEPTopologySingleton::destroy);
// Second pass: wait for cleanup
instances.values().forEach(PCEPTopologySingleton::awaitCleanup);
+
+ // Stop the timer
+ final var cancelledTasks = privateTimer.stop().size();
+ if (cancelledTasks != 0) {
+ LOG.warn("Stopped timer with {} remaining tasks", cancelledTasks);
+ }
+
LOG.info("PCEP Topology tracker shut down");
}
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.MoreExecutors;
import com.google.common.util.concurrent.SettableFuture;
-import io.netty.util.HashedWheelTimer;
import io.netty.util.Timeout;
import java.net.InetAddress;
import java.util.HashMap;
private final @NonNull KeyedInstanceIdentifier<Topology, TopologyKey> topology;
private final @NonNull PCEPTopologyProviderDependencies dependencies;
- private final @NonNull HashedWheelTimer timer = new HashedWheelTimer();
@VisibleForTesting
final AtomicBoolean isClosed = new AtomicBoolean(false);
}
state.clear();
- // Stop the timer
- final var cancelledTasks = timer.stop().size();
- if (cancelledTasks != 0) {
- LOG.warn("Stopped timer with {} remaining tasks", cancelledTasks);
- }
-
// Un-Register Pcep Topology into PCE Server
final PceServerProvider server = dependencies.getPceServerProvider();
if (server != null) {
final @Nullable Timeout newRpcTimeout(final RpcTimeout task, final SrpIdNumber requestId) {
final short localTimeout = rpcTimeout;
return localTimeout <= 0 ? null
- : timer.newTimeout(ignored -> task.run(requestId), localTimeout, TimeUnit.SECONDS);
+ : dependencies.getTimer().newTimeout(ignored -> task.run(requestId), localTimeout, TimeUnit.SECONDS);
}
final void setRpcTimeout(final short rpcTimeout) {
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.EventLoop;
+import io.netty.util.HashedWheelTimer;
+import io.netty.util.Timer;
import io.netty.util.concurrent.Promise;
import java.net.InetSocketAddress;
import java.util.ArrayList;
private PCEPTopologyProviderDependencies topologyDependencies;
@Mock
private Promise<PCEPSessionImpl> promise;
+
+ private final Timer timer = new HashedWheelTimer();
private DefaultPCEPSessionNegotiator neg;
@Before
doReturn(getDataBroker()).when(topologyDependencies).getDataBroker();
doReturn(statsRegistry).when(topologyDependencies).getStateRegistry();
+ doReturn(timer).when(topologyDependencies).getTimer();
doReturn(null).when(topologyDependencies).getPceServerProvider();
manager = customizeSessionManager(new ServerSessionManager(TOPO_IID, topologyDependencies, RPC_TIMEOUT,
@After
public void tearDown() {
stopSessionManager();
+ timer.stop();
}
Ero createEroWithIpPrefixes(final List<String> ipPrefixes) {