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

houyu 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 9eac134c BIGTOP-4482: Add config property action to reduce payload 
size (#254)
9eac134c is described below

commit 9eac134c19b49b743e125ae0e1a2ea6c1c66853d
Author: Zhiguo Wu <[email protected]>
AuthorDate: Tue Aug 5 21:07:31 2025 +0800

    BIGTOP-4482: Add config property action to reduce payload size (#254)
---
 bigtop-manager-bom/pom.xml                         |  16 ----
 .../server/command/helper/JobCacheHelper.java      |   5 ++
 .../validator/RequiredServicesValidator.java       |  22 ++---
 .../PropertyDTO.java => enums/PropertyAction.java} |  25 +++---
 .../manager/server/model/dto/PropertyDTO.java      |   5 ++
 .../manager/server/model/req/PropertyReq.java      |   8 ++
 .../server/service/impl/ServiceServiceImpl.java    |   2 +-
 .../manager/server/utils/StackConfigUtils.java     | 100 ++++++++++++++-------
 .../services/zookeeper/configuration/zoo.cfg.xml   |  10 +++
 9 files changed, 116 insertions(+), 77 deletions(-)

diff --git a/bigtop-manager-bom/pom.xml b/bigtop-manager-bom/pom.xml
index a361d541..d701c4f0 100644
--- a/bigtop-manager-bom/pom.xml
+++ b/bigtop-manager-bom/pom.xml
@@ -58,7 +58,6 @@
         
<pagehelper-spring-boot-starter.version>2.1.0</pagehelper-spring-boot-starter.version>
         <victools.version>4.29.0</victools.version>
         <arrow.version>18.3.0</arrow.version>
-        <netty-buffer.version>4.1.123.Final</netty-buffer.version>
     </properties>
 
     <dependencyManagement>
@@ -224,21 +223,6 @@
                 <version>${pagehelper-spring-boot-starter.version}</version>
             </dependency>
 
-            <!-- dameng -->
-            <dependency>
-                <groupId>com.dameng</groupId>
-                <artifactId>DmJdbcDriver18</artifactId>
-                <version>${jdbc.dm.version}</version>
-                <scope>provided</scope>
-            </dependency>
-
-            <dependency>
-                <groupId>com.dameng</groupId>
-                <artifactId>DmDialect-for-hibernate6.1</artifactId>
-                <version>${jdbc.dm.version}</version>
-                <scope>provided</scope>
-            </dependency>
-
             <dependency>
                 <groupId>org.apache.arrow</groupId>
                 <artifactId>flight-sql-jdbc-driver</artifactId>
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/helper/JobCacheHelper.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/helper/JobCacheHelper.java
index d02f4fb5..5ee1368e 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/helper/JobCacheHelper.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/helper/JobCacheHelper.java
@@ -219,4 +219,9 @@ public class JobCacheHelper {
 
         return hostMap;
     }
+
+    private static Boolean hostRequiresAllData(String hostname) {
+        // Some services like prometheus requires all clusters info to collect 
metrics.
+        return false;
+    }
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/validator/RequiredServicesValidator.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/validator/RequiredServicesValidator.java
index 81e8c34f..bf3675a4 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/validator/RequiredServicesValidator.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/validator/RequiredServicesValidator.java
@@ -20,7 +20,6 @@ package org.apache.bigtop.manager.server.command.validator;
 
 import org.apache.bigtop.manager.common.enums.Command;
 import org.apache.bigtop.manager.dao.po.ServicePO;
-import org.apache.bigtop.manager.dao.repository.ClusterDao;
 import org.apache.bigtop.manager.dao.repository.ServiceDao;
 import org.apache.bigtop.manager.server.command.CommandIdentifier;
 import org.apache.bigtop.manager.server.enums.ApiExceptionEnum;
@@ -36,15 +35,13 @@ import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.stereotype.Component;
 
 import jakarta.annotation.Resource;
+import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 
 @Component
 public class RequiredServicesValidator implements CommandValidator {
 
-    @Resource
-    private ClusterDao clusterDao;
-
     @Resource
     private ServiceDao serviceDao;
 
@@ -67,16 +64,19 @@ public class RequiredServicesValidator implements 
CommandValidator {
             ServiceDTO serviceDTO = StackUtils.getServiceDTO(serviceName);
             List<String> requiredServices = serviceDTO.getRequiredServices();
             if (CollectionUtils.isEmpty(requiredServices)) {
-                return;
+                continue;
             }
 
-            List<ServicePO> servicePOList = 
serviceDao.findByClusterIdAndNames(clusterId, requiredServices);
-            List<String> list = 
servicePOList.stream().map(ServicePO::getName).toList();
-
-            requiredServices.removeAll(list);
+            List<ServicePO> services = serviceDao.findByClusterId(clusterId);
+            List<ServicePO> infraServices = serviceDao.findByClusterId(0L);
+            services.addAll(infraServices);
 
-            if (!new HashSet<>(serviceNames).containsAll(requiredServices)) {
-                throw new 
ApiException(ApiExceptionEnum.SERVICE_REQUIRED_NOT_FOUND, String.join(",", 
requiredServices));
+            List<String> allServices =
+                    new 
ArrayList<>(services.stream().map(ServicePO::getName).toList());
+            allServices.addAll(serviceNames);
+            if (!new HashSet<>(allServices).containsAll(requiredServices)) {
+                requiredServices.removeAll(allServices);
+                throw new ApiException(ApiExceptionEnum.SERVICE_NOT_FOUND, 
String.join(",", requiredServices));
             }
         }
     }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PropertyDTO.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/PropertyAction.java
similarity index 72%
copy from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PropertyDTO.java
copy to 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/PropertyAction.java
index f4845c4e..8a0b88b9 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PropertyDTO.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/enums/PropertyAction.java
@@ -16,22 +16,17 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.bigtop.manager.server.model.dto;
+package org.apache.bigtop.manager.server.enums;
 
-import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonCreator;
 
-import java.io.Serializable;
+public enum PropertyAction {
+    ADD,
+    UPDATE,
+    DELETE;
 
-@Data
-public class PropertyDTO implements Serializable {
-
-    private String name;
-
-    private String value;
-
-    private String displayName;
-
-    private String desc;
-
-    private AttrsDTO attrs;
+    @JsonCreator
+    public static PropertyAction fromString(String value) {
+        return PropertyAction.valueOf(value.toUpperCase());
+    }
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PropertyDTO.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PropertyDTO.java
index f4845c4e..1eec26f2 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PropertyDTO.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/PropertyDTO.java
@@ -18,6 +18,8 @@
  */
 package org.apache.bigtop.manager.server.model.dto;
 
+import org.apache.bigtop.manager.server.enums.PropertyAction;
+
 import lombok.Data;
 
 import java.io.Serializable;
@@ -34,4 +36,7 @@ public class PropertyDTO implements Serializable {
     private String desc;
 
     private AttrsDTO attrs;
+
+    // Only exists in request body
+    private PropertyAction action;
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/PropertyReq.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/PropertyReq.java
index e3e961a5..87439be4 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/PropertyReq.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/req/PropertyReq.java
@@ -18,6 +18,8 @@
  */
 package org.apache.bigtop.manager.server.model.req;
 
+import org.apache.bigtop.manager.server.enums.PropertyAction;
+
 import lombok.Data;
 
 import jakarta.validation.constraints.NotBlank;
@@ -35,4 +37,10 @@ public class PropertyReq {
     private String desc;
 
     private AttrsReq attrs;
+
+    /**
+     * Action to be performed on the property.
+     * This could be used to indicate operations like 'add', 'update', or 
'delete'.
+     */
+    private PropertyAction action;
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ServiceServiceImpl.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ServiceServiceImpl.java
index 3e4cd61f..3ee0b874 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ServiceServiceImpl.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ServiceServiceImpl.java
@@ -169,7 +169,7 @@ public class ServiceServiceImpl implements ServiceService {
         List<ServiceConfigDTO> newConfigs;
         List<ServiceConfigDTO> mergedConfigs;
 
-        // Merge stack config with existing config first, in case new property 
has been added to stack config.
+        // Merge stack config with existing config first, in case new property 
has been added to config xml.
         oriConfigs = StackUtils.SERVICE_CONFIG_MAP.get(servicePO.getName());
         newConfigs = ServiceConfigConverter.INSTANCE.fromPO2DTO(configs);
         mergedConfigs = StackConfigUtils.mergeServiceConfigs(oriConfigs, 
newConfigs);
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/utils/StackConfigUtils.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/utils/StackConfigUtils.java
index 430172e4..d4a86d7c 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/utils/StackConfigUtils.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/utils/StackConfigUtils.java
@@ -18,6 +18,7 @@
  */
 package org.apache.bigtop.manager.server.utils;
 
+import org.apache.bigtop.manager.server.enums.PropertyAction;
 import org.apache.bigtop.manager.server.model.dto.AttrsDTO;
 import org.apache.bigtop.manager.server.model.dto.PropertyDTO;
 import org.apache.bigtop.manager.server.model.dto.ServiceConfigDTO;
@@ -26,7 +27,6 @@ import 
org.apache.bigtop.manager.server.stack.model.PropertyModel;
 import org.apache.bigtop.manager.server.stack.xml.ConfigurationXml;
 
 import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.MapUtils;
 import org.apache.commons.lang3.StringUtils;
 
 import org.springframework.beans.BeanUtils;
@@ -87,43 +87,60 @@ public class StackConfigUtils {
             return mergedConfigs;
         }
 
-        // Assign id for each service config
-        for (ServiceConfigDTO config : mergedConfigs) {
-            config.setId(overrideConfigs.stream()
-                    .filter(x -> x.getName().equals(config.getName()))
-                    .findFirst()
-                    .map(ServiceConfigDTO::getId)
-                    .orElse(null));
-        }
+        Map<String, Map<String, PropertyDTO>> mergedConfigsMap = 
serviceConfig2Map(mergedConfigs);
+        for (ServiceConfigDTO overrideConfig : overrideConfigs) {
+            String configName = overrideConfig.getName();
 
-        Map<String, Map<String, String>> overrideConfigsMap = 
serviceConfig2Map(overrideConfigs);
-        for (ServiceConfigDTO mergedConfig : mergedConfigs) {
-            String configName = mergedConfig.getName();
-            if (!overrideConfigsMap.containsKey(configName)) {
-                continue;
-            }
-
-            // Override existing properties
-            Map<String, String> overridePropertiesMap = 
overrideConfigsMap.get(configName);
-            for (PropertyDTO property : mergedConfig.getProperties()) {
+            // Merge properties from override config to existing config
+            Map<String, PropertyDTO> mergedPropertiesMap = 
mergedConfigsMap.get(configName);
+            for (PropertyDTO property : overrideConfig.getProperties()) {
                 String propertyName = property.getName();
-                String value = overridePropertiesMap.remove(propertyName);
-                if (value != null) {
-                    property.setValue(value);
+                PropertyAction action = property.getAction();
+                if (action == null) {
+                    // null means property does not come from request body, 
but from config xml or database.
+                    // the logic the same as `UPDATE` action.
+                    action = PropertyAction.UPDATE;
+                }
+                switch (action) {
+                    case ADD, UPDATE -> {
+                        PropertyDTO propertyDTO = 
mergedPropertiesMap.get(propertyName);
+                        if (propertyDTO == null) {
+                            propertyDTO = new PropertyDTO();
+                            propertyDTO.setName(propertyName);
+                        }
+
+                        propertyDTO.setValue(property.getValue());
+                        mergedPropertiesMap.put(propertyName, propertyDTO);
+                    }
+                    case DELETE -> mergedPropertiesMap.remove(propertyName);
                 }
             }
+        }
 
-            // We may still have some properties added by user manually
-            if (MapUtils.isNotEmpty(overridePropertiesMap)) {
-                for (Map.Entry<String, String> entry : 
overridePropertiesMap.entrySet()) {
-                    PropertyDTO property = new PropertyDTO();
-                    property.setName(entry.getKey());
-                    property.setValue(entry.getValue());
-                    mergedConfig.getProperties().add(property);
-                }
+        mergedConfigs = map2ServiceConfig(mergedConfigsMap);
+
+        // Assign id for each service config
+        Map<String, Long> configIdMap = new HashMap<>();
+        for (ServiceConfigDTO config : oriConfigs) {
+            String name = config.getName();
+            Long id = config.getId();
+            if (id != null) {
+                configIdMap.put(name, id);
             }
         }
 
+        for (ServiceConfigDTO config : overrideConfigs) {
+            String name = config.getName();
+            Long id = config.getId();
+            if (id != null) {
+                configIdMap.put(name, id);
+            }
+        }
+
+        for (ServiceConfigDTO config : mergedConfigs) {
+            config.setId(configIdMap.get(config.getName()));
+        }
+
         return mergedConfigs;
     }
 
@@ -133,16 +150,16 @@ public class StackConfigUtils {
      * @param configs List<ServiceConfigDTO>
      * @return Map<String, Map<String, String>>
      */
-    private static Map<String, Map<String, String>> 
serviceConfig2Map(List<ServiceConfigDTO> configs) {
-        Map<String, Map<String, String>> outerMap = new HashMap<>();
+    private static Map<String, Map<String, PropertyDTO>> 
serviceConfig2Map(List<ServiceConfigDTO> configs) {
+        Map<String, Map<String, PropertyDTO>> outerMap = new HashMap<>();
         if (CollectionUtils.isEmpty(configs)) {
             return outerMap;
         }
 
         for (ServiceConfigDTO config : configs) {
-            Map<String, String> innerMap = new HashMap<>();
+            Map<String, PropertyDTO> innerMap = new HashMap<>();
             for (PropertyDTO property : config.getProperties()) {
-                innerMap.put(property.getName(), property.getValue());
+                innerMap.put(property.getName(), property);
             }
 
             outerMap.put(config.getName(), innerMap);
@@ -150,4 +167,19 @@ public class StackConfigUtils {
 
         return outerMap;
     }
+
+    private static List<ServiceConfigDTO> map2ServiceConfig(Map<String, 
Map<String, PropertyDTO>> configMap) {
+        List<ServiceConfigDTO> configs = new ArrayList<>();
+        for (Map.Entry<String, Map<String, PropertyDTO>> entry : 
configMap.entrySet()) {
+            ServiceConfigDTO serviceConfig = new ServiceConfigDTO();
+            String name = entry.getKey();
+            List<PropertyDTO> properties = new 
ArrayList<>(entry.getValue().values());
+
+            serviceConfig.setName(name);
+            serviceConfig.setProperties(properties);
+            configs.add(serviceConfig);
+        }
+
+        return configs;
+    }
 }
diff --git 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/zookeeper/configuration/zoo.cfg.xml
 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/zookeeper/configuration/zoo.cfg.xml
index bd09086c..09d3478b 100644
--- 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/zookeeper/configuration/zoo.cfg.xml
+++ 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/zookeeper/configuration/zoo.cfg.xml
@@ -89,6 +89,16 @@
         <value>9393</value>
         <description>The port the embedded Jetty server listens on. Defaults 
to 8080.</description>
     </property>
+    <property>
+        <name>metricsProvider.className</name>
+        
<value>org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider</value>
+        <description>ZooKeeper prometheus metrics provider.</description>
+    </property>
+    <property>
+        <name>metricsProvider.httpPort</name>
+        <value>7000</value>
+        <description>ZooKeeper prometheus metrics provider http 
port.</description>
+    </property>
     <property>
         <name>content</name>
         <description>The port the embedded Jetty server listens on. Defaults 
to 8080.</description>

Reply via email to