From 804115bf8d526477756828ff4ca632c351e03b90 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 8 Apr 2013 11:55:53 -0400 Subject: remove and/or delay unnecessary startup work --- MediaBrowser.ServerApplication/ApplicationHost.cs | 136 ++++++++++++++------- .../EntryPoints/LoadRegistrations.cs | 57 +++++++++ .../MediaBrowser.ServerApplication.csproj | 1 + 3 files changed, 152 insertions(+), 42 deletions(-) create mode 100644 MediaBrowser.ServerApplication/EntryPoints/LoadRegistrations.cs (limited to 'MediaBrowser.ServerApplication') diff --git a/MediaBrowser.ServerApplication/ApplicationHost.cs b/MediaBrowser.ServerApplication/ApplicationHost.cs index 6b748bb48..b5e267810 100644 --- a/MediaBrowser.ServerApplication/ApplicationHost.cs +++ b/MediaBrowser.ServerApplication/ApplicationHost.cs @@ -146,8 +146,12 @@ namespace MediaBrowser.ServerApplication /// The display preferences manager. internal IDisplayPreferencesManager DisplayPreferencesManager { get; set; } + /// + /// Gets or sets the media encoder. + /// + /// The media encoder. private IMediaEncoder MediaEncoder { get; set; } - + /// /// The full path to our startmenu shortcut /// @@ -162,13 +166,12 @@ namespace MediaBrowser.ServerApplication /// Task. protected override async Task RunStartupTasks() { - // Do these before allowing the base method to run, which will invoke startup scheduled tasks - await ServerKernel.LoadRepositories(ServerConfigurationManager).ConfigureAwait(false); - await base.RunStartupTasks().ConfigureAwait(false); DirectoryWatchers.Start(); + Logger.Info("Core startup complete"); + Parallel.ForEach(GetExports(), entryPoint => entryPoint.Run()); } @@ -180,6 +183,12 @@ namespace MediaBrowser.ServerApplication { ServerKernel = new Kernel(ServerConfigurationManager); + var httpServerTask = Task.Run(() => + { + HttpServer = ServerFactory.CreateServer(this, Logger, "Media Browser", "index.html"); + RegisterSingleInstance(HttpServer, false); + }); + await base.RegisterResources().ConfigureAwait(false); RegisterSingleInstance(new HttpResultFactory(LogManager)); @@ -192,22 +201,16 @@ namespace MediaBrowser.ServerApplication RegisterSingleInstance(() => new AlchemyServer(Logger)); - RegisterSingleInstance(new PismoIsoManager(Logger)); - RegisterSingleInstance(new BdInfoExaminer()); + RegisterSingleInstance(() => new PismoIsoManager(Logger)); + RegisterSingleInstance(() => new BdInfoExaminer()); ZipClient = new DotNetZipClient(); RegisterSingleInstance(ZipClient); - HttpServer = ServerFactory.CreateServer(this, Logger, "Media Browser", "index.html"); - RegisterSingleInstance(HttpServer, false); - - ServerManager = new ServerManager(this, JsonSerializer, Logger, ServerConfigurationManager, ServerKernel); - RegisterSingleInstance(ServerManager); - - UserManager = new UserManager(ServerKernel, Logger, ServerConfigurationManager); + UserManager = new UserManager(Logger, ServerConfigurationManager); RegisterSingleInstance(UserManager); - LibraryManager = new LibraryManager(ServerKernel, Logger, TaskManager, UserManager, ServerConfigurationManager); + LibraryManager = new LibraryManager(Logger, TaskManager, UserManager, ServerConfigurationManager); RegisterSingleInstance(LibraryManager); InstallationManager = new InstallationManager(HttpClient, PackageManager, JsonSerializer, Logger, this); @@ -227,9 +230,17 @@ namespace MediaBrowser.ServerApplication MediaEncoder = new MediaEncoder(LogManager.GetLogger("MediaEncoder"), ZipClient, ApplicationPaths, JsonSerializer); RegisterSingleInstance(MediaEncoder); - await ConfigureRepositories().ConfigureAwait(false); + ServerManager = new ServerManager(this, JsonSerializer, Logger, ServerConfigurationManager, ServerKernel); + RegisterSingleInstance(ServerManager); + + var displayPreferencesTask = Task.Run(async () => await ConfigureDisplayPreferencesRepositories().ConfigureAwait(false)); + var itemsTask = Task.Run(async () => await ConfigureItemRepositories().ConfigureAwait(false)); + var userdataTask = Task.Run(async () => await ConfigureUserDataRepositories().ConfigureAwait(false)); + var userTask = Task.Run(async () => await ConfigureUserRepositories().ConfigureAwait(false)); + + await Task.WhenAll(httpServerTask, itemsTask, userTask, displayPreferencesTask, userdataTask).ConfigureAwait(false); + SetKernelProperties(); - SetStaticProperties(); } /// @@ -237,16 +248,13 @@ namespace MediaBrowser.ServerApplication /// private void SetKernelProperties() { - ServerKernel.FFMpegManager = new FFMpegManager(ServerKernel, ApplicationPaths, MediaEncoder); - ServerKernel.ImageManager = new ImageManager(ServerKernel, LogManager.GetLogger("ImageManager"), ApplicationPaths); - Parallel.Invoke( - () => ServerKernel.UserDataRepositories = GetExports(), - () => ServerKernel.UserRepositories = GetExports(), - () => ServerKernel.ItemRepositories = GetExports(), + () => ServerKernel.FFMpegManager = new FFMpegManager(ApplicationPaths, MediaEncoder, LibraryManager), + () => ServerKernel.ImageManager = new ImageManager(ServerKernel, LogManager.GetLogger("ImageManager"), ApplicationPaths), () => ServerKernel.WeatherProviders = GetExports(), () => ServerKernel.ImageEnhancers = GetExports().OrderBy(e => e.Priority).ToArray(), - () => ServerKernel.StringFiles = GetExports() + () => ServerKernel.StringFiles = GetExports(), + SetStaticProperties ); } @@ -254,15 +262,56 @@ namespace MediaBrowser.ServerApplication /// Configures the repositories. /// /// Task. - private async Task ConfigureRepositories() + private async Task ConfigureDisplayPreferencesRepositories() { - var displayPreferencesRepositories = GetExports(); + var repositories = GetExports(); - var repo = GetRepository(displayPreferencesRepositories, ServerConfigurationManager.Configuration.DisplayPreferencesRepository); + var repository = GetRepository(repositories, ServerConfigurationManager.Configuration.DisplayPreferencesRepository); - await repo.Initialize().ConfigureAwait(false); + await repository.Initialize().ConfigureAwait(false); - ((DisplayPreferencesManager)DisplayPreferencesManager).Repository = repo; + ((DisplayPreferencesManager)DisplayPreferencesManager).Repository = repository; + } + + /// + /// Configures the item repositories. + /// + /// Task. + private async Task ConfigureItemRepositories() + { + var repositories = GetExports(); + + var repository = GetRepository(repositories, ServerConfigurationManager.Configuration.ItemRepository); + + await repository.Initialize().ConfigureAwait(false); + + ((LibraryManager)LibraryManager).ItemRepository = repository; + } + + /// + /// Configures the user data repositories. + /// + /// Task. + private async Task ConfigureUserDataRepositories() + { + var repositories = GetExports(); + + var repository = GetRepository(repositories, ServerConfigurationManager.Configuration.UserDataRepository); + + await repository.Initialize().ConfigureAwait(false); + + ((UserManager)UserManager).UserDataRepository = repository; + } + + private async Task ConfigureUserRepositories() + { + var repositories = GetExports(); + + var repository = GetRepository(repositories, ServerConfigurationManager.Configuration.UserRepository); + + await repository.Initialize().ConfigureAwait(false); + + ((UserManager)UserManager).UserRepository = repository; } /// @@ -286,8 +335,6 @@ namespace MediaBrowser.ServerApplication /// protected override void FindParts() { - base.FindParts(); - if (IsFirstRun) { RegisterServerWithAdministratorAccess(); @@ -295,6 +342,8 @@ namespace MediaBrowser.ServerApplication Parallel.Invoke( + () => base.FindParts(), + () => { HttpServer.Init(GetExports(false)); @@ -305,19 +354,22 @@ namespace MediaBrowser.ServerApplication () => LibraryManager.AddParts(GetExports(), GetExports(), GetExports(), GetExports(), GetExports()), - () => ProviderManager.AddMetadataProviders(GetExports().ToArray()) - ); + () => ProviderManager.AddMetadataProviders(GetExports().ToArray()), - UdpServer = new UdpServer(Logger, NetworkManager, ServerConfigurationManager); - - try - { - UdpServer.Start(UdpServerPort); - } - catch (SocketException ex) - { - Logger.ErrorException("Failed to start UDP Server", ex); - } + () => + { + UdpServer = new UdpServer(Logger, NetworkManager, ServerConfigurationManager); + + try + { + UdpServer.Start(UdpServerPort); + } + catch (SocketException ex) + { + Logger.ErrorException("Failed to start UDP Server", ex); + } + } + ); } /// diff --git a/MediaBrowser.ServerApplication/EntryPoints/LoadRegistrations.cs b/MediaBrowser.ServerApplication/EntryPoints/LoadRegistrations.cs new file mode 100644 index 000000000..d6cd1ae82 --- /dev/null +++ b/MediaBrowser.ServerApplication/EntryPoints/LoadRegistrations.cs @@ -0,0 +1,57 @@ +using MediaBrowser.Common.Security; +using MediaBrowser.Controller.Plugins; +using MediaBrowser.Model.Logging; +using System; + +namespace MediaBrowser.ServerApplication.EntryPoints +{ + /// + /// Class LoadRegistrations + /// + public class LoadRegistrations : IServerEntryPoint + { + /// + /// The _security manager + /// + private readonly ISecurityManager _securityManager; + + /// + /// The _logger + /// + private readonly ILogger _logger; + + /// + /// Initializes a new instance of the class. + /// + /// The security manager. + /// The log manager. + public LoadRegistrations(ISecurityManager securityManager, ILogManager logManager) + { + _securityManager = securityManager; + + _logger = logManager.GetLogger("Registration Loader"); + } + + /// + /// Runs this instance. + /// + public async void Run() + { + try + { + await _securityManager.LoadAllRegistrationInfo().ConfigureAwait(false); + } + catch (Exception ex) + { + _logger.ErrorException("Error loading registration info", ex); + } + } + + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// + public void Dispose() + { + } + } +} diff --git a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj index a0268a7c7..dedc90fe5 100644 --- a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj +++ b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj @@ -181,6 +181,7 @@ + -- cgit v1.2.3 From 57f082051d15da7450fe41f293e0131c8320db33 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 8 Apr 2013 12:45:40 -0400 Subject: tweaked http server startup --- .../BaseApplicationHost.cs | 6 ++++++ MediaBrowser.ServerApplication/ApplicationHost.cs | 23 +++++++++++++++------- 2 files changed, 22 insertions(+), 7 deletions(-) (limited to 'MediaBrowser.ServerApplication') diff --git a/MediaBrowser.Common.Implementations/BaseApplicationHost.cs b/MediaBrowser.Common.Implementations/BaseApplicationHost.cs index 4b8574c89..1a2ab4a51 100644 --- a/MediaBrowser.Common.Implementations/BaseApplicationHost.cs +++ b/MediaBrowser.Common.Implementations/BaseApplicationHost.cs @@ -171,6 +171,7 @@ namespace MediaBrowser.Common.Implementations Logger = LogManager.GetLogger("App"); LogManager.ReloadLogger(ConfigurationManager.CommonConfiguration.EnableDebugLevelLogging ? LogSeverity.Debug : LogSeverity.Info); + OnLoggerLoaded(); DiscoverTypes(); @@ -183,6 +184,11 @@ namespace MediaBrowser.Common.Implementations await RunStartupTasks().ConfigureAwait(false); } + protected virtual void OnLoggerLoaded() + { + + } + /// /// Runs the startup tasks. /// diff --git a/MediaBrowser.ServerApplication/ApplicationHost.cs b/MediaBrowser.ServerApplication/ApplicationHost.cs index b5e267810..582b73a31 100644 --- a/MediaBrowser.ServerApplication/ApplicationHost.cs +++ b/MediaBrowser.ServerApplication/ApplicationHost.cs @@ -160,6 +160,8 @@ namespace MediaBrowser.ServerApplication get { return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.StartMenu), "Media Browser 3", "Media Browser Server.lnk"); } } + private Task _httpServerCreationTask; + /// /// Runs the startup tasks. /// @@ -175,6 +177,16 @@ namespace MediaBrowser.ServerApplication Parallel.ForEach(GetExports(), entryPoint => entryPoint.Run()); } + /// + /// Called when [logger loaded]. + /// + protected override void OnLoggerLoaded() + { + base.OnLoggerLoaded(); + + _httpServerCreationTask = Task.Run(() => ServerFactory.CreateServer(this, Logger, "Media Browser", "index.html")); + } + /// /// Registers resources that classes will depend on /// @@ -183,12 +195,6 @@ namespace MediaBrowser.ServerApplication { ServerKernel = new Kernel(ServerConfigurationManager); - var httpServerTask = Task.Run(() => - { - HttpServer = ServerFactory.CreateServer(this, Logger, "Media Browser", "index.html"); - RegisterSingleInstance(HttpServer, false); - }); - await base.RegisterResources().ConfigureAwait(false); RegisterSingleInstance(new HttpResultFactory(LogManager)); @@ -230,6 +236,9 @@ namespace MediaBrowser.ServerApplication MediaEncoder = new MediaEncoder(LogManager.GetLogger("MediaEncoder"), ZipClient, ApplicationPaths, JsonSerializer); RegisterSingleInstance(MediaEncoder); + HttpServer = await _httpServerCreationTask.ConfigureAwait(false); + RegisterSingleInstance(HttpServer, false); + ServerManager = new ServerManager(this, JsonSerializer, Logger, ServerConfigurationManager, ServerKernel); RegisterSingleInstance(ServerManager); @@ -238,7 +247,7 @@ namespace MediaBrowser.ServerApplication var userdataTask = Task.Run(async () => await ConfigureUserDataRepositories().ConfigureAwait(false)); var userTask = Task.Run(async () => await ConfigureUserRepositories().ConfigureAwait(false)); - await Task.WhenAll(httpServerTask, itemsTask, userTask, displayPreferencesTask, userdataTask).ConfigureAwait(false); + await Task.WhenAll(itemsTask, userTask, displayPreferencesTask, userdataTask).ConfigureAwait(false); SetKernelProperties(); } -- cgit v1.2.3