diff options
author | Duarte Meneses <duarte.meneses@sonarsource.com> | 2021-07-27 16:10:33 -0500 |
---|---|---|
committer | sonartech <sonartech@sonarsource.com> | 2021-08-04 20:08:14 +0000 |
commit | bc4d1696a5998adcadb03c64e21aff4a467a1ab1 (patch) | |
tree | 7dd07d23f17e805db73dd60a961b05d210fdf53c /server/sonar-webserver | |
parent | c63120be2e7c090ca42d120c756e703e7cc9eaa1 (diff) | |
download | sonarqube-bc4d1696a5998adcadb03c64e21aff4a467a1ab1.tar.gz sonarqube-bc4d1696a5998adcadb03c64e21aff4a467a1ab1.zip |
SONAR-15237 Improve startup performance of the web process
Diffstat (limited to 'server/sonar-webserver')
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(); } }); |