From b6f6422b119d0fc8390c57316ab2a0404e6832b5 Mon Sep 17 00:00:00 2001 From: timyuer <524860213@qq.com> Date: Sat, 13 Dec 2025 18:14:49 +0800 Subject: [PATCH 1/4] BIGTOP-4513: Optimize service order execution logic --- .../job/service/AbstractServiceJob.java | 111 ++++++++++++++++++ .../command/job/service/ServiceAddJob.java | 27 +++-- .../job/service/ServiceConfigureJob.java | 21 +++- .../job/service/ServiceRestartJob.java | 15 ++- .../command/job/service/ServiceStartJob.java | 7 +- .../command/job/service/ServiceStopJob.java | 7 +- 6 files changed, 167 insertions(+), 21 deletions(-) diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/AbstractServiceJob.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/AbstractServiceJob.java index c8ab24abb..dd8010e2d 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/AbstractServiceJob.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/AbstractServiceJob.java @@ -28,12 +28,17 @@ import org.apache.bigtop.manager.server.command.job.AbstractJob; import org.apache.bigtop.manager.server.command.job.JobContext; import org.apache.bigtop.manager.server.holder.SpringContextHolder; +import org.apache.bigtop.manager.server.model.dto.ServiceDTO; import org.apache.bigtop.manager.server.model.dto.command.ServiceCommandDTO; +import org.apache.bigtop.manager.server.utils.StackUtils; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Queue; public abstract class AbstractServiceJob extends AbstractJob { @@ -79,6 +84,112 @@ protected Map> getComponentHostsMap() { return componentHostsMap; } + /** + * Filter component-hosts map for a single service by component membership. + */ + protected Map> filterComponentHostsByService(Map> all, String serviceName) { + Map> result = new HashMap<>(); + ServiceDTO serviceDTO = StackUtils.getServiceDTO(serviceName); + // Collect component names for this service + List componentNames = serviceDTO.getComponents().stream().map(c -> c.getName().toLowerCase()).toList(); + for (Map.Entry> entry : all.entrySet()) { + String comp = entry.getKey(); + if (componentNames.contains(comp.toLowerCase())) { + result.put(comp, entry.getValue()); + } + } + return result; + } + + /** + * Order services per required-services in metainfo.xml. + * For Start/Add: required services first; For Stop: reverse (dependents first). + */ + protected List getOrderedServiceNamesForCommand(org.apache.bigtop.manager.common.enums.Command command) { + List services = getServiceNames(); + // Build graph: edge from required -> service + Map> graph = new HashMap<>(); + Map indegree = new HashMap<>(); + for (String s : services) { + graph.putIfAbsent(s, new ArrayList<>()); + indegree.putIfAbsent(s, 0); + } + // Use transitive required services + Map> allReqMemo = new HashMap<>(); + for (String s : services) { + List allReq = getAllRequiredServices(s, allReqMemo); + for (String r : allReq) { + if (!services.contains(r)) { + // skip requirements not part of current command set + continue; + } + graph.computeIfAbsent(r, k -> new ArrayList<>()).add(s); + indegree.put(s, indegree.getOrDefault(s, 0) + 1); + indegree.putIfAbsent(r, indegree.getOrDefault(r, 0)); + } + } + // Kahn topological sort + Queue q = new LinkedList<>(); + for (Map.Entry e : indegree.entrySet()) { + if (e.getValue() == 0) q.add(e.getKey()); + } + List ordered = new ArrayList<>(); + while (!q.isEmpty()) { + String u = q.poll(); + ordered.add(u); + for (String v : graph.getOrDefault(u, List.of())) { + indegree.put(v, indegree.get(v) - 1); + if (indegree.get(v) == 0) q.add(v); + } + } + // If cycle or missing, fall back preserving original order for remaining + if (ordered.size() < services.size()) { + HashSet seen = new HashSet<>(ordered); + for (String s : services) { + if (!seen.contains(s)) ordered.add(s); + } + } + // For STOP, reverse to stop dependents first + if (command == org.apache.bigtop.manager.common.enums.Command.STOP) { + List reversed = new ArrayList<>(); + for (int i = ordered.size() - 1; i >= 0; i--) { + reversed.add(ordered.get(i)); + } + return reversed; + } + return ordered; + } + + /** + * Recursively collect transitive required services for a given service from stack metainfo. + * Uses memoization and guards against cycles. + */ + private List getAllRequiredServices(String serviceName, Map> memo) { + if (memo.containsKey(serviceName)) { + return memo.get(serviceName); + } + ServiceDTO dto = StackUtils.getServiceDTO(serviceName); + List direct = dto.getRequiredServices(); + if (direct == null) direct = List.of(); + HashSet visited = new HashSet<>(); + List result = new ArrayList<>(); + // DFS + for (String dep : direct) { + if (visited.add(dep)) { + result.add(dep); + // Recurse + List sub = getAllRequiredServices(dep, memo); + for (String s : sub) { + if (visited.add(s)) { + result.add(s); + } + } + } + } + memo.put(serviceName, result); + return result; + } + private List getServiceNames() { return jobContext.getCommandDTO().getServiceCommands().stream() .map(ServiceCommandDTO::getServiceName) diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceAddJob.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceAddJob.java index a5589d8e1..9ff66d5f1 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceAddJob.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceAddJob.java @@ -64,21 +64,24 @@ protected void createStages() { CommandDTO commandDTO = jobContext.getCommandDTO(); Map> componentHostsMap = getComponentHostsMap(); - // Install components - stages.addAll(ComponentStageHelper.createComponentStages(componentHostsMap, Command.ADD, commandDTO)); + // Order services by required-services for ADD + List orderedServices = getOrderedServiceNamesForCommand(org.apache.bigtop.manager.common.enums.Command.ADD); + for (String serviceName : orderedServices) { + Map> perServiceHosts = filterComponentHostsByService(componentHostsMap, serviceName); - // Configure components - stages.addAll(ComponentStageHelper.createComponentStages(componentHostsMap, Command.CONFIGURE, commandDTO)); + // Install components + stages.addAll(ComponentStageHelper.createComponentStages(perServiceHosts, Command.ADD, commandDTO)); - // Init/Start/Prepare components - // Since the order of these stages might be mixed up, we need to sort and add them together. - // For example, the order usually is init -> start -> prepare, but Hive Metastore init requires MySQL Server to - // be prepared. - List commands = List.of(Command.INIT, Command.START, Command.PREPARE); - stages.addAll(ComponentStageHelper.createComponentStages(componentHostsMap, commands, commandDTO)); + // Configure components + stages.addAll(ComponentStageHelper.createComponentStages(perServiceHosts, Command.CONFIGURE, commandDTO)); - // Check all master components after started - stages.addAll(ComponentStageHelper.createComponentStages(componentHostsMap, Command.CHECK, commandDTO)); + // Init/Start/Prepare components (combined ordering handled in helper) + List commands = List.of(Command.INIT, Command.START, Command.PREPARE); + stages.addAll(ComponentStageHelper.createComponentStages(perServiceHosts, commands, commandDTO)); + + // Check all master components after started + stages.addAll(ComponentStageHelper.createComponentStages(perServiceHosts, Command.CHECK, commandDTO)); + } } @Override diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceConfigureJob.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceConfigureJob.java index 93c61bba1..eb713f8b3 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceConfigureJob.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceConfigureJob.java @@ -37,11 +37,24 @@ protected void createStages() { CommandDTO commandDTO = jobContext.getCommandDTO(); Map> componentHostsMap = getComponentHostsMap(); - stages.addAll(ComponentStageHelper.createComponentStages(componentHostsMap, Command.CONFIGURE, commandDTO)); + // Order services for CONFIGURE and restart + List orderedServices = getOrderedServiceNamesForCommand(org.apache.bigtop.manager.common.enums.Command.CONFIGURE); + for (String serviceName : orderedServices) { + Map> perServiceHosts = filterComponentHostsByService(componentHostsMap, serviceName); + stages.addAll(ComponentStageHelper.createComponentStages(perServiceHosts, Command.CONFIGURE, commandDTO)); + } - // Restart services - stages.addAll(ComponentStageHelper.createComponentStages(componentHostsMap, Command.STOP, commandDTO)); - stages.addAll(ComponentStageHelper.createComponentStages(componentHostsMap, Command.START, commandDTO)); + // Restart services stop then start respecting ordering + List stopServices = getOrderedServiceNamesForCommand(org.apache.bigtop.manager.common.enums.Command.STOP); + for (String serviceName : stopServices) { + Map> perServiceHosts = filterComponentHostsByService(componentHostsMap, serviceName); + stages.addAll(ComponentStageHelper.createComponentStages(perServiceHosts, Command.STOP, commandDTO)); + } + List startServices = getOrderedServiceNamesForCommand(org.apache.bigtop.manager.common.enums.Command.START); + for (String serviceName : startServices) { + Map> perServiceHosts = filterComponentHostsByService(componentHostsMap, serviceName); + stages.addAll(ComponentStageHelper.createComponentStages(perServiceHosts, Command.START, commandDTO)); + } } @Override diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceRestartJob.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceRestartJob.java index 76209579d..26bda3626 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceRestartJob.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceRestartJob.java @@ -40,9 +40,18 @@ protected void createStages() { CommandDTO commandDTO = jobContext.getCommandDTO(); Map> componentHostsMap = getComponentHostsMap(); - // Restart services - stages.addAll(ComponentStageHelper.createComponentStages(componentHostsMap, Command.STOP, commandDTO)); - stages.addAll(ComponentStageHelper.createComponentStages(componentHostsMap, Command.START, commandDTO)); + // STOP in reverse order + List stopServices = getOrderedServiceNamesForCommand(org.apache.bigtop.manager.common.enums.Command.STOP); + for (String serviceName : stopServices) { + Map> perServiceHosts = filterComponentHostsByService(componentHostsMap, serviceName); + stages.addAll(ComponentStageHelper.createComponentStages(perServiceHosts, Command.STOP, commandDTO)); + } + // START in forward order + List startServices = getOrderedServiceNamesForCommand(org.apache.bigtop.manager.common.enums.Command.START); + for (String serviceName : startServices) { + Map> perServiceHosts = filterComponentHostsByService(componentHostsMap, serviceName); + stages.addAll(ComponentStageHelper.createComponentStages(perServiceHosts, Command.START, commandDTO)); + } } @Override diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceStartJob.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceStartJob.java index d53e2b689..da68c51e9 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceStartJob.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceStartJob.java @@ -39,7 +39,12 @@ protected void createStages() { CommandDTO commandDTO = jobContext.getCommandDTO(); Map> componentHostsMap = getComponentHostsMap(); - stages.addAll(ComponentStageHelper.createComponentStages(componentHostsMap, commandDTO)); + // Order services by required-services for START + List orderedServices = getOrderedServiceNamesForCommand(org.apache.bigtop.manager.common.enums.Command.START); + for (String serviceName : orderedServices) { + Map> perServiceHosts = filterComponentHostsByService(componentHostsMap, serviceName); + stages.addAll(ComponentStageHelper.createComponentStages(perServiceHosts, commandDTO)); + } } @Override diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceStopJob.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceStopJob.java index d585ba4a9..6ca021867 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceStopJob.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceStopJob.java @@ -39,7 +39,12 @@ protected void createStages() { CommandDTO commandDTO = jobContext.getCommandDTO(); Map> componentHostsMap = getComponentHostsMap(); - stages.addAll(ComponentStageHelper.createComponentStages(componentHostsMap, commandDTO)); + // Order services by required-services for STOP (reverse dependencies) + List orderedServices = getOrderedServiceNamesForCommand(org.apache.bigtop.manager.common.enums.Command.STOP); + for (String serviceName : orderedServices) { + Map> perServiceHosts = filterComponentHostsByService(componentHostsMap, serviceName); + stages.addAll(ComponentStageHelper.createComponentStages(perServiceHosts, commandDTO)); + } } @Override From 4417d6989c487cee0d6782db8aca99a6bb5645f6 Mon Sep 17 00:00:00 2001 From: timyuer <524860213@qq.com> Date: Sat, 13 Dec 2025 23:30:40 +0800 Subject: [PATCH 2/4] Update order.json --- .../bigtop/3.3.0/services/flink/order.json | 3 --- .../bigtop/3.3.0/services/hadoop/order.json | 18 ++--------------- .../bigtop/3.3.0/services/hbase/order.json | 5 ----- .../bigtop/3.3.0/services/hive/order.json | 20 ------------------- .../bigtop/3.3.0/services/kafka/order.json | 8 -------- .../bigtop/3.3.0/services/solr/order.json | 3 --- .../bigtop/3.3.0/services/spark/order.json | 14 ------------- .../3.3.0/services/zookeeper/order.json | 6 ------ 8 files changed, 2 insertions(+), 75 deletions(-) delete mode 100644 bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/flink/order.json delete mode 100644 bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/kafka/order.json delete mode 100644 bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/solr/order.json delete mode 100644 bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/spark/order.json delete mode 100644 bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/zookeeper/order.json diff --git a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/flink/order.json b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/flink/order.json deleted file mode 100644 index 55f4cf14c..000000000 --- a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/flink/order.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "FLINK_HISTORYSERVER-START": ["NAMENODE-START", "DATANODE-START"] -} diff --git a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/hadoop/order.json b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/hadoop/order.json index 4d7b8d3c7..21609c5f7 100644 --- a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/hadoop/order.json +++ b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/hadoop/order.json @@ -5,22 +5,13 @@ "SECONDARYNAMENODE-RESTART": [ "NAMENODE-RESTART" ], - "DATANODE-STOP": [ - "HBASE_MASTER-STOP" - ], "NAMENODE-STOP": [ "DATANODE-STOP", - "SECONDARYNAMENODE-STOP", - "HBASE_MASTER-STOP", - "HIVE_METASTORE-STOP" + "SECONDARYNAMENODE-STOP" ], "NAMENODE-START": [ "ZKFC-START", - "JOURNALNODE-START", - "ZOOKEEPER_SERVER-START" - ], - "ZKFC-START": [ - "ZOOKEEPER_SERVER-START" + "JOURNALNODE-START" ], "ZKFC-STOP": [ "NAMENODE-STOP" @@ -29,7 +20,6 @@ "NAMENODE-STOP" ], "RESOURCEMANAGER-START": [ - "ZOOKEEPER_SERVER-START", "NAMENODE-START", "DATANODE-START" ], @@ -44,10 +34,6 @@ "NODEMANAGER-RESTART": [ "NAMENODE-RESTART" ], - "NODEMANAGER-STOP": [ - "HIVE_METASTORE-STOP", - "HIVESERVER2-STOP" - ], "HISTORY_SERVER-START": ["NAMENODE-START", "DATANODE-START"], "HISTORY_SERVER-RESTART": ["NAMENODE-RESTART"] } \ No newline at end of file diff --git a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/hbase/order.json b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/hbase/order.json index c293a7bb2..a6e879034 100644 --- a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/hbase/order.json +++ b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/hbase/order.json @@ -4,10 +4,5 @@ ], "HBASE_MASTER-STOP": [ "HBASE_REGIONSERVER-STOP" - ], - "HBASE_MASTER-START": [ - "NAMENODE-START", - "DATANODE-START", - "ZOOKEEPER_SERVER-START" ] } \ No newline at end of file diff --git a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/hive/order.json b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/hive/order.json index e15e27e80..f619745fa 100644 --- a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/hive/order.json +++ b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/hive/order.json @@ -1,28 +1,8 @@ { - "HIVE_METASTORE-INIT": [ - "MYSQL_SERVER-PREPARE" - ], - "HIVE_METASTORE-START": [ - "NAMENODE-START", - "NODEMANAGER-START" - ], - "HIVE_METASTORE-RESTART": [ - "MYSQL_SERVER-RESTART", - "NAMENODE-RESTART", - "NODEMANAGER-RESTART" - ], - "HIVE_METASTORE-STOP": [ - "SPARK_HISTORYSERVER-STOP", - "SPARK_THRIFTSERVER-STOP" - ], "HIVESERVER2-START": [ - "NODEMANAGER-START", - "ZOOKEEPER_SERVER-START", "HIVE_METASTORE-START" ], "HIVESERVER2-RESTART": [ - "NODEMANAGER-RESTART", - "ZOOKEEPER_SERVER-RESTART", "HIVE_METASTORE-RESTART" ] } \ No newline at end of file diff --git a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/kafka/order.json b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/kafka/order.json deleted file mode 100644 index 2f55e86da..000000000 --- a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/kafka/order.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "KAFKA_BROKER-START": [ - "ZOOKEEPER_SERVER-START" - ], - "KAFKA_BROKER-RESTART": [ - "ZOOKEEPER_SERVER-RESTART" - ] -} \ No newline at end of file diff --git a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/solr/order.json b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/solr/order.json deleted file mode 100644 index bb25a4c7e..000000000 --- a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/solr/order.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "SOLR_INSTANCE-START" : ["ZOOKEEPER_SERVER-START"] -} \ No newline at end of file diff --git a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/spark/order.json b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/spark/order.json deleted file mode 100644 index a26d2b3ef..000000000 --- a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/spark/order.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "SPARK_HISTORYSERVER-START": [ - "HIVE_METASTORE-START" - ], - "SPARK_HISTORYSERVER-RESTART": [ - "HIVE_METASTORE-RESTART" - ], - "SPARK_THRIFTSERVER-START": [ - "HIVE_METASTORE-START" - ], - "SPARK_THRIFTSERVER-RESTART": [ - "HIVE_METASTORE-RESTART" - ] -} \ No newline at end of file diff --git a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/zookeeper/order.json b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/zookeeper/order.json deleted file mode 100644 index 653399330..000000000 --- a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/zookeeper/order.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "ZOOKEEPER_SERVER-STOP": [ - "KAFKA_BROKER-STOP", - "HBASE_MASTER-STOP" - ] -} \ No newline at end of file From 4eeec27f576a37f172b4b4d21ef658bd3e745a55 Mon Sep 17 00:00:00 2001 From: timyuer <524860213@qq.com> Date: Sat, 13 Dec 2025 23:35:11 +0800 Subject: [PATCH 3/4] Fix spotless check --- .../server/command/job/service/AbstractServiceJob.java | 7 +++++-- .../server/command/job/service/ServiceAddJob.java | 3 ++- .../server/command/job/service/ServiceConfigureJob.java | 9 ++++++--- .../server/command/job/service/ServiceRestartJob.java | 6 ++++-- .../server/command/job/service/ServiceStartJob.java | 3 ++- .../server/command/job/service/ServiceStopJob.java | 3 ++- 6 files changed, 21 insertions(+), 10 deletions(-) diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/AbstractServiceJob.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/AbstractServiceJob.java index dd8010e2d..5c68c6cfa 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/AbstractServiceJob.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/AbstractServiceJob.java @@ -87,11 +87,14 @@ protected Map> getComponentHostsMap() { /** * Filter component-hosts map for a single service by component membership. */ - protected Map> filterComponentHostsByService(Map> all, String serviceName) { + protected Map> filterComponentHostsByService( + Map> all, String serviceName) { Map> result = new HashMap<>(); ServiceDTO serviceDTO = StackUtils.getServiceDTO(serviceName); // Collect component names for this service - List componentNames = serviceDTO.getComponents().stream().map(c -> c.getName().toLowerCase()).toList(); + List componentNames = serviceDTO.getComponents().stream() + .map(c -> c.getName().toLowerCase()) + .toList(); for (Map.Entry> entry : all.entrySet()) { String comp = entry.getKey(); if (componentNames.contains(comp.toLowerCase())) { diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceAddJob.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceAddJob.java index 9ff66d5f1..17e727a91 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceAddJob.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceAddJob.java @@ -65,7 +65,8 @@ protected void createStages() { Map> componentHostsMap = getComponentHostsMap(); // Order services by required-services for ADD - List orderedServices = getOrderedServiceNamesForCommand(org.apache.bigtop.manager.common.enums.Command.ADD); + List orderedServices = + getOrderedServiceNamesForCommand(org.apache.bigtop.manager.common.enums.Command.ADD); for (String serviceName : orderedServices) { Map> perServiceHosts = filterComponentHostsByService(componentHostsMap, serviceName); diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceConfigureJob.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceConfigureJob.java index eb713f8b3..6f56a069c 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceConfigureJob.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceConfigureJob.java @@ -38,19 +38,22 @@ protected void createStages() { Map> componentHostsMap = getComponentHostsMap(); // Order services for CONFIGURE and restart - List orderedServices = getOrderedServiceNamesForCommand(org.apache.bigtop.manager.common.enums.Command.CONFIGURE); + List orderedServices = + getOrderedServiceNamesForCommand(org.apache.bigtop.manager.common.enums.Command.CONFIGURE); for (String serviceName : orderedServices) { Map> perServiceHosts = filterComponentHostsByService(componentHostsMap, serviceName); stages.addAll(ComponentStageHelper.createComponentStages(perServiceHosts, Command.CONFIGURE, commandDTO)); } // Restart services stop then start respecting ordering - List stopServices = getOrderedServiceNamesForCommand(org.apache.bigtop.manager.common.enums.Command.STOP); + List stopServices = + getOrderedServiceNamesForCommand(org.apache.bigtop.manager.common.enums.Command.STOP); for (String serviceName : stopServices) { Map> perServiceHosts = filterComponentHostsByService(componentHostsMap, serviceName); stages.addAll(ComponentStageHelper.createComponentStages(perServiceHosts, Command.STOP, commandDTO)); } - List startServices = getOrderedServiceNamesForCommand(org.apache.bigtop.manager.common.enums.Command.START); + List startServices = + getOrderedServiceNamesForCommand(org.apache.bigtop.manager.common.enums.Command.START); for (String serviceName : startServices) { Map> perServiceHosts = filterComponentHostsByService(componentHostsMap, serviceName); stages.addAll(ComponentStageHelper.createComponentStages(perServiceHosts, Command.START, commandDTO)); diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceRestartJob.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceRestartJob.java index 26bda3626..c7e6d0b7a 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceRestartJob.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceRestartJob.java @@ -41,13 +41,15 @@ protected void createStages() { Map> componentHostsMap = getComponentHostsMap(); // STOP in reverse order - List stopServices = getOrderedServiceNamesForCommand(org.apache.bigtop.manager.common.enums.Command.STOP); + List stopServices = + getOrderedServiceNamesForCommand(org.apache.bigtop.manager.common.enums.Command.STOP); for (String serviceName : stopServices) { Map> perServiceHosts = filterComponentHostsByService(componentHostsMap, serviceName); stages.addAll(ComponentStageHelper.createComponentStages(perServiceHosts, Command.STOP, commandDTO)); } // START in forward order - List startServices = getOrderedServiceNamesForCommand(org.apache.bigtop.manager.common.enums.Command.START); + List startServices = + getOrderedServiceNamesForCommand(org.apache.bigtop.manager.common.enums.Command.START); for (String serviceName : startServices) { Map> perServiceHosts = filterComponentHostsByService(componentHostsMap, serviceName); stages.addAll(ComponentStageHelper.createComponentStages(perServiceHosts, Command.START, commandDTO)); diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceStartJob.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceStartJob.java index da68c51e9..04764d7d5 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceStartJob.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceStartJob.java @@ -40,7 +40,8 @@ protected void createStages() { Map> componentHostsMap = getComponentHostsMap(); // Order services by required-services for START - List orderedServices = getOrderedServiceNamesForCommand(org.apache.bigtop.manager.common.enums.Command.START); + List orderedServices = + getOrderedServiceNamesForCommand(org.apache.bigtop.manager.common.enums.Command.START); for (String serviceName : orderedServices) { Map> perServiceHosts = filterComponentHostsByService(componentHostsMap, serviceName); stages.addAll(ComponentStageHelper.createComponentStages(perServiceHosts, commandDTO)); diff --git a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceStopJob.java b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceStopJob.java index 6ca021867..84f15ac7d 100644 --- a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceStopJob.java +++ b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/service/ServiceStopJob.java @@ -40,7 +40,8 @@ protected void createStages() { Map> componentHostsMap = getComponentHostsMap(); // Order services by required-services for STOP (reverse dependencies) - List orderedServices = getOrderedServiceNamesForCommand(org.apache.bigtop.manager.common.enums.Command.STOP); + List orderedServices = + getOrderedServiceNamesForCommand(org.apache.bigtop.manager.common.enums.Command.STOP); for (String serviceName : orderedServices) { Map> perServiceHosts = filterComponentHostsByService(componentHostsMap, serviceName); stages.addAll(ComponentStageHelper.createComponentStages(perServiceHosts, commandDTO)); From d704e212c3ffac175dd17c648c496aba733d3217 Mon Sep 17 00:00:00 2001 From: timyuer <524860213@qq.com> Date: Sun, 14 Dec 2025 08:46:26 +0800 Subject: [PATCH 4/4] fix tests --- .../manager/server/command/job/service/ServiceAddJobTest.java | 4 ++++ .../server/command/job/service/ServiceConfigureJobTest.java | 3 +++ .../server/command/job/service/ServiceRestartJobTest.java | 3 +++ .../server/command/job/service/ServiceStartJobTest.java | 3 +++ .../server/command/job/service/ServiceStopJobTest.java | 3 +++ 5 files changed, 16 insertions(+) diff --git a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/job/service/ServiceAddJobTest.java b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/job/service/ServiceAddJobTest.java index d96d650e9..585d7fa3e 100644 --- a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/job/service/ServiceAddJobTest.java +++ b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/job/service/ServiceAddJobTest.java @@ -83,6 +83,10 @@ public void testCreateStages() { when(ComponentStageHelper.createComponentStages(any(), eq(Command.CHECK), any())) .thenReturn(stageList4); + // Ensure ordered services is non-empty to trigger stage aggregation in createStages + when(serviceAddJob.getOrderedServiceNamesForCommand(any())).thenReturn(List.of("dummy-service")); + + // Use real method for createStages doCallRealMethod().when(serviceAddJob).createStages(); serviceAddJob.createStages(); diff --git a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/job/service/ServiceConfigureJobTest.java b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/job/service/ServiceConfigureJobTest.java index e6c749c2b..7f6da7aff 100644 --- a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/job/service/ServiceConfigureJobTest.java +++ b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/job/service/ServiceConfigureJobTest.java @@ -75,6 +75,9 @@ public void testCreateStages() { when(ComponentStageHelper.createComponentStages(any(), eq(Command.START), any())) .thenReturn(stageList3); + // Ensure ordered services is non-empty to trigger stage aggregation in createStages + when(serviceConfigureJob.getOrderedServiceNamesForCommand(any())).thenReturn(List.of("dummy-service")); + doCallRealMethod().when(serviceConfigureJob).createStages(); serviceConfigureJob.createStages(); diff --git a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/job/service/ServiceRestartJobTest.java b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/job/service/ServiceRestartJobTest.java index 30c208040..6611eccde 100644 --- a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/job/service/ServiceRestartJobTest.java +++ b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/job/service/ServiceRestartJobTest.java @@ -71,6 +71,9 @@ public void testCreateStages() { when(ComponentStageHelper.createComponentStages(any(), eq(Command.START), any())) .thenReturn(stageList2); + // Ensure ordered services is non-empty to trigger stage aggregation in createStages + when(serviceRestartJob.getOrderedServiceNamesForCommand(any())).thenReturn(List.of("dummy-service")); + doCallRealMethod().when(serviceRestartJob).createStages(); serviceRestartJob.createStages(); diff --git a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/job/service/ServiceStartJobTest.java b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/job/service/ServiceStartJobTest.java index fc885f2a8..6bf9ac6bb 100644 --- a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/job/service/ServiceStartJobTest.java +++ b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/job/service/ServiceStartJobTest.java @@ -72,6 +72,9 @@ public void testCreateStages() { mocked2.when(() -> ComponentStageHelper.createComponentStages(anyMap(), eq(Command.START), any())) .thenReturn(stageList); + // Ensure ordered services is non-empty to trigger stage aggregation in createStages + when(serviceStartJob.getOrderedServiceNamesForCommand(any())).thenReturn(List.of("dummy-service")); + doCallRealMethod().when(serviceStartJob).createStages(); serviceStartJob.createStages(); diff --git a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/job/service/ServiceStopJobTest.java b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/job/service/ServiceStopJobTest.java index 5250f71b1..676ff1e18 100644 --- a/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/job/service/ServiceStopJobTest.java +++ b/bigtop-manager-server/src/test/java/org/apache/bigtop/manager/server/command/job/service/ServiceStopJobTest.java @@ -72,6 +72,9 @@ public void testCreateStages() { mocked2.when(() -> ComponentStageHelper.createComponentStages(anyMap(), eq(Command.STOP), any())) .thenReturn(stageList); + // Ensure ordered services is non-empty to trigger stage aggregation in createStages + when(serviceStopJob.getOrderedServiceNamesForCommand(any())).thenReturn(List.of("dummy-service")); + doCallRealMethod().when(serviceStopJob).createStages(); serviceStopJob.createStages();