aboutsummaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorSteve Marion <steve.marion@sonarsource.com>2025-02-27 11:05:42 +0100
committersonartech <sonartech@sonarsource.com>2025-02-28 20:03:15 +0000
commit619d33ec4301d2c1a572b3dd7802bfd3e270ed00 (patch)
tree2630826f35feec7a8eca8c19eb42c4d03393decf /server
parentc53c26e61c123bb075fd42dbe2ba4e2f8d811ab9 (diff)
downloadsonarqube-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')
-rw-r--r--server/sonar-ce/src/main/java/org/sonar/ce/container/ComputeEngineContainerImpl.java78
-rw-r--r--server/sonar-webserver/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel1.java32
-rw-r--r--server/sonar-webserver/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel2.java9
-rw-r--r--server/sonar-webserver/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel3.java9
-rw-r--r--server/sonar-webserver/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java8
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;
}
-
}