From c7e035fa03c1b2215b8e1a3308c86e7eadb76228 Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Tue, 5 Jul 2016 17:47:51 -0400 Subject: [PATCH] NIFI-2160 fixed service startup ordering fixed imports --- .../StandardControllerServiceNode.java | 4 +- .../StandardControllerServiceProvider.java | 27 ++++---- ...TestStandardControllerServiceProvider.java | 66 ++++++++++++++----- 3 files changed, 67 insertions(+), 30 deletions(-) diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceNode.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceNode.java index 2deb4ed41e8a..7a416afb9b01 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceNode.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceNode.java @@ -115,7 +115,7 @@ public void addReference(final ConfiguredComponent referencingComponent) { @Override public List getRequiredControllerServices() { - List requiredServices = new ArrayList<>(); + Set requiredServices = new HashSet<>(); for (Entry pEntry : this.getProperties().entrySet()) { PropertyDescriptor descriptor = pEntry.getKey(); if (descriptor.getControllerServiceDefinition() != null && descriptor.isRequired()) { @@ -124,7 +124,7 @@ public List getRequiredControllerServices() { requiredServices.addAll(rNode.getRequiredControllerServices()); } } - return requiredServices; + return new ArrayList<>(requiredServices); } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceProvider.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceProvider.java index 4b1875136c58..58add5d8cb54 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceProvider.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/service/StandardControllerServiceProvider.java @@ -25,7 +25,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.Comparator; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -313,17 +312,11 @@ public void enableControllerServices(final Collection ser } if (shouldStart) { - List services = new ArrayList<>(serviceNodes); - Collections.sort(services, new Comparator() { - @Override - public int compare(ControllerServiceNode s1, ControllerServiceNode s2) { - return s2.getRequiredControllerServices().contains(s1) ? -1 : 1; - } - }); - - for (ControllerServiceNode controllerServiceNode : services) { + for (ControllerServiceNode controllerServiceNode : serviceNodes) { try { - this.enableControllerService(controllerServiceNode); + if (!controllerServiceNode.isActive()) { + this.enableControllerServiceDependenciesFirst(controllerServiceNode); + } } catch (Exception e) { logger.error("Failed to enable " + controllerServiceNode + " due to " + e); if (this.bulletinRepo != null) { @@ -335,6 +328,18 @@ public int compare(ControllerServiceNode s1, ControllerServiceNode s2) { } } + private void enableControllerServiceDependenciesFirst(ControllerServiceNode serviceNode) { + for (ControllerServiceNode depNode : serviceNode.getRequiredControllerServices()) { + if (!depNode.isActive()) { + this.enableControllerServiceDependenciesFirst(depNode); + } + } + if (logger.isDebugEnabled()) { + logger.debug("Enabling " + serviceNode); + } + this.enableControllerService(serviceNode); + } + static List> determineEnablingOrder(final Map serviceNodeMap) { final List> orderedNodeLists = new ArrayList<>(); diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/controller/service/TestStandardControllerServiceProvider.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/controller/service/TestStandardControllerServiceProvider.java index 8041aefd2233..857252a3ff05 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/controller/service/TestStandardControllerServiceProvider.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/controller/service/TestStandardControllerServiceProvider.java @@ -371,26 +371,58 @@ public void validateEnableServices() { StandardProcessScheduler scheduler = createScheduler(); StandardControllerServiceProvider provider = new StandardControllerServiceProvider(scheduler, null, stateManagerProvider, null); - ControllerServiceNode serviceNode1 = provider.createControllerService(ServiceA.class.getName(), "1", false); - ControllerServiceNode serviceNode2 = provider.createControllerService(ServiceA.class.getName(), "2", false); - ControllerServiceNode serviceNode3 = provider.createControllerService(ServiceA.class.getName(), "3", false); - ControllerServiceNode serviceNode4 = provider.createControllerService(ServiceB.class.getName(), "4", false); - ControllerServiceNode serviceNode5 = provider.createControllerService(ServiceA.class.getName(), "5", false); + ControllerServiceNode A = provider.createControllerService(ServiceA.class.getName(), "A", false); + ControllerServiceNode B = provider.createControllerService(ServiceA.class.getName(), "B", false); + ControllerServiceNode C = provider.createControllerService(ServiceA.class.getName(), "C", false); + ControllerServiceNode D = provider.createControllerService(ServiceB.class.getName(), "D", false); + ControllerServiceNode E = provider.createControllerService(ServiceA.class.getName(), "E", false); + + A.setProperty(ServiceA.OTHER_SERVICE.getName(), "B"); + B.setProperty(ServiceA.OTHER_SERVICE.getName(), "D"); + C.setProperty(ServiceA.OTHER_SERVICE.getName(), "B"); + C.setProperty(ServiceA.OTHER_SERVICE_2.getName(), "D"); + E.setProperty(ServiceA.OTHER_SERVICE.getName(), "A"); + + provider.enableControllerServices(Arrays.asList(new ControllerServiceNode[] { A, B, C, D, E })); + + assertTrue(A.isActive()); + assertTrue(B.isActive()); + assertTrue(C.isActive()); + assertTrue(D.isActive()); + assertTrue(E.isActive()); + } - serviceNode1.setProperty(ServiceA.OTHER_SERVICE.getName(), "2"); - serviceNode2.setProperty(ServiceA.OTHER_SERVICE.getName(), "4"); - serviceNode3.setProperty(ServiceA.OTHER_SERVICE.getName(), "2"); - serviceNode3.setProperty(ServiceA.OTHER_SERVICE_2.getName(), "4"); - serviceNode5.setProperty(ServiceA.OTHER_SERVICE.getName(), "1"); + /** + * This test is similar to the above, but different combination of service + * dependencies + * + */ + @Test + public void validateEnableServices2() { + StandardProcessScheduler scheduler = createScheduler(); + StandardControllerServiceProvider provider = new StandardControllerServiceProvider(scheduler, null, + stateManagerProvider, null); - provider.enableControllerServices( - Arrays.asList(new ControllerServiceNode[] { serviceNode1, serviceNode2, serviceNode3, serviceNode4, serviceNode5})); + ControllerServiceNode A = provider.createControllerService(ServiceC.class.getName(), "A", false); + ControllerServiceNode B = provider.createControllerService(ServiceA.class.getName(), "B", false); + ControllerServiceNode C = provider.createControllerService(ServiceB.class.getName(), "C", false); + ControllerServiceNode D = provider.createControllerService(ServiceA.class.getName(), "D", false); + ControllerServiceNode F = provider.createControllerService(ServiceA.class.getName(), "F", false); - assertTrue(serviceNode1.isActive()); - assertTrue(serviceNode2.isActive()); - assertTrue(serviceNode3.isActive()); - assertTrue(serviceNode4.isActive()); - assertTrue(serviceNode5.isActive()); + A.setProperty(ServiceC.REQ_SERVICE_1.getName(), "B"); + A.setProperty(ServiceC.REQ_SERVICE_2.getName(), "D"); + B.setProperty(ServiceA.OTHER_SERVICE.getName(), "C"); + + F.setProperty(ServiceA.OTHER_SERVICE.getName(), "D"); + D.setProperty(ServiceA.OTHER_SERVICE.getName(), "C"); + + provider.enableControllerServices(Arrays.asList(new ControllerServiceNode[] { C, F, A, B, D })); + + assertTrue(A.isActive()); + assertTrue(B.isActive()); + assertTrue(C.isActive()); + assertTrue(D.isActive()); + assertTrue(F.isActive()); } @Test