From 27acb60c8355433c7c21aeb734ad04eb1a8657ff Mon Sep 17 00:00:00 2001 From: lepdou Date: Thu, 17 Feb 2022 20:30:59 +0800 Subject: [PATCH] 1. remove global attribute currentUser, which may cause concurrent bug 2. import app's source owner name --- CHANGES.md | 1 + .../apollo/portal/service/AppService.java | 7 --- .../portal/service/ConfigsImportService.java | 60 +++++++++---------- 3 files changed, 29 insertions(+), 39 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 244961d087c..831ac837a5b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -42,5 +42,6 @@ Apollo 2.0.0 * [Fix bug: associated namespace display incorrect in text view](https://github.com/apolloconfig/apollo/pull/4219) * [Add Ordered interface to ProviderManager SPI](https://github.com/apolloconfig/apollo/pull/4218) * [Using commons-lang3 to replace commons-lang](https://github.com/apolloconfig/apollo/pull/4225) +* [optimize import/export config](https://github.com/apolloconfig/apollo/pull/4231) ------------------ All issues and pull requests are [here](https://github.com/ctripcorp/apollo/milestone/8?closed=1) diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/AppService.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/AppService.java index 327dd0394d2..faaa68fac24 100644 --- a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/AppService.java +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/AppService.java @@ -162,13 +162,6 @@ public App importAppInLocal(App app) { return app; } - UserInfo owner = userService.findByUserId(app.getOwnerName()); - if (owner == null) { - throw new BadRequestException("Application's owner not exist."); - } - - app.setOwnerEmail(owner.getEmail()); - App createdApp = appRepository.save(app); roleInitializationService.initAppRoles(createdApp); diff --git a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/ConfigsImportService.java b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/ConfigsImportService.java index d8267a77edd..f0f74b0d2d9 100644 --- a/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/ConfigsImportService.java +++ b/apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/service/ConfigsImportService.java @@ -72,8 +72,6 @@ public class ConfigsImportService { private final ApplicationEventPublisher publisher; private final UserInfoHolder userInfoHolder; private final RoleInitializationService roleInitializationService; - private String currentUser; - public ConfigsImportService( final ItemService itemService, @@ -106,9 +104,9 @@ public void forceImportNamespaceFromFile(final Env env, final String standardFil throw new ServiceException("Read config file errors:{}", e); } - currentUser = userInfoHolder.getUser().getUserId(); + String operator = userInfoHolder.getUser().getUserId(); - this.importNamespaceFromText(env, standardFilename, configText, false); + this.importNamespaceFromText(env, standardFilename, configText, false, operator); } /** @@ -179,15 +177,15 @@ public void importDataFromZipFile(List importEnvs, ZipInputStream dataZip, private void doImport(List importEnvs, List toImportApps, List toImportAppNSs, List toImportClusters, List toImportNSs) throws InterruptedException { - currentUser = userInfoHolder.getUser().getUserId(); - LOGGER.info("Start to import app. size = {}", toImportApps.size()); + String operator = userInfoHolder.getUser().getUserId(); + long startTime = System.currentTimeMillis(); CountDownLatch appLatch = new CountDownLatch(toImportApps.size()); toImportApps.parallelStream().forEach(app -> { try { - importApp(app, importEnvs); + importApp(app, importEnvs, operator); } catch (Exception e) { LOGGER.error("import app error. app = {}", app, e); } finally { @@ -203,7 +201,7 @@ private void doImport(List importEnvs, List toImportApps, List { try { - importAppNamespace(appNS); + importAppNamespace(appNS, operator); } catch (Exception e) { LOGGER.error("import appnamespace error. appnamespace = {}", appNS, e); } finally { @@ -219,7 +217,7 @@ private void doImport(List importEnvs, List toImportApps, List { try { - importCluster(cluster, importEnvs); + importCluster(cluster, importEnvs, operator); } catch (Exception e) { LOGGER.error("import cluster error. cluster = {}", cluster, e); } finally { @@ -236,7 +234,7 @@ private void doImport(List importEnvs, List toImportApps, List { try { importNamespaceFromText(namespace.getEnv(), namespace.getFileName(), namespace.getContent(), - namespace.isIgnoreConflictNamespace()); + namespace.isIgnoreConflictNamespace(), operator); } catch (Exception e) { LOGGER.error("import namespace error. namespace = {}", namespace, e); } finally { @@ -248,14 +246,12 @@ private void doImport(List importEnvs, List toImportApps, List importEnvs) { + private void importApp(String appInfo, List importEnvs, String operator) { App toImportApp = gson.fromJson(appInfo, App.class); String appId = toImportApp.getAppId(); - //imported app set owner to current user. - toImportApp.setOwnerName(currentUser); - toImportApp.setDataChangeCreatedBy(currentUser); - toImportApp.setDataChangeLastModifiedBy(currentUser); + toImportApp.setDataChangeCreatedBy(operator); + toImportApp.setDataChangeLastModifiedBy(operator); toImportApp.setDataChangeCreatedTime(new Date()); toImportApp.setDataChangeLastModifiedTime(new Date()); @@ -274,7 +270,7 @@ private void importApp(String appInfo, List importEnvs) { }); } - private void importAppNamespace(String appNamespace) { + private void importAppNamespace(String appNamespace, String operator) { AppNamespace toImportPubAppNS = gson.fromJson(appNamespace, AppNamespace.class); String appId = toImportPubAppNS.getAppId(); @@ -292,8 +288,8 @@ private void importAppNamespace(String appNamespace) { managedAppNamespace.setPublic(isPublic); managedAppNamespace.setFormat(toImportPubAppNS.getFormat()); managedAppNamespace.setComment(toImportPubAppNS.getComment()); - managedAppNamespace.setDataChangeCreatedBy(currentUser); - managedAppNamespace.setDataChangeLastModifiedBy(currentUser); + managedAppNamespace.setDataChangeCreatedBy(operator); + managedAppNamespace.setDataChangeLastModifiedBy(operator); managedAppNamespace.setName(namespaceName); AppNamespace createdAppNamespace = appNamespaceService.importAppNamespaceInLocal(managedAppNamespace); @@ -305,11 +301,11 @@ private void importAppNamespace(String appNamespace) { } } - private void importCluster(String clusterInfo, List importEnvs) { + private void importCluster(String clusterInfo, List importEnvs, String operator) { ClusterDTO toImportCluster = gson.fromJson(clusterInfo, ClusterDTO.class); - toImportCluster.setDataChangeCreatedBy(currentUser); - toImportCluster.setDataChangeLastModifiedBy(currentUser); + toImportCluster.setDataChangeCreatedBy(operator); + toImportCluster.setDataChangeLastModifiedBy(operator); toImportCluster.setDataChangeCreatedTime(new Date()); toImportCluster.setDataChangeLastModifiedTime(new Date()); @@ -339,19 +335,19 @@ private void importCluster(String clusterInfo, List importEnvs) { * @param configText config content */ private void importNamespaceFromText(final Env env, final String standardFilename, final String configText, - boolean ignoreConflictNamespace) { + boolean ignoreConflictNamespace, String operator) { final String appId = ConfigFileUtils.getAppId(standardFilename); final String clusterName = ConfigFileUtils.getClusterName(standardFilename); final String namespace = ConfigFileUtils.getNamespace(standardFilename); final String format = ConfigFileUtils.getFormat(standardFilename); - this.importNamespace(appId, env, clusterName, namespace, configText, format, ignoreConflictNamespace); + this.importNamespace(appId, env, clusterName, namespace, configText, format, ignoreConflictNamespace, operator); } private void importNamespace(final String appId, final Env env, final String clusterName, final String namespaceName, final String configText, final String format, - boolean ignoreConflictNamespace) { + boolean ignoreConflictNamespace, String operator) { NamespaceDTO namespaceDTO; try { namespaceDTO = namespaceService.loadNamespaceBaseInfo(appId, env, clusterName, namespaceName); @@ -365,12 +361,12 @@ private void importNamespace(final String appId, final Env env, namespaceDTO.setAppId(appId); namespaceDTO.setClusterName(clusterName); namespaceDTO.setNamespaceName(namespaceName); - namespaceDTO.setDataChangeCreatedBy(currentUser); - namespaceDTO.setDataChangeLastModifiedBy(currentUser); + namespaceDTO.setDataChangeCreatedBy(operator); + namespaceDTO.setDataChangeLastModifiedBy(operator); namespaceDTO = namespaceService.createNamespace(env, namespaceDTO); - roleInitializationService.initNamespaceRoles(appId, namespaceName, currentUser); - roleInitializationService.initNamespaceEnvRoles(appId, namespaceName, currentUser); + roleInitializationService.initNamespaceRoles(appId, namespaceName, operator); + roleInitializationService.initNamespaceEnvRoles(appId, namespaceName, operator); } List itemDTOS = itemService.findItems(appId, env, clusterName, namespaceName); @@ -379,18 +375,18 @@ private void importNamespace(final String appId, final Env env, return; } - importItems(appId, env, clusterName, namespaceName, configText, namespaceDTO); + importItems(appId, env, clusterName, namespaceName, configText, namespaceDTO, operator); } private void importItems(String appId, Env env, String clusterName, String namespaceName, String configText, - NamespaceDTO namespaceDTO) { + NamespaceDTO namespaceDTO, String operator) { List toImportItems = gson.fromJson(configText, GsonType.ITEM_DTOS); toImportItems.parallelStream().forEach(newItem -> { String key = newItem.getKey(); newItem.setNamespaceId(namespaceDTO.getId()); - newItem.setDataChangeCreatedBy(currentUser); - newItem.setDataChangeLastModifiedBy(currentUser); + newItem.setDataChangeCreatedBy(operator); + newItem.setDataChangeLastModifiedBy(operator); newItem.setDataChangeCreatedTime(new Date()); newItem.setDataChangeLastModifiedTime(new Date());