MD-SAL Statistics-manager was not removing the statistics request entries from request scheduler queue. So even if
node is getting disconnected, request scheduler was sending the request down to the plugin and plugin was throwing
IllegalArgumentException. With this fix, whenever node get disconnected its respective NodeStatisticsHandler clean up
its pending statistics request from scheduler queue.
Change-Id: Ie70544b11f660531312c29ff89bb868761104282
Signed-off-by: Anil Vishnoi <avishnoi@in.ibm.com>
meterStats.close();
queueStats.close();
meterStats.close();
queueStats.close();
+ //Clean up queued statistics request from scheduler queue
+ srScheduler.removeRequestsFromSchedulerQueue(this.getNodeRef());
+
logger.debug("Statistics handler for {} shut down", targetNodeKey.getId());
}
logger.debug("Statistics handler for {} shut down", targetNodeKey.getId());
}
import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction.DataTransactionListener;
import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction.DataTransactionListener;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
requestQueue.put(statsRequest, null);
}
requestQueue.put(statsRequest, null);
}
+ public void removeRequestsFromSchedulerQueue(NodeRef node){
+ AbstractStatsTracker stats = null;
+ synchronized(requestQueue){
+ Iterator<Map.Entry<AbstractStatsTracker, Integer>> nodesItr = requestQueue.entrySet().iterator();
+ while(nodesItr.hasNext()){
+ stats = nodesItr.next().getKey();
+ if(stats.getNodeRef().equals(node)){
+ nodesItr.remove();
+ }
+ }
+ }
+
+ }
public AbstractStatsTracker getNextRequestFromSchedulerQueue(){
//Remove first element
AbstractStatsTracker stats = null;
public AbstractStatsTracker getNextRequestFromSchedulerQueue(){
//Remove first element
AbstractStatsTracker stats = null;
private void requestStatistics(){
AbstractStatsTracker stats = this.getNextRequestFromSchedulerQueue();
private void requestStatistics(){
AbstractStatsTracker stats = this.getNextRequestFromSchedulerQueue();
- if(stats != null) {
- stats.request();
- stats.increaseRequestCounter();
- }
+ sendStatsRequest(stats);
}
@Override
public void onStatusUpdated(DataModificationTransaction transaction, TransactionStatus status) {
}
@Override
public void onStatusUpdated(DataModificationTransaction transaction, TransactionStatus status) {
+ sendStatsRequest(stats);
+ }
+
+ private void sendStatsRequest(AbstractStatsTracker stats){
- stats.request();
- stats.increaseRequestCounter();
+ try{
+ stats.request();
+ stats.increaseRequestCounter();
+ }catch(Exception e){
+ srsLogger.warn("Statistics request was not sent successfully. Reason : {}",e.getMessage());
+ }
public void start(){
timer.schedule(task, 0, REQUEST_MONITOR_INTERVAL);
}
public void start(){
timer.schedule(task, 0, REQUEST_MONITOR_INTERVAL);
}