diff options
author | Steve Marion <steve.marion@sonarsource.com> | 2025-02-27 11:05:42 +0100 |
---|---|---|
committer | sonartech <sonartech@sonarsource.com> | 2025-02-28 20:03:15 +0000 |
commit | 619d33ec4301d2c1a572b3dd7802bfd3e270ed00 (patch) | |
tree | 2630826f35feec7a8eca8c19eb42c4d03393decf /server | |
parent | c53c26e61c123bb075fd42dbe2ba4e2f8d811ab9 (diff) | |
download | sonarqube-619d33ec4301d2c1a572b3dd7802bfd3e270ed00.tar.gz sonarqube-619d33ec4301d2c1a572b3dd7802bfd3e270ed00.zip |
SONAR-24489 Move Core extension loading to happen before start of level containers on web and CE.
Diffstat (limited to 'server')
5 files changed, 64 insertions, 72 deletions
diff --git a/server/sonar-ce/src/main/java/org/sonar/ce/container/ComputeEngineContainerImpl.java b/server/sonar-ce/src/main/java/org/sonar/ce/container/ComputeEngineContainerImpl.java index 05c2a8b7045..488102ba2e6 100644 --- a/server/sonar-ce/src/main/java/org/sonar/ce/container/ComputeEngineContainerImpl.java +++ b/server/sonar-ce/src/main/java/org/sonar/ce/container/ComputeEngineContainerImpl.java @@ -26,6 +26,7 @@ import javax.annotation.CheckForNull; import org.slf4j.LoggerFactory; import org.sonar.api.SonarEdition; import org.sonar.api.SonarQubeSide; +import org.sonar.api.SonarRuntime; import org.sonar.api.internal.MetadataLoader; import org.sonar.api.internal.SonarRuntimeImpl; import org.sonar.api.server.profile.BuiltInQualityProfileAnnotationLoader; @@ -64,8 +65,8 @@ import org.sonar.core.extension.CoreExtensionRepositoryImpl; import org.sonar.core.extension.CoreExtensionsLoader; import org.sonar.core.language.LanguagesProvider; import org.sonar.core.metric.SoftwareQualitiesMetrics; -import org.sonar.core.platform.Container; import org.sonar.core.platform.EditionProvider; +import org.sonar.core.platform.ExtensionContainer; import org.sonar.core.platform.PlatformEditionProvider; import org.sonar.core.platform.PluginClassLoader; import org.sonar.core.platform.PluginClassloaderFactory; @@ -198,32 +199,17 @@ public class ComputeEngineContainerImpl implements ComputeEngineContainer { private static void startLevel1(SpringComponentContainer level1) { level1.startComponents(); - level1.getComponentByType(CoreExtensionsLoader.class) - .load(); - level1.getComponentByType(CECoreExtensionsInstaller.class) - .install(level1, hasPlatformLevel(1), noAdditionalSideFilter()); } private static void startLevel2(SpringComponentContainer level2) { - level2.getParent().getComponentByType(CECoreExtensionsInstaller.class) - .install(level2, hasPlatformLevel(2), noAdditionalSideFilter()); - level2.startComponents(); } private static void startLevel3(SpringComponentContainer level3) { - level3.getParent().getComponentByType(CECoreExtensionsInstaller.class) - .install(level3, hasPlatformLevel(3), noAdditionalSideFilter()); - level3.startComponents(); } private static void startLevel4(SpringComponentContainer level4) { - level4.getParent().getComponentByType(CECoreExtensionsInstaller.class) - .install(level4, hasPlatformLevel4OrNone(), noAdditionalSideFilter()); - level4.getParent().getComponentByType(ServerExtensionInstaller.class) - .installExtensions(level4); - level4.startComponents(); PlatformEditionProvider editionProvider = level4.getComponentByType(PlatformEditionProvider.class); @@ -270,16 +256,18 @@ public class ComputeEngineContainerImpl implements ComputeEngineContainer { return level4; } - private static void populateLevel1(Container container, Props props, ComputeEngineStatus computeEngineStatus) { + private static void populateLevel1(SpringComponentContainer level1Container, Props props, ComputeEngineStatus computeEngineStatus) { Version apiVersion = MetadataLoader.loadApiVersion(System2.INSTANCE); Version sqVersion = MetadataLoader.loadSQVersion(System2.INSTANCE); SonarEdition edition = MetadataLoader.loadEdition(System2.INSTANCE); - container.add( + SonarRuntime sonarRuntime = SonarRuntimeImpl.forSonarQube(apiVersion, SonarQubeSide.COMPUTE_ENGINE, edition); + + level1Container.add( props.rawProperties(), ThreadLocalSettings.class, new ConfigurationProvider(), new SonarQubeVersion(sqVersion), - SonarRuntimeImpl.forSonarQube(apiVersion, SonarQubeSide.COMPUTE_ENGINE, edition), + sonarRuntime, CeProcessLogging.class, UuidFactoryImpl.INSTANCE, NetworkUtilsImpl.INSTANCE, @@ -310,16 +298,25 @@ public class ComputeEngineContainerImpl implements ComputeEngineContainer { computeEngineStatus, NoOpAuditPersister.class, - DefaultDocumentationLinkGenerator.class, + DefaultDocumentationLinkGenerator.class); + level1Container.add(toArray(CorePropertyDefinitions.all())); - CoreExtensionRepositoryImpl.class, - CoreExtensionsLoader.class, - CECoreExtensionsInstaller.class); - container.add(toArray(CorePropertyDefinitions.all())); + addCoreExtensionMechanism(level1Container, sonarRuntime); } - private static void populateLevel2(Container container) { - container.add( + private static void addCoreExtensionMechanism(SpringComponentContainer level1Container, SonarRuntime sonarRuntime) { + var coreExtensionRepository = new CoreExtensionRepositoryImpl(); + var coreExtensionsLoader = new CoreExtensionsLoader(coreExtensionRepository); + var ceCoreExtensionsInstaller = new CECoreExtensionsInstaller(sonarRuntime, coreExtensionRepository); + + level1Container.add(coreExtensionRepository, coreExtensionsLoader, ceCoreExtensionsInstaller); + + coreExtensionsLoader.load(); + ceCoreExtensionsInstaller.install(level1Container, hasPlatformLevel(1), noAdditionalSideFilter()); + } + + private static void populateLevel2(ExtensionContainer level2Container) { + level2Container.add( new MigrationConfigurationModule(), DatabaseVersion.class, DatabaseCompatibility.class, @@ -340,20 +337,29 @@ public class ComputeEngineContainerImpl implements ComputeEngineContainer { ServerI18n.class, // used by RuleI18nManager Durations.class // used in Web Services and DebtCalculator ); + + level2Container.getParent().getOptionalComponentByType(CECoreExtensionsInstaller.class) + .orElseThrow(() -> new IllegalStateException("Core extension loading mechanism is not available")) + .install(level2Container, hasPlatformLevel(2), noAdditionalSideFilter()); } - private static void populateLevel3(Container container) { - container.add( + private static void populateLevel3(SpringComponentContainer level3Container) { + level3Container.add( new StartupMetadataProvider(), JdbcUrlSanitizer.class, ServerIdChecksum.class, UriReader.class, ServerImpl.class, SynchronousAsyncExecution.class); + + level3Container.getParent().getOptionalComponentByType(CECoreExtensionsInstaller.class) + .orElseThrow(() -> new IllegalStateException("Core extension loading mechanism is not available")) + .install(level3Container, hasPlatformLevel(3), noAdditionalSideFilter()); + } - private static void populateLevel4(Container container, Props props) { - container.add( + private static void populateLevel4(SpringComponentContainer level4Container, Props props) { + level4Container.add( RuleDescriptionFormatter.class, ComponentTypes.class, DefaultComponentTypes.get(), @@ -454,7 +460,7 @@ public class ComputeEngineContainerImpl implements ComputeEngineContainer { ); if (props.valueAsBoolean(CLUSTER_ENABLED.getKey())) { - container.add( + level4Container.add( new CeCleaningModule(), // system health @@ -465,11 +471,19 @@ public class ComputeEngineContainerImpl implements ComputeEngineContainer { DistributedServerLogging.class, ProcessInfoProvider.class); } else { - container.add( + level4Container.add( new CeCleaningModule(), ServerLogging.class, StandaloneCeDistributedInformation.class); } + + level4Container.getParent().getOptionalComponentByType(CECoreExtensionsInstaller.class) + .orElseThrow(() -> new IllegalStateException("Core extension loading mechanism is not available")) + .install(level4Container, hasPlatformLevel4OrNone(), noAdditionalSideFilter()); + + level4Container.getParent().getOptionalComponentByType(ServerExtensionInstaller.class) + .orElseThrow(() -> new IllegalStateException("Core extension loading mechanism is not available")) + .installExtensions(level4Container); } private static Object[] startupComponents() { diff --git a/server/sonar-webserver/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel1.java b/server/sonar-webserver/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel1.java index 2366d249b62..a63bffd9813 100644 --- a/server/sonar-webserver/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel1.java +++ b/server/sonar-webserver/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel1.java @@ -23,6 +23,7 @@ import java.time.Clock; import java.util.Properties; import org.sonar.api.SonarEdition; import org.sonar.api.SonarQubeSide; +import org.sonar.api.SonarRuntime; import org.sonar.api.internal.MetadataLoader; import org.sonar.api.internal.SonarRuntimeImpl; import org.sonar.api.utils.System2; @@ -39,7 +40,6 @@ import org.sonar.db.DbClient; import org.sonar.db.DefaultDatabase; import org.sonar.db.MyBatis; import org.sonar.db.StartMyBatis; -import org.sonar.db.audit.AuditPersister; import org.sonar.db.audit.NoOpAuditPersister; import org.sonar.db.purge.PurgeProfiler; import org.sonar.process.NetworkUtilsImpl; @@ -92,10 +92,12 @@ public class PlatformLevel1 extends PlatformLevel { Version apiVersion = MetadataLoader.loadApiVersion(System2.INSTANCE); Version sqVersion = MetadataLoader.loadSQVersion(System2.INSTANCE); SonarEdition edition = MetadataLoader.loadEdition(System2.INSTANCE); + SonarRuntime sonarRuntime = SonarRuntimeImpl.forSonarQube(apiVersion, SonarQubeSide.SERVER, edition); + add( new SonarQubeVersion(sqVersion), - SonarRuntimeImpl.forSonarQube(apiVersion, SonarQubeSide.SERVER, edition), + sonarRuntime, ThreadLocalSettings.class, ConfigurationProvider.class, LogServerVersion.class, @@ -145,13 +147,14 @@ public class PlatformLevel1 extends PlatformLevel { new OkHttpClientProvider(), - CoreExtensionRepositoryImpl.class, - CoreExtensionsLoader.class, - WebCoreExtensionsInstaller.class); + NoOpAuditPersister.class + ); addAll(CorePropertyDefinitions.all()); // cluster add(DefaultNodeInformation.class); + + addCoreExtensionMechanism(sonarRuntime); } private void addExtraRootComponents() { @@ -162,17 +165,14 @@ public class PlatformLevel1 extends PlatformLevel { } } - @Override - public PlatformLevel start() { - PlatformLevel start = super.start(); - get(CoreExtensionsLoader.class) - .load(); - get(WebCoreExtensionsInstaller.class) - .install(getContainer(), hasPlatformLevel(1), noAdditionalSideFilter()); - if (getOptional(AuditPersister.class).isEmpty()) { - add(NoOpAuditPersister.class); - } + private void addCoreExtensionMechanism(SonarRuntime sonarRuntime) { + var coreExtensionRepository = new CoreExtensionRepositoryImpl(); + var coreExtensionsLoader = new CoreExtensionsLoader(coreExtensionRepository); + var webCoreExtensionsInstaller = new WebCoreExtensionsInstaller(sonarRuntime, coreExtensionRepository); + + add(coreExtensionRepository, coreExtensionsLoader, webCoreExtensionsInstaller); - return start; + coreExtensionsLoader.load(); + webCoreExtensionsInstaller.install(getContainer(), hasPlatformLevel(1), noAdditionalSideFilter()); } } diff --git a/server/sonar-webserver/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel2.java b/server/sonar-webserver/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel2.java index e34bb8c6cf6..06487b3ddd7 100644 --- a/server/sonar-webserver/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel2.java +++ b/server/sonar-webserver/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel2.java @@ -23,7 +23,6 @@ import org.sonar.api.utils.Durations; import org.sonar.core.extension.CoreExtensionsInstaller; import org.sonar.core.platform.PluginClassLoader; import org.sonar.core.platform.PluginClassloaderFactory; -import org.sonar.core.platform.SpringComponentContainer; import org.sonar.server.es.MigrationEsClientImpl; import org.sonar.server.l18n.ServerI18n; import org.sonar.server.platform.DatabaseServerCompatibility; @@ -95,14 +94,8 @@ public class PlatformLevel2 extends PlatformLevel { addIfStartupLeader( DatabaseCharsetChecker.class, CheckDatabaseCharsetAtStartup.class); - } - @Override - public PlatformLevel start() { - SpringComponentContainer container = getContainer(); CoreExtensionsInstaller coreExtensionsInstaller = parent.get(WebCoreExtensionsInstaller.class); - coreExtensionsInstaller.install(container, hasPlatformLevel(2), noAdditionalSideFilter()); - - return super.start(); + coreExtensionsInstaller.install(getContainer(), hasPlatformLevel(2), noAdditionalSideFilter()); } } diff --git a/server/sonar-webserver/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel3.java b/server/sonar-webserver/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel3.java index fc0c6b2ce4b..6d29800e273 100644 --- a/server/sonar-webserver/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel3.java +++ b/server/sonar-webserver/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel3.java @@ -21,7 +21,6 @@ package org.sonar.server.platform.platformlevel; import org.sonar.api.utils.UriReader; import org.sonar.core.extension.CoreExtensionsInstaller; -import org.sonar.core.platform.SpringComponentContainer; import org.sonar.core.util.DefaultHttpDownloader; import org.sonar.server.async.AsyncExecutionModule; import org.sonar.server.platform.ServerImpl; @@ -55,14 +54,8 @@ public class PlatformLevel3 extends PlatformLevel { UriReader.class, DefaultHttpDownloader.class, new AsyncExecutionModule()); - } - @Override - public PlatformLevel start() { - SpringComponentContainer container = getContainer(); CoreExtensionsInstaller coreExtensionsInstaller = parent.get(WebCoreExtensionsInstaller.class); - coreExtensionsInstaller.install(container, hasPlatformLevel(3), noAdditionalSideFilter()); - - return super.start(); + coreExtensionsInstaller.install(getContainer(), hasPlatformLevel(3), noAdditionalSideFilter()); } } diff --git a/server/sonar-webserver/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java b/server/sonar-webserver/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java index 399170da48e..a9885cbf8d6 100644 --- a/server/sonar-webserver/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java +++ b/server/sonar-webserver/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java @@ -750,20 +750,12 @@ public class PlatformLevel4 extends PlatformLevel { addIfStandalone(ServerLogging.class); addAll(level4AddedComponents); - } - @Override - public PlatformLevel start() { SpringComponentContainer container = getContainer(); CoreExtensionsInstaller coreExtensionsInstaller = parent.get(WebCoreExtensionsInstaller.class); coreExtensionsInstaller.install(container, hasPlatformLevel4OrNone(), noAdditionalSideFilter()); ServerExtensionInstaller extensionInstaller = parent.get(ServerExtensionInstaller.class); extensionInstaller.installExtensions(container); - - super.start(); - - return this; } - } |