Committed by
Yuta Higuchi
LLDPLinkProvider listens to MastershipEvents
Change-Id: Iaa3655c680a8fc93921f0b83dc4fc16311222bf9
Showing
6 changed files
with
91 additions
and
28 deletions
... | @@ -149,8 +149,6 @@ public class LambdaForwarding { | ... | @@ -149,8 +149,6 @@ public class LambdaForwarding { |
149 | break; | 149 | break; |
150 | case DEVICE_AVAILABILITY_CHANGED: | 150 | case DEVICE_AVAILABILITY_CHANGED: |
151 | break; | 151 | break; |
152 | - case DEVICE_MASTERSHIP_CHANGED: | ||
153 | - break; | ||
154 | case DEVICE_REMOVED: | 152 | case DEVICE_REMOVED: |
155 | break; | 153 | break; |
156 | case DEVICE_SUSPENDED: | 154 | case DEVICE_SUSPENDED: | ... | ... |
... | @@ -146,8 +146,6 @@ public class MPLSForwarding { | ... | @@ -146,8 +146,6 @@ public class MPLSForwarding { |
146 | break; | 146 | break; |
147 | case DEVICE_AVAILABILITY_CHANGED: | 147 | case DEVICE_AVAILABILITY_CHANGED: |
148 | break; | 148 | break; |
149 | - case DEVICE_MASTERSHIP_CHANGED: | ||
150 | - break; | ||
151 | case DEVICE_REMOVED: | 149 | case DEVICE_REMOVED: |
152 | break; | 150 | break; |
153 | case DEVICE_SUSPENDED: | 151 | case DEVICE_SUSPENDED: | ... | ... |
... | @@ -60,12 +60,6 @@ public class DeviceEvent extends AbstractEvent<DeviceEvent.Type, Device> { | ... | @@ -60,12 +60,6 @@ public class DeviceEvent extends AbstractEvent<DeviceEvent.Type, Device> { |
60 | DEVICE_AVAILABILITY_CHANGED, | 60 | DEVICE_AVAILABILITY_CHANGED, |
61 | 61 | ||
62 | /** | 62 | /** |
63 | - * Signifies that the current controller instance relationship has | ||
64 | - * changed with respect to a device. | ||
65 | - */ | ||
66 | - DEVICE_MASTERSHIP_CHANGED, | ||
67 | - | ||
68 | - /** | ||
69 | * Signifies that a port has been added. | 63 | * Signifies that a port has been added. |
70 | */ | 64 | */ |
71 | PORT_ADDED, | 65 | PORT_ADDED, | ... | ... |
... | @@ -16,7 +16,6 @@ | ... | @@ -16,7 +16,6 @@ |
16 | package org.onlab.onos.net.device.impl; | 16 | package org.onlab.onos.net.device.impl; |
17 | 17 | ||
18 | import static com.google.common.base.Preconditions.checkNotNull; | 18 | import static com.google.common.base.Preconditions.checkNotNull; |
19 | -import static org.onlab.onos.net.device.DeviceEvent.Type.DEVICE_MASTERSHIP_CHANGED; | ||
20 | import static org.onlab.onos.net.MastershipRole.*; | 19 | import static org.onlab.onos.net.MastershipRole.*; |
21 | import static org.onlab.util.Tools.namedThreads; | 20 | import static org.onlab.util.Tools.namedThreads; |
22 | import static org.slf4j.LoggerFactory.getLogger; | 21 | import static org.slf4j.LoggerFactory.getLogger; |
... | @@ -315,8 +314,6 @@ public class DeviceManager | ... | @@ -315,8 +314,6 @@ public class DeviceManager |
315 | if (event != null) { | 314 | if (event != null) { |
316 | log.trace("event: {} {}", event.type(), event); | 315 | log.trace("event: {} {}", event.type(), event); |
317 | post(event); | 316 | post(event); |
318 | - } else { | ||
319 | - post(new DeviceEvent(DEVICE_MASTERSHIP_CHANGED, store.getDevice(deviceId))); | ||
320 | } | 317 | } |
321 | } | 318 | } |
322 | 319 | ... | ... |
... | @@ -441,7 +441,6 @@ public class ProxyArpManager implements ProxyArpService { | ... | @@ -441,7 +441,6 @@ public class ProxyArpManager implements ProxyArpService { |
441 | switch (event.type()) { | 441 | switch (event.type()) { |
442 | case DEVICE_ADDED: | 442 | case DEVICE_ADDED: |
443 | case DEVICE_AVAILABILITY_CHANGED: | 443 | case DEVICE_AVAILABILITY_CHANGED: |
444 | - case DEVICE_MASTERSHIP_CHANGED: | ||
445 | case DEVICE_SUSPENDED: | 444 | case DEVICE_SUSPENDED: |
446 | case DEVICE_UPDATED: | 445 | case DEVICE_UPDATED: |
447 | // nothing to do in these cases; handled when links get reported | 446 | // nothing to do in these cases; handled when links get reported | ... | ... |
... | @@ -20,6 +20,8 @@ import org.apache.felix.scr.annotations.Component; | ... | @@ -20,6 +20,8 @@ import org.apache.felix.scr.annotations.Component; |
20 | import org.apache.felix.scr.annotations.Deactivate; | 20 | import org.apache.felix.scr.annotations.Deactivate; |
21 | import org.apache.felix.scr.annotations.Reference; | 21 | import org.apache.felix.scr.annotations.Reference; |
22 | import org.apache.felix.scr.annotations.ReferenceCardinality; | 22 | import org.apache.felix.scr.annotations.ReferenceCardinality; |
23 | +import org.onlab.onos.mastership.MastershipEvent; | ||
24 | +import org.onlab.onos.mastership.MastershipListener; | ||
23 | import org.onlab.onos.mastership.MastershipService; | 25 | import org.onlab.onos.mastership.MastershipService; |
24 | import org.onlab.onos.net.ConnectPoint; | 26 | import org.onlab.onos.net.ConnectPoint; |
25 | import org.onlab.onos.net.Device; | 27 | import org.onlab.onos.net.Device; |
... | @@ -40,7 +42,11 @@ import org.slf4j.Logger; | ... | @@ -40,7 +42,11 @@ import org.slf4j.Logger; |
40 | 42 | ||
41 | import java.util.Map; | 43 | import java.util.Map; |
42 | import java.util.concurrent.ConcurrentHashMap; | 44 | import java.util.concurrent.ConcurrentHashMap; |
45 | +import java.util.concurrent.ScheduledExecutorService; | ||
46 | +import java.util.concurrent.TimeUnit; | ||
43 | 47 | ||
48 | +import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor; | ||
49 | +import static org.onlab.util.Tools.namedThreads; | ||
44 | import static org.slf4j.LoggerFactory.getLogger; | 50 | import static org.slf4j.LoggerFactory.getLogger; |
45 | 51 | ||
46 | 52 | ||
... | @@ -67,11 +73,17 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { | ... | @@ -67,11 +73,17 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { |
67 | 73 | ||
68 | private LinkProviderService providerService; | 74 | private LinkProviderService providerService; |
69 | 75 | ||
76 | + private ScheduledExecutorService executor; | ||
77 | + | ||
70 | private final boolean useBDDP = true; | 78 | private final boolean useBDDP = true; |
71 | 79 | ||
80 | + private static final long INIT_DELAY = 5; | ||
81 | + private static final long DELAY = 5; | ||
72 | 82 | ||
73 | private final InternalLinkProvider listener = new InternalLinkProvider(); | 83 | private final InternalLinkProvider listener = new InternalLinkProvider(); |
74 | 84 | ||
85 | + private final InternalRoleListener roleListener = new InternalRoleListener(); | ||
86 | + | ||
75 | protected final Map<DeviceId, LinkDiscovery> discoverers = new ConcurrentHashMap<>(); | 87 | protected final Map<DeviceId, LinkDiscovery> discoverers = new ConcurrentHashMap<>(); |
76 | 88 | ||
77 | /** | 89 | /** |
... | @@ -86,6 +98,8 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { | ... | @@ -86,6 +98,8 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { |
86 | providerService = providerRegistry.register(this); | 98 | providerService = providerRegistry.register(this); |
87 | deviceService.addListener(listener); | 99 | deviceService.addListener(listener); |
88 | packetSevice.addProcessor(listener, 0); | 100 | packetSevice.addProcessor(listener, 0); |
101 | + masterService.addListener(roleListener); | ||
102 | + | ||
89 | LinkDiscovery ld; | 103 | LinkDiscovery ld; |
90 | for (Device device : deviceService.getDevices()) { | 104 | for (Device device : deviceService.getDevices()) { |
91 | ld = new LinkDiscovery(device, packetSevice, masterService, | 105 | ld = new LinkDiscovery(device, packetSevice, masterService, |
... | @@ -98,22 +112,57 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { | ... | @@ -98,22 +112,57 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { |
98 | } | 112 | } |
99 | } | 113 | } |
100 | 114 | ||
115 | + executor = newSingleThreadScheduledExecutor(namedThreads("device-sync-%d")); | ||
116 | + executor.scheduleAtFixedRate(new SyncDeviceInfoTask(), INIT_DELAY, | ||
117 | + DELAY, TimeUnit.SECONDS); | ||
118 | + | ||
101 | log.info("Started"); | 119 | log.info("Started"); |
102 | } | 120 | } |
103 | 121 | ||
104 | @Deactivate | 122 | @Deactivate |
105 | public void deactivate() { | 123 | public void deactivate() { |
124 | + executor.shutdownNow(); | ||
106 | for (LinkDiscovery ld : discoverers.values()) { | 125 | for (LinkDiscovery ld : discoverers.values()) { |
107 | ld.stop(); | 126 | ld.stop(); |
108 | } | 127 | } |
109 | providerRegistry.unregister(this); | 128 | providerRegistry.unregister(this); |
110 | deviceService.removeListener(listener); | 129 | deviceService.removeListener(listener); |
111 | packetSevice.removeProcessor(listener); | 130 | packetSevice.removeProcessor(listener); |
131 | + masterService.removeListener(roleListener); | ||
112 | providerService = null; | 132 | providerService = null; |
113 | 133 | ||
114 | log.info("Stopped"); | 134 | log.info("Stopped"); |
115 | } | 135 | } |
116 | 136 | ||
137 | + private class InternalRoleListener implements MastershipListener { | ||
138 | + | ||
139 | + @Override | ||
140 | + public void event(MastershipEvent event) { | ||
141 | + | ||
142 | + if (MastershipEvent.Type.BACKUPS_CHANGED.equals(event.type())) { | ||
143 | + // only need new master events | ||
144 | + return; | ||
145 | + } | ||
146 | + | ||
147 | + DeviceId deviceId = event.subject(); | ||
148 | + Device device = deviceService.getDevice(deviceId); | ||
149 | + if (device == null) { | ||
150 | + log.warn("Device {} doesn't exist, or isn't there yet", deviceId); | ||
151 | + return; | ||
152 | + } | ||
153 | + synchronized (discoverers) { | ||
154 | + if (!discoverers.containsKey(deviceId)) { | ||
155 | + // TODO: ideally, should never reach here | ||
156 | + log.debug("Device mastership changed ({}) {}", | ||
157 | + event.type(), deviceId); | ||
158 | + discoverers.put(deviceId, new LinkDiscovery(device, | ||
159 | + packetSevice, masterService, providerService, | ||
160 | + useBDDP)); | ||
161 | + } | ||
162 | + } | ||
163 | + } | ||
164 | + | ||
165 | + } | ||
117 | 166 | ||
118 | private class InternalLinkProvider implements PacketProcessor, DeviceListener { | 167 | private class InternalLinkProvider implements PacketProcessor, DeviceListener { |
119 | 168 | ||
... | @@ -131,18 +180,22 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { | ... | @@ -131,18 +180,22 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { |
131 | switch (event.type()) { | 180 | switch (event.type()) { |
132 | case DEVICE_ADDED: | 181 | case DEVICE_ADDED: |
133 | case DEVICE_UPDATED: | 182 | case DEVICE_UPDATED: |
183 | + synchronized (discoverers) { | ||
134 | ld = discoverers.get(deviceId); | 184 | ld = discoverers.get(deviceId); |
135 | if (ld == null) { | 185 | if (ld == null) { |
136 | - log.debug("Device added ({}) {}", event.type(), deviceId); | 186 | + log.debug("Device added ({}) {}", event.type(), |
137 | - discoverers.put(deviceId, | 187 | + deviceId); |
138 | - new LinkDiscovery(device, packetSevice, masterService, | 188 | + discoverers.put(deviceId, new LinkDiscovery(device, |
139 | - providerService, useBDDP)); | 189 | + packetSevice, masterService, providerService, |
190 | + useBDDP)); | ||
140 | } else { | 191 | } else { |
141 | if (ld.isStopped()) { | 192 | if (ld.isStopped()) { |
142 | - log.debug("Device restarted ({}) {}", event.type(), deviceId); | 193 | + log.debug("Device restarted ({}) {}", event.type(), |
194 | + deviceId); | ||
143 | ld.start(); | 195 | ld.start(); |
144 | } | 196 | } |
145 | } | 197 | } |
198 | + } | ||
146 | break; | 199 | break; |
147 | case PORT_ADDED: | 200 | case PORT_ADDED: |
148 | case PORT_UPDATED: | 201 | case PORT_UPDATED: |
... | @@ -193,15 +246,6 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { | ... | @@ -193,15 +246,6 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { |
193 | ld.stop(); | 246 | ld.stop(); |
194 | } | 247 | } |
195 | break; | 248 | break; |
196 | - case DEVICE_MASTERSHIP_CHANGED: | ||
197 | - if (!discoverers.containsKey(deviceId)) { | ||
198 | - // TODO: ideally, should never reach here | ||
199 | - log.debug("Device mastership changed ({}) {}", event.type(), deviceId); | ||
200 | - discoverers.put(deviceId, | ||
201 | - new LinkDiscovery(device, packetSevice, masterService, | ||
202 | - providerService, useBDDP)); | ||
203 | - } | ||
204 | - break; | ||
205 | default: | 249 | default: |
206 | log.debug("Unknown event {}", event); | 250 | log.debug("Unknown event {}", event); |
207 | } | 251 | } |
... | @@ -224,4 +268,37 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { | ... | @@ -224,4 +268,37 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { |
224 | } | 268 | } |
225 | } | 269 | } |
226 | 270 | ||
271 | + private final class SyncDeviceInfoTask implements Runnable { | ||
272 | + | ||
273 | + @Override | ||
274 | + public void run() { | ||
275 | + if (Thread.currentThread().isInterrupted()) { | ||
276 | + log.info("Interrupted, quitting"); | ||
277 | + return; | ||
278 | + } | ||
279 | + // check what deviceService sees, to see if we are missing anything | ||
280 | + try { | ||
281 | + LinkDiscovery ld = null; | ||
282 | + for (Device dev : deviceService.getDevices()) { | ||
283 | + DeviceId did = dev.id(); | ||
284 | + synchronized (discoverers) { | ||
285 | + if (!discoverers.containsKey(did)) { | ||
286 | + ld = new LinkDiscovery(dev, packetSevice, | ||
287 | + masterService, providerService, useBDDP); | ||
288 | + discoverers.put(did, ld); | ||
289 | + for (Port p : deviceService.getPorts(did)) { | ||
290 | + if (!p.number().isLogical()) { | ||
291 | + ld.addPort(p); | ||
292 | + } | ||
293 | + } | ||
294 | + } | ||
295 | + } | ||
296 | + } | ||
297 | + } catch (Exception e) { | ||
298 | + // catch all Exception to avoid Scheduled task being suppressed. | ||
299 | + log.error("Exception thrown during synchronization process", e); | ||
300 | + } | ||
301 | + } | ||
302 | + } | ||
303 | + | ||
227 | } | 304 | } | ... | ... |
-
Please register or login to post a comment