aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-webserver
diff options
context:
space:
mode:
authorDuarte Meneses <duarte.meneses@sonarsource.com>2021-07-27 16:10:33 -0500
committersonartech <sonartech@sonarsource.com>2021-08-04 20:08:14 +0000
commitbc4d1696a5998adcadb03c64e21aff4a467a1ab1 (patch)
tree7dd07d23f17e805db73dd60a961b05d210fdf53c /server/sonar-webserver
parentc63120be2e7c090ca42d120c756e703e7cc9eaa1 (diff)
downloadsonarqube-bc4d1696a5998adcadb03c64e21aff4a467a1ab1.tar.gz
sonarqube-bc4d1696a5998adcadb03c64e21aff4a467a1ab1.zip
SONAR-15237 Improve startup performance of the web process
Diffstat (limited to 'server/sonar-webserver')
-rw-r--r--server/sonar-webserver/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel.java6
-rw-r--r--server/sonar-webserver/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel3.java5
-rw-r--r--server/sonar-webserver/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevelStartup.java51
3 files changed, 49 insertions, 13 deletions
diff --git a/server/sonar-webserver/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel.java b/server/sonar-webserver/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel.java
index effcfb2b076..33b1d52589c 100644
--- a/server/sonar-webserver/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel.java
+++ b/server/sonar-webserver/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel.java
@@ -170,15 +170,15 @@ public abstract class PlatformLevel {
return addIfStandalone;
}
- private WebServer getWebServer() {
+ protected WebServer getWebServer() {
return getOptional(WebServer.class)
.orElseThrow(() -> new IllegalStateException("WebServer not available in Pico yet"));
}
- private abstract class AddIf {
+ protected abstract class AddIf {
private final boolean condition;
- private AddIf(boolean condition) {
+ protected AddIf(boolean condition) {
this.condition = condition;
}
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 c8a92a10719..d4e2992e549 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
@@ -29,6 +29,7 @@ import org.sonar.server.platform.StartupMetadataPersister;
import org.sonar.server.platform.WebCoreExtensionsInstaller;
import org.sonar.server.platform.db.migration.NoopDatabaseMigrationImpl;
import org.sonar.server.platform.serverid.ServerIdModule;
+import org.sonar.server.plugins.DetectPluginChange;
import org.sonar.server.setting.DatabaseSettingLoader;
import org.sonar.server.setting.DatabaseSettingsEnabler;
@@ -42,7 +43,9 @@ public class PlatformLevel3 extends PlatformLevel {
@Override
protected void configureLevel() {
- addIfStartupLeader(StartupMetadataPersister.class);
+ addIfStartupLeader(
+ StartupMetadataPersister.class,
+ DetectPluginChange.class);
add(
NoopDatabaseMigrationImpl.class,
ServerIdModule.class,
diff --git a/server/sonar-webserver/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevelStartup.java b/server/sonar-webserver/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevelStartup.java
index fab705046ab..eca4d774034 100644
--- a/server/sonar-webserver/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevelStartup.java
+++ b/server/sonar-webserver/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevelStartup.java
@@ -23,10 +23,12 @@ import org.sonar.api.utils.log.Loggers;
import org.sonar.core.platform.EditionProvider;
import org.sonar.core.platform.PlatformEditionProvider;
import org.sonar.server.app.ProcessCommandWrapper;
+import org.sonar.server.authentication.DefaultAdminCredentialsVerifierImpl;
import org.sonar.server.ce.queue.CeQueueCleaner;
import org.sonar.server.es.IndexerStartupTask;
import org.sonar.server.platform.ServerLifecycleNotifier;
import org.sonar.server.platform.web.RegisterServletFilters;
+import org.sonar.server.plugins.DetectPluginChange;
import org.sonar.server.plugins.PluginConsentVerifier;
import org.sonar.server.qualitygate.ProjectsInWarningDaemon;
import org.sonar.server.qualitygate.RegisterQualityGates;
@@ -47,6 +49,8 @@ import org.sonar.server.user.DoPrivileged;
import org.sonar.server.user.ThreadLocalUserSession;
public class PlatformLevelStartup extends PlatformLevel {
+ private AddIfStartupLeaderAndPluginsChanged addIfPluginsChanged;
+
public PlatformLevelStartup(PlatformLevel parent) {
super("startup tasks", parent);
}
@@ -54,29 +58,57 @@ public class PlatformLevelStartup extends PlatformLevel {
@Override
protected void configureLevel() {
add(GeneratePluginIndex.class,
- RegisterPlugins.class,
ServerLifecycleNotifier.class);
addIfStartupLeader(
- IndexerStartupTask.class,
+ IndexerStartupTask.class);
+ addIfStartupLeaderAndPluginsChanged(
RegisterMetrics.class,
RegisterQualityGates.class,
- RegisterRules.class);
- add(BuiltInQProfileLoader.class);
+ RegisterRules.class,
+ BuiltInQProfileLoader.class);
addIfStartupLeader(
BuiltInQualityProfilesUpdateListener.class,
+ BuiltInQProfileUpdateImpl.class);
+ addIfStartupLeaderAndPluginsChanged(
BuiltInQProfileInsertImpl.class,
- BuiltInQProfileUpdateImpl.class,
- RegisterQualityProfiles.class,
+ RegisterQualityProfiles.class);
+ addIfStartupLeader(
RegisterPermissionTemplates.class,
RenameDeprecatedPropertyKeys.class,
CeQueueCleaner.class,
UpgradeSuggestionsCleaner.class,
PluginConsentVerifier.class);
+ add(RegisterPlugins.class,
+ // RegisterServletFilters makes the WebService engine of Level4 served by the MasterServletFilter, therefore it
+ // must be started after all the other startup tasks
+ RegisterServletFilters.class
+ );
+ }
+
+ /**
+ * Add a component to container only if plugins have changed since last start.
+ *
+ * @throws IllegalStateException if called from PlatformLevel3 or below, plugin info is loaded yet
+ */
+ AddIfStartupLeaderAndPluginsChanged addIfStartupLeaderAndPluginsChanged(Object... objects) {
+ if (addIfPluginsChanged == null) {
+ this.addIfPluginsChanged = new AddIfStartupLeaderAndPluginsChanged(getWebServer().isStartupLeader() && anyPluginChanged());
+ }
+ addIfPluginsChanged.ifAdd(objects);
+ return addIfPluginsChanged;
+ }
+
+ private boolean anyPluginChanged() {
+ return getOptional(DetectPluginChange.class)
+ .map(DetectPluginChange::anyPluginChanged)
+ .orElseThrow(() -> new IllegalStateException("DetectPluginChange not available in Pico yet"));
+ }
- // RegisterServletFilters makes the WebService engine of Level4 served by the MasterServletFilter, therefore it
- // must be started after all the other startup tasks
- add(RegisterServletFilters.class);
+ public final class AddIfStartupLeaderAndPluginsChanged extends AddIf {
+ private AddIfStartupLeaderAndPluginsChanged(boolean condition) {
+ super(condition);
+ }
}
@Override
@@ -93,6 +125,7 @@ public class PlatformLevelStartup extends PlatformLevel {
get(WebServerRuleFinder.class).stopCaching();
Loggers.get(PlatformLevelStartup.class)
.info("Running {} Edition", get(PlatformEditionProvider.class).get().map(EditionProvider.Edition::getLabel).orElse(""));
+ get(DefaultAdminCredentialsVerifierImpl.class).runAtStart();
}
});