Committed by
Gerrit Code Review
Clear FPM routes when the FPM connection goes down.
Change-Id: I20b7eca27150aad9958cf872edbbfa973a003af9
Showing
2 changed files
with
53 additions
and
3 deletions
| ... | @@ -19,6 +19,10 @@ import com.google.common.collect.ImmutableMap; | ... | @@ -19,6 +19,10 @@ import com.google.common.collect.ImmutableMap; |
| 19 | import org.apache.felix.scr.annotations.Activate; | 19 | import org.apache.felix.scr.annotations.Activate; |
| 20 | import org.apache.felix.scr.annotations.Component; | 20 | import org.apache.felix.scr.annotations.Component; |
| 21 | import org.apache.felix.scr.annotations.Deactivate; | 21 | import org.apache.felix.scr.annotations.Deactivate; |
| 22 | +import org.apache.felix.scr.annotations.Modified; | ||
| 23 | +import org.apache.felix.scr.annotations.Property; | ||
| 24 | +import org.apache.felix.scr.annotations.Reference; | ||
| 25 | +import org.apache.felix.scr.annotations.ReferenceCardinality; | ||
| 22 | import org.apache.felix.scr.annotations.Service; | 26 | import org.apache.felix.scr.annotations.Service; |
| 23 | import org.jboss.netty.bootstrap.ServerBootstrap; | 27 | import org.jboss.netty.bootstrap.ServerBootstrap; |
| 24 | import org.jboss.netty.channel.Channel; | 28 | import org.jboss.netty.channel.Channel; |
| ... | @@ -32,6 +36,8 @@ import org.jboss.netty.channel.group.DefaultChannelGroup; | ... | @@ -32,6 +36,8 @@ import org.jboss.netty.channel.group.DefaultChannelGroup; |
| 32 | import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory; | 36 | import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory; |
| 33 | import org.onlab.packet.IpAddress; | 37 | import org.onlab.packet.IpAddress; |
| 34 | import org.onlab.packet.IpPrefix; | 38 | import org.onlab.packet.IpPrefix; |
| 39 | +import org.onlab.util.Tools; | ||
| 40 | +import org.onosproject.cfg.ComponentConfigService; | ||
| 35 | import org.onosproject.routing.RouteEntry; | 41 | import org.onosproject.routing.RouteEntry; |
| 36 | import org.onosproject.routing.RouteListener; | 42 | import org.onosproject.routing.RouteListener; |
| 37 | import org.onosproject.routing.RouteSourceService; | 43 | import org.onosproject.routing.RouteSourceService; |
| ... | @@ -43,14 +49,18 @@ import org.onosproject.routing.fpm.protocol.RouteAttributeDst; | ... | @@ -43,14 +49,18 @@ import org.onosproject.routing.fpm.protocol.RouteAttributeDst; |
| 43 | import org.onosproject.routing.fpm.protocol.RouteAttributeGateway; | 49 | import org.onosproject.routing.fpm.protocol.RouteAttributeGateway; |
| 44 | import org.onosproject.routing.fpm.protocol.RtNetlink; | 50 | import org.onosproject.routing.fpm.protocol.RtNetlink; |
| 45 | import org.onosproject.routing.fpm.protocol.RtProtocol; | 51 | import org.onosproject.routing.fpm.protocol.RtProtocol; |
| 52 | +import org.osgi.service.component.ComponentContext; | ||
| 46 | import org.slf4j.Logger; | 53 | import org.slf4j.Logger; |
| 47 | import org.slf4j.LoggerFactory; | 54 | import org.slf4j.LoggerFactory; |
| 48 | 55 | ||
| 49 | import java.net.InetSocketAddress; | 56 | import java.net.InetSocketAddress; |
| 50 | import java.net.SocketAddress; | 57 | import java.net.SocketAddress; |
| 51 | import java.util.Collections; | 58 | import java.util.Collections; |
| 59 | +import java.util.Dictionary; | ||
| 60 | +import java.util.List; | ||
| 52 | import java.util.Map; | 61 | import java.util.Map; |
| 53 | import java.util.concurrent.ConcurrentHashMap; | 62 | import java.util.concurrent.ConcurrentHashMap; |
| 63 | +import java.util.stream.Collectors; | ||
| 54 | 64 | ||
| 55 | import static java.util.concurrent.Executors.newCachedThreadPool; | 65 | import static java.util.concurrent.Executors.newCachedThreadPool; |
| 56 | import static org.onlab.util.Tools.groupedThreads; | 66 | import static org.onlab.util.Tools.groupedThreads; |
| ... | @@ -63,6 +73,11 @@ import static org.onlab.util.Tools.groupedThreads; | ... | @@ -63,6 +73,11 @@ import static org.onlab.util.Tools.groupedThreads; |
| 63 | public class FpmManager implements RouteSourceService, FpmInfoService { | 73 | public class FpmManager implements RouteSourceService, FpmInfoService { |
| 64 | private final Logger log = LoggerFactory.getLogger(getClass()); | 74 | private final Logger log = LoggerFactory.getLogger(getClass()); |
| 65 | 75 | ||
| 76 | + private static final int FPM_PORT = 2620; | ||
| 77 | + | ||
| 78 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
| 79 | + protected ComponentConfigService componentConfigService; | ||
| 80 | + | ||
| 66 | private ServerBootstrap serverBootstrap; | 81 | private ServerBootstrap serverBootstrap; |
| 67 | private Channel serverChannel; | 82 | private Channel serverChannel; |
| 68 | private ChannelGroup allChannels = new DefaultChannelGroup(); | 83 | private ChannelGroup allChannels = new DefaultChannelGroup(); |
| ... | @@ -73,19 +88,36 @@ public class FpmManager implements RouteSourceService, FpmInfoService { | ... | @@ -73,19 +88,36 @@ public class FpmManager implements RouteSourceService, FpmInfoService { |
| 73 | 88 | ||
| 74 | private RouteListener routeListener; | 89 | private RouteListener routeListener; |
| 75 | 90 | ||
| 76 | - private static final int FPM_PORT = 2620; | 91 | + @Property(name = "clearRoutes", boolValue = true, |
| 92 | + label = "Whether to clear routes when the FPM connection goes down") | ||
| 93 | + private boolean clearRoutes = true; | ||
| 77 | 94 | ||
| 78 | @Activate | 95 | @Activate |
| 79 | - protected void activate() { | 96 | + protected void activate(ComponentContext context) { |
| 97 | + componentConfigService.registerProperties(getClass()); | ||
| 98 | + modified(context); | ||
| 80 | log.info("Started"); | 99 | log.info("Started"); |
| 81 | } | 100 | } |
| 82 | 101 | ||
| 83 | @Deactivate | 102 | @Deactivate |
| 84 | protected void deactivate() { | 103 | protected void deactivate() { |
| 85 | stopServer(); | 104 | stopServer(); |
| 105 | + componentConfigService.unregisterProperties(getClass(), false); | ||
| 86 | log.info("Stopped"); | 106 | log.info("Stopped"); |
| 87 | } | 107 | } |
| 88 | 108 | ||
| 109 | + @Modified | ||
| 110 | + protected void modified(ComponentContext context) { | ||
| 111 | + Dictionary<?, ?> properties = context.getProperties(); | ||
| 112 | + if (properties == null) { | ||
| 113 | + return; | ||
| 114 | + } | ||
| 115 | + String strClearRoutes = Tools.get(properties, "clearRoutes"); | ||
| 116 | + clearRoutes = Boolean.parseBoolean(strClearRoutes); | ||
| 117 | + | ||
| 118 | + log.info("clearRoutes set to {}", clearRoutes); | ||
| 119 | + } | ||
| 120 | + | ||
| 89 | private void startServer() { | 121 | private void startServer() { |
| 90 | ChannelFactory channelFactory = new NioServerSocketChannelFactory( | 122 | ChannelFactory channelFactory = new NioServerSocketChannelFactory( |
| 91 | newCachedThreadPool(groupedThreads("onos/fpm", "sm-boss-%d")), | 123 | newCachedThreadPool(groupedThreads("onos/fpm", "sm-boss-%d")), |
| ... | @@ -127,6 +159,10 @@ public class FpmManager implements RouteSourceService, FpmInfoService { | ... | @@ -127,6 +159,10 @@ public class FpmManager implements RouteSourceService, FpmInfoService { |
| 127 | if (serverBootstrap != null) { | 159 | if (serverBootstrap != null) { |
| 128 | serverBootstrap.releaseExternalResources(); | 160 | serverBootstrap.releaseExternalResources(); |
| 129 | } | 161 | } |
| 162 | + | ||
| 163 | + if (clearRoutes) { | ||
| 164 | + clearRoutes(); | ||
| 165 | + } | ||
| 130 | } | 166 | } |
| 131 | 167 | ||
| 132 | @Override | 168 | @Override |
| ... | @@ -213,6 +249,15 @@ public class FpmManager implements RouteSourceService, FpmInfoService { | ... | @@ -213,6 +249,15 @@ public class FpmManager implements RouteSourceService, FpmInfoService { |
| 213 | routeListener.update(Collections.singletonList(routeUpdate)); | 249 | routeListener.update(Collections.singletonList(routeUpdate)); |
| 214 | } | 250 | } |
| 215 | 251 | ||
| 252 | + | ||
| 253 | + private void clearRoutes() { | ||
| 254 | + log.info("Clearing all routes"); | ||
| 255 | + List<RouteUpdate> routeUpdates = fpmRoutes.values().stream() | ||
| 256 | + .map(routeEntry -> new RouteUpdate(RouteUpdate.Type.DELETE, routeEntry)) | ||
| 257 | + .collect(Collectors.toList()); | ||
| 258 | + routeListener.update(routeUpdates); | ||
| 259 | + } | ||
| 260 | + | ||
| 216 | @Override | 261 | @Override |
| 217 | public Map<SocketAddress, Long> peers() { | 262 | public Map<SocketAddress, Long> peers() { |
| 218 | return ImmutableMap.copyOf(peers); | 263 | return ImmutableMap.copyOf(peers); |
| ... | @@ -236,6 +281,12 @@ public class FpmManager implements RouteSourceService, FpmInfoService { | ... | @@ -236,6 +281,12 @@ public class FpmManager implements RouteSourceService, FpmInfoService { |
| 236 | 281 | ||
| 237 | @Override | 282 | @Override |
| 238 | public void peerDisconnected(SocketAddress address) { | 283 | public void peerDisconnected(SocketAddress address) { |
| 284 | + log.info("FPM connection to {} went down", address); | ||
| 285 | + | ||
| 286 | + if (clearRoutes) { | ||
| 287 | + clearRoutes(); | ||
| 288 | + } | ||
| 289 | + | ||
| 239 | peers.remove(address); | 290 | peers.remove(address); |
| 240 | } | 291 | } |
| 241 | } | 292 | } | ... | ... |
| ... | @@ -91,7 +91,6 @@ public class FpmSessionHandler extends SimpleChannelHandler { | ... | @@ -91,7 +91,6 @@ public class FpmSessionHandler extends SimpleChannelHandler { |
| 91 | @Override | 91 | @Override |
| 92 | public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) | 92 | public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) |
| 93 | throws Exception { | 93 | throws Exception { |
| 94 | - handleDisconnect(); | ||
| 95 | } | 94 | } |
| 96 | 95 | ||
| 97 | private void handleDisconnect() { | 96 | private void handleDisconnect() { | ... | ... |
-
Please register or login to post a comment