This is an automated email from the ASF dual-hosted git repository.

liuhaopeng pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/bigtop-manager.git


The following commit(s) were added to refs/heads/main by this push:
     new 30aad35c BIGTOP-4406: Fix service/component status cannot auto sync 
(#206)
30aad35c is described below

commit 30aad35c3e85adf157f9222ea40f04a845b5ba23
Author: Zhiguo Wu <[email protected]>
AuthorDate: Mon Apr 14 21:58:12 2025 +0800

    BIGTOP-4406: Fix service/component status cannot auto sync (#206)
---
 .../command/job/component/ComponentAddJob.java     |  6 ++-
 .../command/job/service/ServiceRestartJob.java     |  2 +
 .../command/job/service/ServiceStartJob.java       |  1 +
 .../server/command/job/service/ServiceStopJob.java |  1 +
 .../manager/server/timer/ComponentStatusTimer.java | 62 +++++++++++++++++++---
 .../bigtop/v3_3_0/solr/SolrInstanceScript.java     |  8 ++-
 6 files changed, 70 insertions(+), 10 deletions(-)

diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/component/ComponentAddJob.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/component/ComponentAddJob.java
index 9bca282f..589ac326 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/component/ComponentAddJob.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/component/ComponentAddJob.java
@@ -18,6 +18,7 @@
  */
 package org.apache.bigtop.manager.server.command.job.component;
 
+import org.apache.bigtop.manager.common.constants.ComponentCategories;
 import org.apache.bigtop.manager.common.enums.Command;
 import org.apache.bigtop.manager.dao.po.ComponentPO;
 import org.apache.bigtop.manager.dao.po.HostPO;
@@ -107,7 +108,10 @@ public class ComponentAddJob extends AbstractComponentJob {
             componentPO.setClusterId(clusterId);
             componentPO.setHostId(hostPO.getId());
             componentPO.setServiceId(servicePO.getId());
-            componentPO.setStatus(HealthyStatusEnum.UNKNOWN.getCode());
+            HealthyStatusEnum status = 
ComponentCategories.CLIENT.equals(componentDTO.getCategory())
+                    ? HealthyStatusEnum.HEALTHY
+                    : HealthyStatusEnum.UNKNOWN;
+            componentPO.setStatus(status.getCode());
             componentPOList.add(componentPO);
         }
 
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 e32e36d8..76209579 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
@@ -55,6 +55,7 @@ public class ServiceRestartJob extends AbstractServiceJob {
             Long clusterId = commandDTO.getClusterId();
             String serviceName = serviceCommand.getServiceName();
             ServicePO servicePO = serviceDao.findByClusterIdAndName(clusterId, 
serviceName);
+            servicePO.setRestartFlag(false);
             servicePO.setStatus(HealthyStatusEnum.HEALTHY.getCode());
             serviceDao.partialUpdateById(servicePO);
         }
@@ -70,6 +71,7 @@ public class ServiceRestartJob extends AbstractServiceJob {
             Long clusterId = commandDTO.getClusterId();
             String serviceName = serviceCommand.getServiceName();
             ServicePO servicePO = serviceDao.findByClusterIdAndName(clusterId, 
serviceName);
+            servicePO.setRestartFlag(true);
             servicePO.setStatus(HealthyStatusEnum.UNHEALTHY.getCode());
             serviceDao.partialUpdateById(servicePO);
         }
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 b4bb236a..d53e2b68 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
@@ -52,6 +52,7 @@ public class ServiceStartJob extends AbstractServiceJob {
             Long clusterId = commandDTO.getClusterId();
             String serviceName = serviceCommand.getServiceName();
             ServicePO servicePO = serviceDao.findByClusterIdAndName(clusterId, 
serviceName);
+            servicePO.setRestartFlag(false);
             servicePO.setStatus(HealthyStatusEnum.HEALTHY.getCode());
             serviceDao.partialUpdateById(servicePO);
         }
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 ff45c5d3..d585ba4a 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
@@ -52,6 +52,7 @@ public class ServiceStopJob extends AbstractServiceJob {
             Long clusterId = commandDTO.getClusterId();
             String serviceName = serviceCommand.getServiceName();
             ServicePO servicePO = serviceDao.findByClusterIdAndName(clusterId, 
serviceName);
+            servicePO.setRestartFlag(true);
             servicePO.setStatus(HealthyStatusEnum.UNHEALTHY.getCode());
             serviceDao.partialUpdateById(servicePO);
         }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/timer/ComponentStatusTimer.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/timer/ComponentStatusTimer.java
index 06bee6b3..1d654deb 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/timer/ComponentStatusTimer.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/timer/ComponentStatusTimer.java
@@ -18,30 +18,42 @@
  */
 package org.apache.bigtop.manager.server.timer;
 
+import org.apache.bigtop.manager.common.constants.ComponentCategories;
 import org.apache.bigtop.manager.common.utils.CaseUtils;
 import org.apache.bigtop.manager.dao.po.ComponentPO;
 import org.apache.bigtop.manager.dao.po.HostPO;
+import org.apache.bigtop.manager.dao.po.ServicePO;
 import org.apache.bigtop.manager.dao.repository.ComponentDao;
 import org.apache.bigtop.manager.dao.repository.HostDao;
+import org.apache.bigtop.manager.dao.repository.ServiceDao;
 import org.apache.bigtop.manager.grpc.generated.ComponentStatusReply;
 import org.apache.bigtop.manager.grpc.generated.ComponentStatusRequest;
 import org.apache.bigtop.manager.grpc.generated.ComponentStatusServiceGrpc;
 import org.apache.bigtop.manager.server.enums.HealthyStatusEnum;
 import org.apache.bigtop.manager.server.grpc.GrpcClient;
+import org.apache.bigtop.manager.server.model.dto.ComponentDTO;
+import org.apache.bigtop.manager.server.utils.StackUtils;
 
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
 
 import lombok.extern.slf4j.Slf4j;
 
 import jakarta.annotation.Resource;
 import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 @Slf4j
-// @Component
+@Component
 public class ComponentStatusTimer {
 
+    @Resource
+    private ServiceDao serviceDao;
+
     @Resource
     private ComponentDao componentDao;
 
@@ -53,18 +65,22 @@ public class ComponentStatusTimer {
     public void execute() {
         List<ComponentPO> componentPOList = componentDao.findAll();
         for (ComponentPO componentPO : componentPOList) {
-            if (HealthyStatusEnum.fromCode(componentPO.getStatus()) == 
HealthyStatusEnum.UNKNOWN) {
+            ComponentDTO componentDTO = 
StackUtils.getComponentDTO(componentPO.getName());
+            String category = componentDTO.getCategory();
+            if (HealthyStatusEnum.fromCode(componentPO.getStatus()) == 
HealthyStatusEnum.UNKNOWN
+                    || category.equals(ComponentCategories.CLIENT)) {
                 continue;
             }
 
-            componentPO = componentDao.findDetailsById(componentPO.getId());
+            ComponentPO componentDetailsPO = 
componentDao.findDetailsById(componentPO.getId());
             HostPO hostPO = hostDao.findById(componentPO.getHostId());
             ComponentStatusRequest request = 
ComponentStatusRequest.newBuilder()
-                    
.setStackName(CaseUtils.toLowerCase(componentPO.getStack().split("-")[0]))
-                    .setStackVersion(componentPO.getStack().split("-")[1])
-                    .setServiceName(componentPO.getServiceName())
-                    .setServiceUser(componentPO.getServiceUser())
-                    .setComponentName(componentPO.getName())
+                    .setStackName(
+                            
CaseUtils.toLowerCase(componentDetailsPO.getStack().split("-")[0]))
+                    
.setStackVersion(componentDetailsPO.getStack().split("-")[1])
+                    .setServiceName(componentDetailsPO.getServiceName())
+                    .setServiceUser(componentDetailsPO.getServiceUser())
+                    .setComponentName(componentDetailsPO.getName())
                     .build();
             ComponentStatusServiceGrpc.ComponentStatusServiceBlockingStub 
blockingStub = GrpcClient.getBlockingStub(
                     hostPO.getHostname(),
@@ -79,5 +95,35 @@ public class ComponentStatusTimer {
                 componentPO.setStatus(HealthyStatusEnum.UNHEALTHY.getCode());
             }
         }
+
+        componentDao.partialUpdateByIds(componentPOList);
+
+        // Update services
+        Map<Long, List<ComponentPO>> componentPOMap =
+                
componentPOList.stream().collect(Collectors.groupingBy(ComponentPO::getServiceId));
+        for (Map.Entry<Long, List<ComponentPO>> entry : 
componentPOMap.entrySet()) {
+            Long serviceId = entry.getKey();
+            List<ComponentPO> components = entry.getValue();
+            ServicePO servicePO = serviceDao.findById(serviceId);
+            boolean hasUnknownComponent = components.stream()
+                    .anyMatch(component -> 
Objects.equals(component.getStatus(), HealthyStatusEnum.UNKNOWN.getCode()));
+            if (hasUnknownComponent) {
+                continue;
+            }
+
+            List<ComponentPO> healthyComponents = components.stream()
+                    .filter(component -> Objects.equals(component.getStatus(), 
HealthyStatusEnum.HEALTHY.getCode()))
+                    .toList();
+
+            if (healthyComponents.size() == components.size()) {
+                servicePO.setStatus(HealthyStatusEnum.HEALTHY.getCode());
+                servicePO.setRestartFlag(false);
+            } else {
+                servicePO.setStatus(HealthyStatusEnum.UNHEALTHY.getCode());
+                servicePO.setRestartFlag(true);
+            }
+
+            serviceDao.partialUpdateById(servicePO);
+        }
     }
 }
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/solr/SolrInstanceScript.java
 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/solr/SolrInstanceScript.java
index 420451df..c8af3430 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/solr/SolrInstanceScript.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/solr/SolrInstanceScript.java
@@ -52,10 +52,16 @@ public class SolrInstanceScript extends 
AbstractServerScript {
         return SolrSetup.configure(params);
     }
 
+    @Override
+    public ShellResult init(Params params) {
+        createZNode(params);
+
+        return super.init(params);
+    }
+
     @Override
     public ShellResult start(Params params) {
         configure(params);
-        createZNode(params);
         SolrParams solrParams = (SolrParams) params;
         String cmd = MessageFormat.format(
                 "{0}/bin/solr start -cloud -noprompt -s {0}/server/solr -z 
{1}",

Reply via email to