Skip to content

Commit 5b1d4ac

Browse files
author
john
committed
Fix #13538: Remove config_info_beta table and migrate Beta configuration to config_info_gray table
1 parent a8c1c2a commit 5b1d4ac

File tree

25 files changed

+731
-2934
lines changed

25 files changed

+731
-2934
lines changed

config/src/main/java/com/alibaba/nacos/config/server/controller/ConfigController.java

Lines changed: 71 additions & 109 deletions
Large diffs are not rendered by default.

config/src/main/java/com/alibaba/nacos/config/server/controller/v3/ConfigControllerV3.java

Lines changed: 56 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@
5151
import com.alibaba.nacos.config.server.service.ConfigMigrateService;
5252
import com.alibaba.nacos.config.server.service.ConfigOperationService;
5353
import com.alibaba.nacos.config.server.service.listener.ConfigListenerStateDelegate;
54-
import com.alibaba.nacos.config.server.service.repository.ConfigInfoBetaPersistService;
5554
import com.alibaba.nacos.config.server.service.repository.ConfigInfoGrayPersistService;
5655
import com.alibaba.nacos.config.server.service.repository.ConfigInfoPersistService;
5756
import com.alibaba.nacos.config.server.service.trace.ConfigTraceService;
@@ -113,52 +112,49 @@
113112
@RequestMapping(Constants.CONFIG_ADMIN_V3_PATH)
114113
@ExtractorManager.Extractor(httpExtractor = ConfigDefaultHttpParamExtractor.class)
115114
public class ConfigControllerV3 {
116-
115+
117116
private static final Logger LOGGER = LoggerFactory.getLogger(ConfigControllerV3.class);
118-
117+
119118
private static final String EXPORT_CONFIG_FILE_NAME = "nacos_config_export_";
120-
119+
121120
private static final String EXPORT_CONFIG_FILE_NAME_EXT = ".zip";
122-
121+
123122
private static final String EXPORT_CONFIG_FILE_NAME_DATE_FORMAT = "yyyyMMddHHmmss";
124-
123+
125124
private final ConfigOperationService configOperationService;
126-
125+
127126
private final ConfigInfoPersistService configInfoPersistService;
128-
127+
129128
private final ConfigDetailService configDetailService;
130-
129+
131130
private final ConfigInfoGrayPersistService configInfoGrayPersistService;
132-
133-
private final ConfigInfoBetaPersistService configInfoBetaPersistService;
134-
131+
135132
private final NamespacePersistService namespacePersistService;
136-
133+
137134
private final ConfigListenerStateDelegate configListenerStateDelegate;
138-
135+
139136
private final ConfigMigrateService configMigrateService;
140137

141138
/**
142139
* Flag to indicate if the table `config_info_beta` exists, which means the old version of table schema is used.
143140
*/
144141
private boolean oldTableVersion;
145-
142+
146143
public ConfigControllerV3(ConfigOperationService configOperationService,
147144
ConfigInfoPersistService configInfoPersistService, ConfigDetailService configDetailService,
148145
ConfigInfoGrayPersistService configInfoGrayPersistService,
149-
ConfigInfoBetaPersistService configInfoBetaPersistService, NamespacePersistService namespacePersistService,
146+
NamespacePersistService namespacePersistService,
150147
ConfigListenerStateDelegate configListenerStateDelegate, ConfigMigrateService configMigrateService) {
151148
this.configOperationService = configOperationService;
152149
this.configInfoPersistService = configInfoPersistService;
153150
this.configDetailService = configDetailService;
154151
this.configInfoGrayPersistService = configInfoGrayPersistService;
155-
this.configInfoBetaPersistService = configInfoBetaPersistService;
156152
this.namespacePersistService = namespacePersistService;
157153
this.configListenerStateDelegate = configListenerStateDelegate;
158154
this.configMigrateService = configMigrateService;
159155
this.oldTableVersion = namespacePersistService.isExistTable("config_info_beta");
160156
}
161-
157+
162158
/**
163159
* Query configuration.
164160
*/
@@ -185,7 +181,7 @@ public Result<ConfigDetailInfo> getConfig(ConfigFormV3 configForm) throws NacosE
185181
ConfigDetailInfo result = ResponseUtil.transferToConfigDetailInfo(configAllInfo);
186182
return Result.success(result);
187183
}
188-
184+
189185
/**
190186
* Publish configuration.
191187
*/
@@ -197,19 +193,19 @@ public Result<Boolean> publishConfig(HttpServletRequest request, ConfigFormV3 co
197193
configForm.validateWithContent();
198194
final boolean namespaceTransferred = NamespaceUtil.isNeedTransferNamespace(configForm.getNamespaceId());
199195
configForm.setNamespaceId(NamespaceUtil.processNamespaceParameter(configForm.getNamespaceId()));
200-
196+
201197
// check param
202198
ParamUtils.checkParam(configForm.getDataId(), configForm.getGroup(), "datumId", configForm.getContent());
203199
ParamUtils.checkParamV2(configForm.getTag());
204-
200+
205201
if (StringUtils.isBlank(configForm.getSrcUser())) {
206202
configForm.setSrcUser(RequestUtil.getSrcUserName(request));
207203
}
208-
204+
209205
if (!ConfigType.isValidType(configForm.getType())) {
210206
configForm.setType(ConfigType.getDefaultType().getType());
211207
}
212-
208+
213209
String encryptedDataKeyFinal = configForm.getEncryptedDataKey();
214210
if (StringUtils.isBlank(encryptedDataKeyFinal)) {
215211
// encrypted
@@ -218,18 +214,18 @@ public Result<Boolean> publishConfig(HttpServletRequest request, ConfigFormV3 co
218214
configForm.setContent(pair.getSecond());
219215
encryptedDataKeyFinal = pair.getFirst();
220216
}
221-
217+
222218
ConfigRequestInfo configRequestInfo = new ConfigRequestInfo();
223219
configRequestInfo.setSrcIp(RequestUtil.getRemoteIp(request));
224220
configRequestInfo.setRequestIpApp(RequestUtil.getAppName(request));
225221
configRequestInfo.setBetaIps(request.getHeader("betaIps"));
226222
configRequestInfo.setCasMd5(request.getHeader("casMd5"));
227223
configRequestInfo.setNamespaceTransferred(namespaceTransferred);
228-
224+
229225
return Result.success(
230226
configOperationService.publishConfig(configForm, configRequestInfo, encryptedDataKeyFinal));
231227
}
232-
228+
233229
/**
234230
* Delete configuration.
235231
*/
@@ -241,15 +237,15 @@ public Result<Boolean> deleteConfig(HttpServletRequest request, ConfigFormV3 con
241237
String namespaceId = NamespaceUtil.processNamespaceParameter(configForm.getNamespaceId());
242238
String tag = configForm.getTag();
243239
ParamUtils.checkParamV2(tag);
244-
240+
245241
String clientIp = getRemoteIp(request);
246242
String srcUser = RequestUtil.getSrcUserName(request);
247-
243+
248244
return Result.success(
249245
configOperationService.deleteConfig(configForm.getDataId(), configForm.getGroupName(), namespaceId, tag,
250246
clientIp, srcUser, Constants.HTTP));
251247
}
252-
248+
253249
/**
254250
* Batch delete configuration by ids.
255251
*/
@@ -274,7 +270,7 @@ public Result<Boolean> deleteConfigs(HttpServletRequest request, @RequestParam(v
274270
return Result.failure(ErrorCode.SERVER_ERROR);
275271
}
276272
}
277-
273+
278274
/**
279275
* Subscribe to configured client information.
280276
*/
@@ -289,7 +285,7 @@ public Result<ConfigListenerInfo> getListeners(ConfigFormV3 configForm, Aggregat
289285
configListenerStateDelegate.getListenerState(configForm.getDataId(), configForm.getGroupName(),
290286
namespaceId, aggregationForm.isAggregation()));
291287
}
292-
288+
293289
/**
294290
* List or Search config by config condition.
295291
*
@@ -325,7 +321,7 @@ public Result<Page<ConfigBasicInfo>> list(ConfigFormV3 configForm, PageForm page
325321
String namespaceId = NamespaceUtil.processNamespaceParameter(configForm.getNamespaceId());
326322
String dataId = configForm.getDataId();
327323
String groupName = configForm.getGroupName();
328-
324+
329325
Page<ConfigInfo> configInfoPage = configDetailService.findConfigInfoPage(search, pageNo, pageSize, dataId,
330326
groupName, namespaceId, configAdvanceInfo);
331327
Page<ConfigBasicInfo> result = new Page<>();
@@ -336,7 +332,7 @@ public Result<Page<ConfigBasicInfo>> list(ConfigFormV3 configForm, PageForm page
336332
.collect(Collectors.toList()));
337333
return Result.success(result);
338334
}
339-
335+
340336
/**
341337
* Execute to remove beta operation.
342338
*/
@@ -359,19 +355,19 @@ public Result<Boolean> stopBeta(HttpServletRequest httpServletRequest, ConfigFor
359355
LOGGER.error("remove beta data error", e);
360356
return Result.failure(ErrorCode.SERVER_ERROR.getCode(), "remove beta data error", false);
361357
}
362-
358+
363359
ConfigTraceService.logPersistenceEvent(dataId, groupName, namespaceId, requestIpApp, System.currentTimeMillis(),
364360
remoteIp, ConfigTraceService.PERSISTENCE_EVENT_BETA, ConfigTraceService.PERSISTENCE_TYPE_REMOVE, null);
365361
if (PropertyUtil.isGrayCompatibleModel() && oldTableVersion) {
366-
configInfoBetaPersistService.removeConfigInfo4Beta(dataId, groupName, namespaceId);
362+
// configInfoBetaPersistService.removeConfigInfo4Beta(dataId, groupName, namespaceId); // Removed
367363
}
368364
ConfigChangePublisher.notifyConfigChange(
369365
new ConfigDataChangeEvent(dataId, groupName, namespaceId, BetaGrayRule.TYPE_BETA,
370366
System.currentTimeMillis()));
371-
367+
372368
return Result.success(true);
373369
}
374-
370+
375371
/**
376372
* Execute to query beta operation.
377373
*/
@@ -396,7 +392,7 @@ public Result<ConfigGrayInfo> queryBeta(ConfigFormV3 configForm) throws NacosApi
396392
"Config is not in beta.");
397393
}
398394
}
399-
395+
400396
/**
401397
* Execute import and publish config operation.
402398
*/
@@ -411,7 +407,7 @@ public Result<Map<String, Object>> importAndPublishConfig(HttpServletRequest req
411407
if (Objects.isNull(file)) {
412408
return Result.failure(ErrorCode.DATA_EMPTY, failedData);
413409
}
414-
410+
415411
namespaceId = NamespaceUtil.processNamespaceParameter(namespaceId);
416412
if (StringUtils.isNotBlank(namespaceId) && !NamespaceUtil.isDefaultNamespaceId(namespaceId)
417413
&& namespacePersistService.tenantInfoCountByTenantId(namespaceId) <= 0) {
@@ -435,7 +431,7 @@ public Result<Map<String, Object>> importAndPublishConfig(HttpServletRequest req
435431
LOGGER.error("parsing data failed", e);
436432
return Result.failure(ErrorCode.PARSING_DATA_FAILED, failedData);
437433
}
438-
434+
439435
if (CollectionUtils.isEmpty(configInfoList)) {
440436
failedData.put("succCount", 0);
441437
return Result.failure(ErrorCode.DATA_EMPTY, failedData);
@@ -459,10 +455,10 @@ public Result<Map<String, Object>> importAndPublishConfig(HttpServletRequest req
459455
saveResult.put("unrecognizedCount", unrecognizedList.size());
460456
saveResult.put("unrecognizedData", unrecognizedList);
461457
}
462-
458+
463459
return Result.success(saveResult);
464460
}
465-
461+
466462
/**
467463
* Import config add .metadata.yml file.
468464
*/
@@ -471,7 +467,7 @@ private Result<Map<String, Object>> parseImportDataV2(String srcUser, ZipUtils.U
471467
ZipUtils.ZipItem metaDataItem = unziped.getMetaDataItem();
472468
String metaData = metaDataItem.getItemData();
473469
Map<String, Object> failedData = new HashMap<>(4);
474-
470+
475471
ConfigMetadata configMetadata = YamlParserUtil.loadObject(metaData, ConfigMetadata.class);
476472
if (configMetadata == null || CollectionUtils.isEmpty(configMetadata.getMetadata())) {
477473
failedData.put("succCount", 0);
@@ -486,12 +482,12 @@ private Result<Map<String, Object>> parseImportDataV2(String srcUser, ZipUtils.U
486482
return Result.failure(ErrorCode.METADATA_ILLEGAL, failedData);
487483
}
488484
}
489-
485+
490486
List<ZipUtils.ZipItem> zipItemList = unziped.getZipItemList();
491487
Set<String> metaDataKeys = configExportItems.stream()
492488
.map(metaItem -> GroupKey.getKey(metaItem.getDataId(), metaItem.getGroup()))
493489
.collect(Collectors.toSet());
494-
490+
495491
Map<String, String> configContentMap = new HashMap<>(zipItemList.size());
496492
int itemNameLength = 2;
497493
zipItemList.forEach(item -> {
@@ -503,7 +499,7 @@ private Result<Map<String, Object>> parseImportDataV2(String srcUser, ZipUtils.U
503499
unrecognizedList.add(unrecognizedItem);
504500
return;
505501
}
506-
502+
507503
String group = groupAdnDataId[0];
508504
String dataId = groupAdnDataId[1];
509505
String key = GroupKey.getKey(dataId, group);
@@ -517,7 +513,7 @@ private Result<Map<String, Object>> parseImportDataV2(String srcUser, ZipUtils.U
517513
String itemData = item.getItemData();
518514
configContentMap.put(key, itemData);
519515
});
520-
516+
521517
for (ConfigMetadata.ConfigExportItem configExportItem : configExportItems) {
522518
String dataId = configExportItem.getDataId();
523519
String group = configExportItem.getGroup();
@@ -532,7 +528,7 @@ private Result<Map<String, Object>> parseImportDataV2(String srcUser, ZipUtils.U
532528
// encrypted
533529
Pair<String, String> pair = EncryptionHandler.encryptHandler(dataId, content);
534530
content = pair.getSecond();
535-
531+
536532
ConfigAllInfo ci = new ConfigAllInfo();
537533
ci.setGroup(group);
538534
ci.setDataId(dataId);
@@ -545,10 +541,10 @@ private Result<Map<String, Object>> parseImportDataV2(String srcUser, ZipUtils.U
545541
ci.setCreateUser(srcUser);
546542
configInfoList.add(ci);
547543
}
548-
544+
549545
return null;
550546
}
551-
547+
552548
/**
553549
* Export config add metadata.yml file record config metadata.
554550
*/
@@ -585,10 +581,10 @@ public ResponseEntity<byte[]> exportConfig(ConfigFormV3 configForm,
585581
EXPORT_CONFIG_FILE_NAME + DateFormatUtils.format(new Date(), EXPORT_CONFIG_FILE_NAME_DATE_FORMAT)
586582
+ EXPORT_CONFIG_FILE_NAME_EXT;
587583
headers.add("Content-Disposition", "attachment;filename=" + fileName);
588-
584+
589585
return new ResponseEntity<>(ZipUtils.zip(zipItemList), headers, HttpStatus.OK);
590586
}
591-
587+
592588
/**
593589
* Execute clone config operation.
594590
*/
@@ -604,31 +600,31 @@ public Result<Map<String, Object>> cloneConfig(HttpServletRequest request,
604600
return Result.failure(ErrorCode.NO_SELECTED_CONFIG, failedData);
605601
}
606602
cloneInfos.removeAll(Collections.singleton(null));
607-
603+
608604
namespaceId = NamespaceUtil.processNamespaceParameter(namespaceId);
609605
if (StringUtils.isNotBlank(namespaceId) && !NamespaceUtil.isDefaultNamespaceId(namespaceId)
610606
&& namespacePersistService.tenantInfoCountByTenantId(namespaceId) <= 0) {
611607
failedData.put("succCount", 0);
612608
return Result.failure(ErrorCode.NAMESPACE_NOT_EXIST, failedData);
613609
}
614-
610+
615611
List<Long> idList = new ArrayList<>(cloneInfos.size());
616612
Map<Long, ConfigCloneInfo> configBeansMap = cloneInfos.stream()
617613
.collect(Collectors.toMap(ConfigCloneInfo::getConfigId, cfg -> {
618614
idList.add(cfg.getConfigId());
619615
return cfg;
620616
}, (k1, k2) -> k1));
621-
617+
622618
List<ConfigAllInfo> queryedDataList = configInfoPersistService.findAllConfigInfo4Export(null, null, null, null,
623619
idList);
624-
620+
625621
if (queryedDataList == null || queryedDataList.isEmpty()) {
626622
failedData.put("succCount", 0);
627623
return Result.failure(ErrorCode.DATA_EMPTY, failedData);
628624
}
629-
625+
630626
List<ConfigAllInfo> configInfoList4Clone = new ArrayList<>(queryedDataList.size());
631-
627+
632628
for (ConfigAllInfo ci : queryedDataList) {
633629
ConfigCloneInfo paramBean = configBeansMap.get(ci.getId());
634630
ConfigAllInfo ci4save = new ConfigAllInfo();
@@ -664,7 +660,7 @@ public Result<Map<String, Object>> cloneConfig(HttpServletRequest request,
664660
ConfigTraceService.PERSISTENCE_EVENT, ConfigTraceService.PERSISTENCE_TYPE_PUB,
665661
configInfo.getContent());
666662
}
667-
663+
668664
return Result.success(saveResult);
669665
}
670-
}
666+
}

0 commit comments

Comments
 (0)