Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BIGTOP-4341: Only require changed configs to reduce request body size #161

Merged
merged 2 commits into from
Jan 26, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,7 @@ public void onMessage(ReqT message) {
if (isTaskRequest(message)) {
try {
Method method = message.getClass().getDeclaredMethod("getTaskId");
method.setAccessible(true);
Long taskId = (Long) method.invoke(message);
method.setAccessible(false);
truncateLogFile(taskId);
MDC.put("taskId", String.valueOf(taskId));
Caches.RUNNING_TASK = taskId;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,6 @@
*/
syntax = "proto3";

import "google/protobuf/struct.proto";

option java_multiple_files = true;
option java_package = "org.apache.bigtop.manager.grpc.generated";
option java_outer_classname = "ComponentCommandProto";
Expand Down
2 changes: 0 additions & 2 deletions bigtop-manager-grpc/src/main/resources/proto/job_cache.proto
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,6 @@
*/
syntax = "proto3";

import "google/protobuf/struct.proto";

option java_multiple_files = true;
option java_package = "org.apache.bigtop.manager.grpc.generated";
option java_outer_classname = "JobCacheProto";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
import org.apache.bigtop.manager.server.model.dto.ServiceDTO;
import org.apache.bigtop.manager.server.model.dto.StackDTO;
import org.apache.bigtop.manager.server.model.dto.command.ServiceCommandDTO;
import org.apache.bigtop.manager.server.utils.StackConfigUtils;
import org.apache.bigtop.manager.server.utils.StackUtils;

import java.util.ArrayList;
Expand Down Expand Up @@ -169,8 +170,10 @@ private void saveService(ServiceCommandDTO serviceCommand) {

// Persist current configs
Map<String, String> confMap = new HashMap<>();
List<ServiceConfigDTO> configs = serviceCommand.getConfigs();
List<ServiceConfigPO> serviceConfigPOList = ServiceConfigConverter.INSTANCE.fromDTO2PO(configs);
List<ServiceConfigDTO> oriConfigs = StackUtils.SERVICE_CONFIG_MAP.get(serviceName);
List<ServiceConfigDTO> newConfigs = serviceCommand.getConfigs();
List<ServiceConfigDTO> mergedConfigs = StackConfigUtils.mergeServiceConfigs(oriConfigs, newConfigs);
List<ServiceConfigPO> serviceConfigPOList = ServiceConfigConverter.INSTANCE.fromDTO2PO(mergedConfigs);
for (ServiceConfigPO serviceConfigPO : serviceConfigPOList) {
serviceConfigPO.setClusterId(clusterId);
serviceConfigPO.setServiceId(servicePO.getId());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import org.apache.bigtop.manager.dao.po.ServiceConfigPO;
import org.apache.bigtop.manager.server.config.MapStructSharedConfig;
import org.apache.bigtop.manager.server.model.dto.ServiceConfigDTO;
import org.apache.bigtop.manager.server.model.req.ServiceConfigReq;
import org.apache.bigtop.manager.server.model.vo.ServiceConfigVO;

import org.mapstruct.Mapper;
Expand All @@ -36,6 +37,10 @@ public interface ServiceConfigConverter {

ServiceConfigConverter INSTANCE = Mappers.getMapper(ServiceConfigConverter.class);

ServiceConfigDTO fromReq2DTO(ServiceConfigReq serviceConfigReq);

List<ServiceConfigDTO> fromReq2DTO(List<ServiceConfigReq> serviceConfigReqList);

@Mapping(target = "properties", source = "propertiesJson", qualifiedByName = "json2PropertyDTOList")
ServiceConfigDTO fromPO2DTO(ServiceConfigPO serviceConfigPO);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import org.apache.bigtop.manager.server.model.converter.ServiceConfigConverter;
import org.apache.bigtop.manager.server.model.converter.ServiceConfigSnapshotConverter;
import org.apache.bigtop.manager.server.model.converter.ServiceConverter;
import org.apache.bigtop.manager.server.model.dto.ServiceConfigDTO;
import org.apache.bigtop.manager.server.model.query.PageQuery;
import org.apache.bigtop.manager.server.model.req.ServiceConfigReq;
import org.apache.bigtop.manager.server.model.req.ServiceConfigSnapshotReq;
Expand All @@ -43,6 +44,8 @@
import org.apache.bigtop.manager.server.model.vo.ServiceVO;
import org.apache.bigtop.manager.server.service.ServiceService;
import org.apache.bigtop.manager.server.utils.PageUtils;
import org.apache.bigtop.manager.server.utils.StackConfigUtils;
import org.apache.bigtop.manager.server.utils.StackUtils;

import org.apache.commons.collections4.CollectionUtils;

Expand All @@ -54,7 +57,6 @@
import lombok.extern.slf4j.Slf4j;

import jakarta.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -116,15 +118,26 @@ public List<ServiceConfigVO> listConf(Long clusterId, Long serviceId) {

@Override
public List<ServiceConfigVO> updateConf(Long clusterId, Long serviceId, List<ServiceConfigReq> reqs) {
List<ServiceConfigPO> list = new ArrayList<>();
for (ServiceConfigReq req : reqs) {
ServiceConfigPO serviceConfigPO = new ServiceConfigPO();
serviceConfigPO.setId(req.getId());
serviceConfigPO.setPropertiesJson(JsonUtils.writeAsString(req.getProperties()));
list.add(serviceConfigPO);
}

serviceConfigDao.partialUpdateByIds(list);
ServicePO servicePO = serviceDao.findById(serviceId);
List<ServiceConfigPO> configs = serviceConfigDao.findByServiceId(serviceId);

List<ServiceConfigDTO> oriConfigs;
List<ServiceConfigDTO> newConfigs;
List<ServiceConfigDTO> mergedConfigs;

// Merge stack config with existing config first, in case new property has been added to stack config.
oriConfigs = StackUtils.SERVICE_CONFIG_MAP.get(servicePO.getName());
newConfigs = ServiceConfigConverter.INSTANCE.fromPO2DTO(configs);
mergedConfigs = StackConfigUtils.mergeServiceConfigs(oriConfigs, newConfigs);

// Merge existing config with new config in request object
oriConfigs = mergedConfigs;
newConfigs = ServiceConfigConverter.INSTANCE.fromReq2DTO(reqs);
mergedConfigs = StackConfigUtils.mergeServiceConfigs(oriConfigs, newConfigs);

// Save merged config
List<ServiceConfigPO> serviceConfigPOList = ServiceConfigConverter.INSTANCE.fromDTO2PO(mergedConfigs);
serviceConfigDao.partialUpdateByIds(serviceConfigPOList);
return listConf(clusterId, serviceId);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,17 @@

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;
import org.apache.bigtop.manager.server.stack.model.AttrsModel;
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;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
Expand Down Expand Up @@ -68,23 +73,81 @@ private static PropertyDTO getPropertyDTO(PropertyModel propertyModel) {
return propertyDTO;
}

public static List<ServiceConfigDTO> mergeServiceConfigs(
List<ServiceConfigDTO> oriConfigs, List<ServiceConfigDTO> overrideConfigs) {
// To avoid to change the original configs, we use cloned object
List<ServiceConfigDTO> mergedConfigs = new ArrayList<>();
for (ServiceConfigDTO oriConfig : oriConfigs) {
ServiceConfigDTO mergedConfig = new ServiceConfigDTO();
BeanUtils.copyProperties(oriConfig, mergedConfig);
mergedConfigs.add(mergedConfig);
}

if (CollectionUtils.isEmpty(overrideConfigs)) {
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, 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()) {
String propertyName = property.getName();
String value = overridePropertiesMap.remove(propertyName);
if (value != null) {
property.setValue(value);
}
}

// 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);
}
}
}

return mergedConfigs;
}

/**
* extract config from List<Map<String,Object>> to Map<String,Object>
* extract config from List<ServiceConfigDTO> to Map<String, Map<String, String>>
*
* @param list List<PropertyModel>
* @return Map<String, Object>
* @param configs List<ServiceConfigDTO>
* @return Map<String, Map<String, String>>
*/
public static Map<String, Object> extractConfigMap(List<PropertyDTO> list) {
if (list == null) {
return null;
private static Map<String, Map<String, String>> serviceConfig2Map(List<ServiceConfigDTO> configs) {
Map<String, Map<String, String>> outerMap = new HashMap<>();
if (CollectionUtils.isEmpty(configs)) {
return outerMap;
}

Map<String, Object> hashMap = new HashMap<>();
for (PropertyDTO property : list) {
String key = property.getName();
Object value = property.getValue();
hashMap.put(key, value);
for (ServiceConfigDTO config : configs) {
Map<String, String> innerMap = new HashMap<>();
for (PropertyDTO property : config.getProperties()) {
innerMap.put(property.getName(), property.getValue());
}

outerMap.put(config.getName(), innerMap);
}
return hashMap;

return outerMap;
}
}
Loading