Showing
3 changed files
with
75 additions
and
1 deletions
... | @@ -120,6 +120,7 @@ public class GossipDeviceStore | ... | @@ -120,6 +120,7 @@ public class GossipDeviceStore |
120 | .register(KryoPoolUtil.API) | 120 | .register(KryoPoolUtil.API) |
121 | .register(InternalDeviceEvent.class, new InternalDeviceEventSerializer()) | 121 | .register(InternalDeviceEvent.class, new InternalDeviceEventSerializer()) |
122 | .register(InternalDeviceOfflineEvent.class, new InternalDeviceOfflineEventSerializer()) | 122 | .register(InternalDeviceOfflineEvent.class, new InternalDeviceOfflineEventSerializer()) |
123 | + .register(InternalDeviceRemovedEvent.class) | ||
123 | .register(InternalPortEvent.class, new InternalPortEventSerializer()) | 124 | .register(InternalPortEvent.class, new InternalPortEventSerializer()) |
124 | .register(InternalPortStatusEvent.class, new InternalPortStatusEventSerializer()) | 125 | .register(InternalPortStatusEvent.class, new InternalPortStatusEventSerializer()) |
125 | .register(Timestamp.class) | 126 | .register(Timestamp.class) |
... | @@ -138,6 +139,8 @@ public class GossipDeviceStore | ... | @@ -138,6 +139,8 @@ public class GossipDeviceStore |
138 | clusterCommunicator.addSubscriber( | 139 | clusterCommunicator.addSubscriber( |
139 | GossipDeviceStoreMessageSubjects.DEVICE_OFFLINE, new InternalDeviceOfflineEventListener()); | 140 | GossipDeviceStoreMessageSubjects.DEVICE_OFFLINE, new InternalDeviceOfflineEventListener()); |
140 | clusterCommunicator.addSubscriber( | 141 | clusterCommunicator.addSubscriber( |
142 | + GossipDeviceStoreMessageSubjects.DEVICE_REMOVED, new InternalDeviceRemovedEventListener()); | ||
143 | + clusterCommunicator.addSubscriber( | ||
141 | GossipDeviceStoreMessageSubjects.PORT_UPDATE, new InternalPortEventListener()); | 144 | GossipDeviceStoreMessageSubjects.PORT_UPDATE, new InternalPortEventListener()); |
142 | clusterCommunicator.addSubscriber( | 145 | clusterCommunicator.addSubscriber( |
143 | GossipDeviceStoreMessageSubjects.PORT_STATUS_UPDATE, new InternalPortStatusEventListener()); | 146 | GossipDeviceStoreMessageSubjects.PORT_STATUS_UPDATE, new InternalPortStatusEventListener()); |
... | @@ -583,7 +586,16 @@ public class GossipDeviceStore | ... | @@ -583,7 +586,16 @@ public class GossipDeviceStore |
583 | public synchronized DeviceEvent removeDevice(DeviceId deviceId) { | 586 | public synchronized DeviceEvent removeDevice(DeviceId deviceId) { |
584 | Timestamp timestamp = clockService.getTimestamp(deviceId); | 587 | Timestamp timestamp = clockService.getTimestamp(deviceId); |
585 | DeviceEvent event = removeDeviceInternal(deviceId, timestamp); | 588 | DeviceEvent event = removeDeviceInternal(deviceId, timestamp); |
586 | - // TODO: broadcast removal event | 589 | + if (event != null) { |
590 | + log.info("Notifying peers of a device removed topology event for deviceId: {}", | ||
591 | + deviceId); | ||
592 | + try { | ||
593 | + notifyPeers(new InternalDeviceRemovedEvent(deviceId, timestamp)); | ||
594 | + } catch (IOException e) { | ||
595 | + log.error("Failed to notify peers of a device removed topology event for deviceId: {}", | ||
596 | + deviceId); | ||
597 | + } | ||
598 | + } | ||
587 | return event; | 599 | return event; |
588 | } | 600 | } |
589 | 601 | ||
... | @@ -834,6 +846,14 @@ public class GossipDeviceStore | ... | @@ -834,6 +846,14 @@ public class GossipDeviceStore |
834 | clusterCommunicator.broadcast(message); | 846 | clusterCommunicator.broadcast(message); |
835 | } | 847 | } |
836 | 848 | ||
849 | + private void notifyPeers(InternalDeviceRemovedEvent event) throws IOException { | ||
850 | + ClusterMessage message = new ClusterMessage( | ||
851 | + clusterService.getLocalNode().id(), | ||
852 | + GossipDeviceStoreMessageSubjects.DEVICE_REMOVED, | ||
853 | + SERIALIZER.encode(event)); | ||
854 | + clusterCommunicator.broadcast(message); | ||
855 | + } | ||
856 | + | ||
837 | private void notifyPeers(InternalPortEvent event) throws IOException { | 857 | private void notifyPeers(InternalPortEvent event) throws IOException { |
838 | ClusterMessage message = new ClusterMessage( | 858 | ClusterMessage message = new ClusterMessage( |
839 | clusterService.getLocalNode().id(), | 859 | clusterService.getLocalNode().id(), |
... | @@ -879,6 +899,20 @@ public class GossipDeviceStore | ... | @@ -879,6 +899,20 @@ public class GossipDeviceStore |
879 | } | 899 | } |
880 | } | 900 | } |
881 | 901 | ||
902 | + private class InternalDeviceRemovedEventListener implements ClusterMessageHandler { | ||
903 | + @Override | ||
904 | + public void handle(ClusterMessage message) { | ||
905 | + | ||
906 | + log.info("Received device removed event from peer: {}", message.sender()); | ||
907 | + InternalDeviceRemovedEvent event = (InternalDeviceRemovedEvent) SERIALIZER.decode(message.payload()); | ||
908 | + | ||
909 | + DeviceId deviceId = event.deviceId(); | ||
910 | + Timestamp timestamp = event.timestamp(); | ||
911 | + | ||
912 | + removeDeviceInternal(deviceId, timestamp); | ||
913 | + } | ||
914 | + } | ||
915 | + | ||
882 | private class InternalPortEventListener implements ClusterMessageHandler { | 916 | private class InternalPortEventListener implements ClusterMessageHandler { |
883 | @Override | 917 | @Override |
884 | public void handle(ClusterMessage message) { | 918 | public void handle(ClusterMessage message) { | ... | ... |
core/store/dist/src/main/java/org/onlab/onos/store/device/impl/GossipDeviceStoreMessageSubjects.java
... | @@ -11,6 +11,7 @@ public final class GossipDeviceStoreMessageSubjects { | ... | @@ -11,6 +11,7 @@ public final class GossipDeviceStoreMessageSubjects { |
11 | 11 | ||
12 | public static final MessageSubject DEVICE_UPDATE = new MessageSubject("peer-device-update"); | 12 | public static final MessageSubject DEVICE_UPDATE = new MessageSubject("peer-device-update"); |
13 | public static final MessageSubject DEVICE_OFFLINE = new MessageSubject("peer-device-offline"); | 13 | public static final MessageSubject DEVICE_OFFLINE = new MessageSubject("peer-device-offline"); |
14 | + public static final MessageSubject DEVICE_REMOVED = new MessageSubject("peer-device-removed"); | ||
14 | public static final MessageSubject PORT_UPDATE = new MessageSubject("peer-port-update"); | 15 | public static final MessageSubject PORT_UPDATE = new MessageSubject("peer-port-update"); |
15 | public static final MessageSubject PORT_STATUS_UPDATE = new MessageSubject("peer-port-status-update"); | 16 | public static final MessageSubject PORT_STATUS_UPDATE = new MessageSubject("peer-port-status-update"); |
16 | } | 17 | } | ... | ... |
core/store/dist/src/main/java/org/onlab/onos/store/device/impl/InternalDeviceRemovedEvent.java
0 → 100644
1 | +package org.onlab.onos.store.device.impl; | ||
2 | + | ||
3 | +import org.onlab.onos.net.DeviceId; | ||
4 | +import org.onlab.onos.store.Timestamp; | ||
5 | + | ||
6 | +/** | ||
7 | + * Information published by GossipDeviceStore to notify peers of a device | ||
8 | + * being administratively removed. | ||
9 | + */ | ||
10 | +public class InternalDeviceRemovedEvent { | ||
11 | + | ||
12 | + private final DeviceId deviceId; | ||
13 | + private final Timestamp timestamp; | ||
14 | + | ||
15 | + /** | ||
16 | + * Creates a InternalDeviceRemovedEvent. | ||
17 | + * @param deviceId identifier of the removed device. | ||
18 | + * @param timestamp timestamp of when the device was administratively removed. | ||
19 | + */ | ||
20 | + public InternalDeviceRemovedEvent(DeviceId deviceId, Timestamp timestamp) { | ||
21 | + this.deviceId = deviceId; | ||
22 | + this.timestamp = timestamp; | ||
23 | + } | ||
24 | + | ||
25 | + public DeviceId deviceId() { | ||
26 | + return deviceId; | ||
27 | + } | ||
28 | + | ||
29 | + public Timestamp timestamp() { | ||
30 | + return timestamp; | ||
31 | + } | ||
32 | + | ||
33 | + // for serializer | ||
34 | + @SuppressWarnings("unused") | ||
35 | + private InternalDeviceRemovedEvent() { | ||
36 | + deviceId = null; | ||
37 | + timestamp = null; | ||
38 | + } | ||
39 | +} |
-
Please register or login to post a comment