diff --git a/core/api/src/main/java/org/onosproject/mastership/MastershipService.java b/core/api/src/main/java/org/onosproject/mastership/MastershipService.java index 450bcc545e..79eef94e50 100644 --- a/core/api/src/main/java/org/onosproject/mastership/MastershipService.java +++ b/core/api/src/main/java/org/onosproject/mastership/MastershipService.java @@ -55,8 +55,9 @@ public interface MastershipService { * for this device, no master selection will occur. * * @param deviceId the identifier of the device + * @return future that is completed when relinquish is complete */ - void relinquishMastership(DeviceId deviceId); + CompletableFuture relinquishMastership(DeviceId deviceId); /** * Returns the current master for a given device. diff --git a/core/api/src/test/java/org/onosproject/mastership/MastershipServiceAdapter.java b/core/api/src/test/java/org/onosproject/mastership/MastershipServiceAdapter.java index aff67cde75..7db9b38b4c 100644 --- a/core/api/src/test/java/org/onosproject/mastership/MastershipServiceAdapter.java +++ b/core/api/src/test/java/org/onosproject/mastership/MastershipServiceAdapter.java @@ -38,7 +38,8 @@ public class MastershipServiceAdapter implements MastershipService { } @Override - public void relinquishMastership(DeviceId deviceId) { + public CompletableFuture relinquishMastership(DeviceId deviceId) { + return null; } @Override diff --git a/core/net/src/main/java/org/onosproject/cluster/impl/MastershipManager.java b/core/net/src/main/java/org/onosproject/cluster/impl/MastershipManager.java index cc33d5666a..1ac073a0f2 100644 --- a/core/net/src/main/java/org/onosproject/cluster/impl/MastershipManager.java +++ b/core/net/src/main/java/org/onosproject/cluster/impl/MastershipManager.java @@ -95,12 +95,13 @@ public class MastershipManager @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) protected MetricsService metricsService; + private NodeId localNodeId; private Timer requestRoleTimer; @Activate public void activate() { requestRoleTimer = createTimer("Mastership", "requestRole", "responseTime"); - + localNodeId = clusterService.getLocalNode().id(); eventDispatcher.addSink(MastershipEvent.class, listenerRegistry); store.setDelegate(delegate); log.info("Started"); @@ -136,11 +137,8 @@ public class MastershipManager return CompletableFuture.completedFuture(null); } - return eventFuture.whenComplete((event, error) -> { - if (event != null) { - post(event); - } - }).thenApply(v -> null); + return eventFuture.thenAccept(this::post) + .thenApply(v -> null); } @Override @@ -152,15 +150,11 @@ public class MastershipManager } @Override - public void relinquishMastership(DeviceId deviceId) { + public CompletableFuture relinquishMastership(DeviceId deviceId) { checkPermission(Permission.CLUSTER_WRITE); - - store.relinquishRole(clusterService.getLocalNode().id(), deviceId) - .whenComplete((event, error) -> { - if (event != null) { - post(event); - } - }); + return store.relinquishRole(localNodeId, deviceId) + .thenAccept(this::post) + .thenApply(v -> null); } @Override diff --git a/core/net/src/main/java/org/onosproject/net/device/impl/DeviceManager.java b/core/net/src/main/java/org/onosproject/net/device/impl/DeviceManager.java index 37c431e1ad..73bbe2f7e7 100644 --- a/core/net/src/main/java/org/onosproject/net/device/impl/DeviceManager.java +++ b/core/net/src/main/java/org/onosproject/net/device/impl/DeviceManager.java @@ -16,7 +16,6 @@ package org.onosproject.net.device.impl; import com.google.common.collect.Lists; - import org.apache.felix.scr.annotations.Activate; import org.apache.felix.scr.annotations.Component; import org.apache.felix.scr.annotations.Deactivate; @@ -411,8 +410,15 @@ public class DeviceManager } }); } finally { - //relinquish master role and ability to be backup. - mastershipService.relinquishMastership(deviceId); + try { + //relinquish master role and ability to be backup. + mastershipService.relinquishMastership(deviceId).get(); + } catch (InterruptedException e) { + log.warn("Interrupted while reliquishing role for {}", deviceId); + Thread.currentThread().interrupt(); + } catch (ExecutionException e) { + log.error("Exception thrown while relinquishing role for {}", deviceId, e); + } } } diff --git a/core/net/src/test/java/org/onosproject/net/device/impl/DeviceManagerTest.java b/core/net/src/test/java/org/onosproject/net/device/impl/DeviceManagerTest.java index 0b6c3e0852..fdda578371 100644 --- a/core/net/src/test/java/org/onosproject/net/device/impl/DeviceManagerTest.java +++ b/core/net/src/test/java/org/onosproject/net/device/impl/DeviceManagerTest.java @@ -310,6 +310,11 @@ public class DeviceManagerTest { return CompletableFuture.completedFuture(MastershipRole.MASTER); } + @Override + public CompletableFuture relinquishMastership(DeviceId deviceId) { + return CompletableFuture.completedFuture(null); + } + @Override public MastershipTerm getMastershipTerm(DeviceId deviceId) { // FIXME: just returning something not null diff --git a/core/store/dist/src/test/java/org/onosproject/store/device/impl/GossipDeviceStoreTest.java b/core/store/dist/src/test/java/org/onosproject/store/device/impl/GossipDeviceStoreTest.java index 68eb73d67d..dc08e7644a 100644 --- a/core/store/dist/src/test/java/org/onosproject/store/device/impl/GossipDeviceStoreTest.java +++ b/core/store/dist/src/test/java/org/onosproject/store/device/impl/GossipDeviceStoreTest.java @@ -37,6 +37,7 @@ import org.onosproject.net.Annotations; import org.onosproject.net.DefaultAnnotations; import org.onosproject.net.Device; import org.onosproject.net.DeviceId; +import org.onosproject.net.MastershipRole; import org.onosproject.net.Port; import org.onosproject.net.PortNumber; import org.onosproject.net.SparseAnnotations; @@ -62,6 +63,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; @@ -854,6 +856,10 @@ public class GossipDeviceStoreTest { public NodeId getMasterFor(DeviceId deviceId) { return NID1; } + @Override + public CompletableFuture requestRoleFor(DeviceId deviceId) { + return CompletableFuture.completedFuture(null); + } } private static final class TestGossipDeviceStore extends GossipDeviceStore { diff --git a/providers/lldp/src/test/java/org/onosproject/provider/lldp/impl/LLDPLinkProviderTest.java b/providers/lldp/src/test/java/org/onosproject/provider/lldp/impl/LLDPLinkProviderTest.java index 4395914452..f6627af08b 100644 --- a/providers/lldp/src/test/java/org/onosproject/provider/lldp/impl/LLDPLinkProviderTest.java +++ b/providers/lldp/src/test/java/org/onosproject/provider/lldp/impl/LLDPLinkProviderTest.java @@ -502,8 +502,8 @@ public class LLDPLinkProviderTest { } @Override - public void relinquishMastership(DeviceId deviceId) { - + public CompletableFuture relinquishMastership(DeviceId deviceId) { + return null; } @Override