import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider;
import org.opendaylight.protocol.pcep.PCEPDispatcher;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.topology.stats.rpc.rev190321.PcepTopologyStatsRpcService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev220730.TopologyTypes1;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.rev220730.topology.pcep.type.TopologyPcep;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
private final @NonNull PCEPDispatcher pcepDispatcher;
private final @NonNull DataBroker dataBroker;
- // Statistics provider
- private final @NonNull TopologyStatsProvider statsProvider;
-
// Timer used for RPC timeouts and session statistics scheduling
private final @NonNull HashedWheelTimer privateTimer = new HashedWheelTimer();
private final @NonNull Timer timer = new Timer() {
}
};
+ // Statistics provider
+ private final @NonNull TopologyStatsProvider statsProvider;
+ // Statistics RPCs
+ private final @NonNull TopologyStatsRpcServiceImpl statsRpcs;
+
// 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()
private final ConcurrentMap<TopologyKey, PCEPTopologySingleton> instances = new ConcurrentHashMap<>();
@GuardedBy("this")
private Registration reg;
+ @GuardedBy("this")
+ private Registration statsReg;
public PCEPTopologyTracker(final DataBroker dataBroker, final ClusterSingletonServiceProvider singletonService,
final RpcProviderService rpcProviderRegistry, final PCEPDispatcher pcepDispatcher,
this.instructionSchedulerFactory = requireNonNull(instructionSchedulerFactory);
this.pceServerProvider = requireNonNull(pceServerProvider);
statsProvider = new TopologyStatsProvider(dataBroker, updateIntervalSeconds);
+ statsRpcs = new TopologyStatsRpcServiceImpl(dataBroker);
+ statsReg = rpcProviderRegistry.registerRpcImplementation(PcepTopologyStatsRpcService.class, statsRpcs);
reg = dataBroker.registerDataTreeChangeListener(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION,
InstanceIdentifier.builder(NetworkTopology.class).child(Topology.class).child(TopologyTypes.class)
reg.close();
reg = null;
+ statsReg.close();
+ statsReg = null;
+ statsRpcs.close();
+
// First pass: destroy all tracked instances
instances.values().forEach(PCEPTopologySingleton::destroy);
// Second pass: wait for cleanup
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public final class TopologyStatsRpcServiceImpl
+final class TopologyStatsRpcServiceImpl
implements PcepTopologyStatsRpcService, ClusteredDataTreeChangeListener<PcepSessionState>, AutoCloseable {
private static final Logger LOG = LoggerFactory.getLogger(TopologyStatsRpcServiceImpl.class);
new ConcurrentHashMap<>();
private ListenerRegistration<TopologyStatsRpcServiceImpl> listenerRegistration;
- public TopologyStatsRpcServiceImpl(final DataBroker dataBroker) {
+ TopologyStatsRpcServiceImpl(final DataBroker dataBroker) {
LOG.info("Initializing PCEP Topology Stats RPC service.");
listenerRegistration = dataBroker.registerDataTreeChangeListener(
DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL,