Improve scalability of P4Runtime subsystem
The P4Runtime client was hanging (deadlock) on a master arbitration
request. As such, all other requests (e.g. table write) were waiting
for the client's request lock to become available.
Apart from fixing those deadlocks, this patch brings a number of
improvements that all together allow to run networks of 100+ P4Runtime
devices on a single ONOS instance (before only ~20 devices)
Includes:
- Asynchrounous mastership handling in DevicHandshaker (as defined in
the P4Runtime and OpenFlow spec)
- Refactored arbitration handling in the P4RuntimeClient
to be consistent with the P4Runtime spec
- Report suspect deadlocks in P4RuntimeClientImpl
- Exploit write errors in P4RuntimeClient to quickly report
channel/mastership errors to upper layers
- Complete all futures with deadlines in P4Runtime driver
- Dump all tables in one request
- Re-purposed ChannelEvent to DeviceAgentEvent to carry also mastership
response events
- Fixed IntelliJ warnings
- Various code and log clean-ups
Change-Id: I9376793a9fe69d8eddf7e8ac2ef0ee4c14fbd198
diff --git a/core/api/src/main/java/org/onosproject/net/device/DeviceHandshaker.java b/core/api/src/main/java/org/onosproject/net/device/DeviceHandshaker.java
index 606248a..bc870d3 100644
--- a/core/api/src/main/java/org/onosproject/net/device/DeviceHandshaker.java
+++ b/core/api/src/main/java/org/onosproject/net/device/DeviceHandshaker.java
@@ -30,38 +30,41 @@
public interface DeviceHandshaker extends DeviceConnect {
/**
- * Checks the reachability (connectivity) of a device.
- * Reachability, unlike availability, denotes whether THIS particular node
- * can send messages and receive replies from the specified device.
+ * Checks the reachability (connectivity) of a device. Reachability, unlike
+ * availability, denotes whether THIS particular node can send messages and
+ * receive replies from the specified device.
*
* @return CompletableFuture eventually true if reachable, false otherwise
*/
CompletableFuture<Boolean> isReachable();
/**
- * Applies on the device a mastership role change as decided by the core.
+ * Notifies the device a mastership role change as decided by the core. The
+ * implementation of this method should trigger a {@link DeviceAgentEvent}
+ * signaling the mastership role accepted by the device.
*
- * @param newRole newly determined mastership role
- * @return CompletableFuture with the mastership role accepted from the device
+ * @param newRole new mastership role
*/
- CompletableFuture<MastershipRole> roleChanged(MastershipRole newRole);
+ void roleChanged(MastershipRole newRole);
/**
- * Applies a listener to a channel established with the device.
+ * Adds a device agent listener.
*
- * @param listener the channel listener
+ * @param listener device agent listener
*/
- default void addChannelListener(ChannelListener listener) {
- throw new UnsupportedOperationException("Listener Registration not supported");
+ default void addDeviceAgentListener(DeviceAgentListener listener) {
+ throw new UnsupportedOperationException(
+ "Device agent listener registration not supported");
}
/**
- * Removes a listener to a channel established with the device.
+ * Removes a device agent listener.
*
- * @param listener the channel listener
+ * @param listener device agent listener
*/
- default void removeChannelListener(ChannelListener listener) {
- throw new UnsupportedOperationException("Listener Removal not supported");
+ default void removeDeviceAgentListener(DeviceAgentListener listener) {
+ throw new UnsupportedOperationException(
+ "Device agent listener removal not supported");
}
}