Showing
2 changed files
with
44 additions
and
3 deletions
... | @@ -119,8 +119,10 @@ public class GossipDeviceStore | ... | @@ -119,8 +119,10 @@ public class GossipDeviceStore |
119 | serializerPool = KryoPool.newBuilder() | 119 | serializerPool = KryoPool.newBuilder() |
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(InternalPortEvent.class, new InternalPortEventSerializer()) | 123 | .register(InternalPortEvent.class, new InternalPortEventSerializer()) |
123 | .register(InternalPortStatusEvent.class, new InternalPortStatusEventSerializer()) | 124 | .register(InternalPortStatusEvent.class, new InternalPortStatusEventSerializer()) |
125 | + .register(Timestamp.class) | ||
124 | .register(Timestamped.class) | 126 | .register(Timestamped.class) |
125 | .register(MastershipBasedTimestamp.class, new MastershipBasedTimestampSerializer()) | 127 | .register(MastershipBasedTimestamp.class, new MastershipBasedTimestampSerializer()) |
126 | .build() | 128 | .build() |
... | @@ -134,6 +136,8 @@ public class GossipDeviceStore | ... | @@ -134,6 +136,8 @@ public class GossipDeviceStore |
134 | clusterCommunicator.addSubscriber( | 136 | clusterCommunicator.addSubscriber( |
135 | GossipDeviceStoreMessageSubjects.DEVICE_UPDATE, new InternalDeviceEventListener()); | 137 | GossipDeviceStoreMessageSubjects.DEVICE_UPDATE, new InternalDeviceEventListener()); |
136 | clusterCommunicator.addSubscriber( | 138 | clusterCommunicator.addSubscriber( |
139 | + GossipDeviceStoreMessageSubjects.DEVICE_OFFLINE, new InternalDeviceOfflineEventListener()); | ||
140 | + clusterCommunicator.addSubscriber( | ||
137 | GossipDeviceStoreMessageSubjects.PORT_UPDATE, new InternalPortEventListener()); | 141 | GossipDeviceStoreMessageSubjects.PORT_UPDATE, new InternalPortEventListener()); |
138 | clusterCommunicator.addSubscriber( | 142 | clusterCommunicator.addSubscriber( |
139 | GossipDeviceStoreMessageSubjects.PORT_STATUS_UPDATE, new InternalPortStatusEventListener()); | 143 | GossipDeviceStoreMessageSubjects.PORT_STATUS_UPDATE, new InternalPortStatusEventListener()); |
... | @@ -177,7 +181,7 @@ public class GossipDeviceStore | ... | @@ -177,7 +181,7 @@ public class GossipDeviceStore |
177 | try { | 181 | try { |
178 | notifyPeers(new InternalDeviceEvent(providerId, deviceId, deltaDesc)); | 182 | notifyPeers(new InternalDeviceEvent(providerId, deviceId, deltaDesc)); |
179 | } catch (IOException e) { | 183 | } catch (IOException e) { |
180 | - log.error("Failed to notify peers of a device update topology event or providerId: " | 184 | + log.error("Failed to notify peers of a device update topology event for providerId: " |
181 | + providerId + " and deviceId: " + deviceId, e); | 185 | + providerId + " and deviceId: " + deviceId, e); |
182 | } | 186 | } |
183 | } | 187 | } |
... | @@ -280,7 +284,18 @@ public class GossipDeviceStore | ... | @@ -280,7 +284,18 @@ public class GossipDeviceStore |
280 | @Override | 284 | @Override |
281 | public DeviceEvent markOffline(DeviceId deviceId) { | 285 | public DeviceEvent markOffline(DeviceId deviceId) { |
282 | Timestamp timestamp = clockService.getTimestamp(deviceId); | 286 | Timestamp timestamp = clockService.getTimestamp(deviceId); |
283 | - return markOfflineInternal(deviceId, timestamp); | 287 | + DeviceEvent event = markOfflineInternal(deviceId, timestamp); |
288 | + if (event != null) { | ||
289 | + log.info("Notifying peers of a device offline topology event for deviceId: {}", | ||
290 | + deviceId); | ||
291 | + try { | ||
292 | + notifyPeers(new InternalDeviceOfflineEvent(deviceId, timestamp)); | ||
293 | + } catch (IOException e) { | ||
294 | + log.error("Failed to notify peers of a device offline topology event for deviceId: {}", | ||
295 | + deviceId); | ||
296 | + } | ||
297 | + } | ||
298 | + return event; | ||
284 | } | 299 | } |
285 | 300 | ||
286 | private DeviceEvent markOfflineInternal(DeviceId deviceId, Timestamp timestamp) { | 301 | private DeviceEvent markOfflineInternal(DeviceId deviceId, Timestamp timestamp) { |
... | @@ -811,6 +826,14 @@ public class GossipDeviceStore | ... | @@ -811,6 +826,14 @@ public class GossipDeviceStore |
811 | clusterCommunicator.broadcast(message); | 826 | clusterCommunicator.broadcast(message); |
812 | } | 827 | } |
813 | 828 | ||
829 | + private void notifyPeers(InternalDeviceOfflineEvent event) throws IOException { | ||
830 | + ClusterMessage message = new ClusterMessage( | ||
831 | + clusterService.getLocalNode().id(), | ||
832 | + GossipDeviceStoreMessageSubjects.DEVICE_OFFLINE, | ||
833 | + SERIALIZER.encode(event)); | ||
834 | + clusterCommunicator.broadcast(message); | ||
835 | + } | ||
836 | + | ||
814 | private void notifyPeers(InternalPortEvent event) throws IOException { | 837 | private void notifyPeers(InternalPortEvent event) throws IOException { |
815 | ClusterMessage message = new ClusterMessage( | 838 | ClusterMessage message = new ClusterMessage( |
816 | clusterService.getLocalNode().id(), | 839 | clusterService.getLocalNode().id(), |
... | @@ -830,15 +853,32 @@ public class GossipDeviceStore | ... | @@ -830,15 +853,32 @@ public class GossipDeviceStore |
830 | private class InternalDeviceEventListener implements ClusterMessageHandler { | 853 | private class InternalDeviceEventListener implements ClusterMessageHandler { |
831 | @Override | 854 | @Override |
832 | public void handle(ClusterMessage message) { | 855 | public void handle(ClusterMessage message) { |
856 | + | ||
833 | log.info("Received device update event from peer: {}", message.sender()); | 857 | log.info("Received device update event from peer: {}", message.sender()); |
834 | InternalDeviceEvent event = (InternalDeviceEvent) SERIALIZER.decode(message.payload()); | 858 | InternalDeviceEvent event = (InternalDeviceEvent) SERIALIZER.decode(message.payload()); |
859 | + | ||
835 | ProviderId providerId = event.providerId(); | 860 | ProviderId providerId = event.providerId(); |
836 | DeviceId deviceId = event.deviceId(); | 861 | DeviceId deviceId = event.deviceId(); |
837 | Timestamped<DeviceDescription> deviceDescription = event.deviceDescription(); | 862 | Timestamped<DeviceDescription> deviceDescription = event.deviceDescription(); |
863 | + | ||
838 | createOrUpdateDeviceInternal(providerId, deviceId, deviceDescription); | 864 | createOrUpdateDeviceInternal(providerId, deviceId, deviceDescription); |
839 | } | 865 | } |
840 | } | 866 | } |
841 | 867 | ||
868 | + private class InternalDeviceOfflineEventListener implements ClusterMessageHandler { | ||
869 | + @Override | ||
870 | + public void handle(ClusterMessage message) { | ||
871 | + | ||
872 | + log.info("Received device offline event from peer: {}", message.sender()); | ||
873 | + InternalDeviceOfflineEvent event = (InternalDeviceOfflineEvent) SERIALIZER.decode(message.payload()); | ||
874 | + | ||
875 | + DeviceId deviceId = event.deviceId(); | ||
876 | + Timestamp timestamp = event.timestamp(); | ||
877 | + | ||
878 | + markOfflineInternal(deviceId, timestamp); | ||
879 | + } | ||
880 | + } | ||
881 | + | ||
842 | private class InternalPortEventListener implements ClusterMessageHandler { | 882 | private class InternalPortEventListener implements ClusterMessageHandler { |
843 | @Override | 883 | @Override |
844 | public void handle(ClusterMessage message) { | 884 | public void handle(ClusterMessage message) { | ... | ... |
core/store/dist/src/main/java/org/onlab/onos/store/device/impl/GossipDeviceStoreMessageSubjects.java
... | @@ -3,13 +3,14 @@ package org.onlab.onos.store.device.impl; | ... | @@ -3,13 +3,14 @@ package org.onlab.onos.store.device.impl; |
3 | import org.onlab.onos.store.cluster.messaging.MessageSubject; | 3 | import org.onlab.onos.store.cluster.messaging.MessageSubject; |
4 | 4 | ||
5 | /** | 5 | /** |
6 | - * MessageSubjects used by GossipDeviceStore. | 6 | + * MessageSubjects used by GossipDeviceStore peer-peer communication. |
7 | */ | 7 | */ |
8 | public final class GossipDeviceStoreMessageSubjects { | 8 | public final class GossipDeviceStoreMessageSubjects { |
9 | 9 | ||
10 | private GossipDeviceStoreMessageSubjects() {} | 10 | private 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 PORT_UPDATE = new MessageSubject("peer-port-update"); | 14 | public static final MessageSubject PORT_UPDATE = new MessageSubject("peer-port-update"); |
14 | public static final MessageSubject PORT_STATUS_UPDATE = new MessageSubject("peer-port-status-update"); | 15 | public static final MessageSubject PORT_STATUS_UPDATE = new MessageSubject("peer-port-status-update"); |
15 | } | 16 | } | ... | ... |
-
Please register or login to post a comment