Committed by
Gerrit Code Review
Fix unhandled exception during shutdown due to provider service being unavailable
Change-Id: I891b2d3c64576fe7cace80ff7907551b46054db6
Showing
1 changed file
with
35 additions
and
20 deletions
| ... | @@ -177,6 +177,7 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr | ... | @@ -177,6 +177,7 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr |
| 177 | @Deactivate | 177 | @Deactivate |
| 178 | public void deactivate(ComponentContext context) { | 178 | public void deactivate(ComponentContext context) { |
| 179 | cfgService.unregisterProperties(getClass(), false); | 179 | cfgService.unregisterProperties(getClass(), false); |
| 180 | + listener.disable(); | ||
| 180 | controller.removeListener(listener); | 181 | controller.removeListener(listener); |
| 181 | providerRegistry.unregister(this); | 182 | providerRegistry.unregister(this); |
| 182 | collectors.values().forEach(PortStatsCollector::stop); | 183 | collectors.values().forEach(PortStatsCollector::stop); |
| ... | @@ -344,6 +345,7 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr | ... | @@ -344,6 +345,7 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr |
| 344 | private class InternalDeviceProvider implements OpenFlowSwitchListener, OpenFlowEventListener { | 345 | private class InternalDeviceProvider implements OpenFlowSwitchListener, OpenFlowEventListener { |
| 345 | 346 | ||
| 346 | private HashMap<Dpid, List<OFPortStatsEntry>> portStatsReplies = new HashMap<>(); | 347 | private HashMap<Dpid, List<OFPortStatsEntry>> portStatsReplies = new HashMap<>(); |
| 348 | + private boolean isDisabled = false; | ||
| 347 | 349 | ||
| 348 | @Override | 350 | @Override |
| 349 | public void switchAdded(Dpid dpid) { | 351 | public void switchAdded(Dpid dpid) { |
| ... | @@ -773,30 +775,43 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr | ... | @@ -773,30 +775,43 @@ public class OpenFlowDeviceProvider extends AbstractProvider implements DevicePr |
| 773 | 775 | ||
| 774 | @Override | 776 | @Override |
| 775 | public void handleMessage(Dpid dpid, OFMessage msg) { | 777 | public void handleMessage(Dpid dpid, OFMessage msg) { |
| 776 | - switch (msg.getType()) { | 778 | + if (isDisabled) { |
| 777 | - case STATS_REPLY: | 779 | + return; |
| 778 | - if (((OFStatsReply) msg).getStatsType() == OFStatsType.PORT) { | 780 | + } |
| 779 | - OFPortStatsReply portStatsReply = (OFPortStatsReply) msg; | 781 | + |
| 780 | - List<OFPortStatsEntry> portStatsReplyList = portStatsReplies.get(dpid); | 782 | + try { |
| 781 | - if (portStatsReplyList == null) { | 783 | + switch (msg.getType()) { |
| 782 | - portStatsReplyList = Lists.newArrayList(); | 784 | + case STATS_REPLY: |
| 785 | + if (((OFStatsReply) msg).getStatsType() == OFStatsType.PORT) { | ||
| 786 | + OFPortStatsReply portStatsReply = (OFPortStatsReply) msg; | ||
| 787 | + List<OFPortStatsEntry> portStatsReplyList = portStatsReplies.get(dpid); | ||
| 788 | + if (portStatsReplyList == null) { | ||
| 789 | + portStatsReplyList = Lists.newArrayList(); | ||
| 790 | + } | ||
| 791 | + portStatsReplyList.addAll(portStatsReply.getEntries()); | ||
| 792 | + portStatsReplies.put(dpid, portStatsReplyList); | ||
| 793 | + if (!portStatsReply.getFlags().contains(OFStatsReplyFlags.REPLY_MORE)) { | ||
| 794 | + pushPortMetrics(dpid, portStatsReplies.get(dpid)); | ||
| 795 | + portStatsReplies.get(dpid).clear(); | ||
| 796 | + } | ||
| 783 | } | 797 | } |
| 784 | - portStatsReplyList.addAll(portStatsReply.getEntries()); | 798 | + break; |
| 785 | - portStatsReplies.put(dpid, portStatsReplyList); | 799 | + case ERROR: |
| 786 | - if (!portStatsReply.getFlags().contains(OFStatsReplyFlags.REPLY_MORE)) { | 800 | + if (((OFErrorMsg) msg).getErrType() == OFErrorType.PORT_MOD_FAILED) { |
| 787 | - pushPortMetrics(dpid, portStatsReplies.get(dpid)); | 801 | + LOG.error("port mod failed"); |
| 788 | - portStatsReplies.get(dpid).clear(); | ||
| 789 | } | 802 | } |
| 790 | - } | 803 | + default: |
| 791 | - break; | 804 | + break; |
| 792 | - case ERROR: | 805 | + } |
| 793 | - if (((OFErrorMsg) msg).getErrType() == OFErrorType.PORT_MOD_FAILED) { | 806 | + } catch (IllegalStateException e) { |
| 794 | - LOG.error("port mod failed"); | 807 | + // system is shutting down and the providerService is no longer |
| 795 | - } | 808 | + // valid. Messages cannot be processed. |
| 796 | - default: | ||
| 797 | - break; | ||
| 798 | } | 809 | } |
| 799 | } | 810 | } |
| 811 | + | ||
| 812 | + private void disable() { | ||
| 813 | + isDisabled = true; | ||
| 814 | + } | ||
| 800 | } | 815 | } |
| 801 | 816 | ||
| 802 | 817 | ... | ... |
-
Please register or login to post a comment