remove and/or delay unnecessary startup work

This commit is contained in:
Luke Pulverenti
2013-04-08 11:55:53 -04:00
parent 59cfad03e8
commit 804115bf8d
18 changed files with 341 additions and 215 deletions

View File

@@ -146,8 +146,12 @@ namespace MediaBrowser.ServerApplication
/// <value>The display preferences manager.</value>
internal IDisplayPreferencesManager DisplayPreferencesManager { get; set; }
/// <summary>
/// Gets or sets the media encoder.
/// </summary>
/// <value>The media encoder.</value>
private IMediaEncoder MediaEncoder { get; set; }
/// <summary>
/// The full path to our startmenu shortcut
/// </summary>
@@ -162,13 +166,12 @@ namespace MediaBrowser.ServerApplication
/// <returns>Task.</returns>
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<IServerEntryPoint>(), 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<IHttpResultFactory>(new HttpResultFactory(LogManager));
@@ -192,22 +201,16 @@ namespace MediaBrowser.ServerApplication
RegisterSingleInstance<IWebSocketServer>(() => new AlchemyServer(Logger));
RegisterSingleInstance<IIsoManager>(new PismoIsoManager(Logger));
RegisterSingleInstance<IBlurayExaminer>(new BdInfoExaminer());
RegisterSingleInstance<IIsoManager>(() => new PismoIsoManager(Logger));
RegisterSingleInstance<IBlurayExaminer>(() => 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();
}
/// <summary>
@@ -237,16 +248,13 @@ namespace MediaBrowser.ServerApplication
/// </summary>
private void SetKernelProperties()
{
ServerKernel.FFMpegManager = new FFMpegManager(ServerKernel, ApplicationPaths, MediaEncoder);
ServerKernel.ImageManager = new ImageManager(ServerKernel, LogManager.GetLogger("ImageManager"), ApplicationPaths);
Parallel.Invoke(
() => ServerKernel.UserDataRepositories = GetExports<IUserDataRepository>(),
() => ServerKernel.UserRepositories = GetExports<IUserRepository>(),
() => ServerKernel.ItemRepositories = GetExports<IItemRepository>(),
() => ServerKernel.FFMpegManager = new FFMpegManager(ApplicationPaths, MediaEncoder, LibraryManager),
() => ServerKernel.ImageManager = new ImageManager(ServerKernel, LogManager.GetLogger("ImageManager"), ApplicationPaths),
() => ServerKernel.WeatherProviders = GetExports<IWeatherProvider>(),
() => ServerKernel.ImageEnhancers = GetExports<IImageEnhancer>().OrderBy(e => e.Priority).ToArray(),
() => ServerKernel.StringFiles = GetExports<LocalizedStringData>()
() => ServerKernel.StringFiles = GetExports<LocalizedStringData>(),
SetStaticProperties
);
}
@@ -254,15 +262,56 @@ namespace MediaBrowser.ServerApplication
/// Configures the repositories.
/// </summary>
/// <returns>Task.</returns>
private async Task ConfigureRepositories()
private async Task ConfigureDisplayPreferencesRepositories()
{
var displayPreferencesRepositories = GetExports<IDisplayPreferencesRepository>();
var repositories = GetExports<IDisplayPreferencesRepository>();
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;
}
/// <summary>
/// Configures the item repositories.
/// </summary>
/// <returns>Task.</returns>
private async Task ConfigureItemRepositories()
{
var repositories = GetExports<IItemRepository>();
var repository = GetRepository(repositories, ServerConfigurationManager.Configuration.ItemRepository);
await repository.Initialize().ConfigureAwait(false);
((LibraryManager)LibraryManager).ItemRepository = repository;
}
/// <summary>
/// Configures the user data repositories.
/// </summary>
/// <returns>Task.</returns>
private async Task ConfigureUserDataRepositories()
{
var repositories = GetExports<IUserDataRepository>();
var repository = GetRepository(repositories, ServerConfigurationManager.Configuration.UserDataRepository);
await repository.Initialize().ConfigureAwait(false);
((UserManager)UserManager).UserDataRepository = repository;
}
private async Task ConfigureUserRepositories()
{
var repositories = GetExports<IUserRepository>();
var repository = GetRepository(repositories, ServerConfigurationManager.Configuration.UserRepository);
await repository.Initialize().ConfigureAwait(false);
((UserManager)UserManager).UserRepository = repository;
}
/// <summary>
@@ -286,8 +335,6 @@ namespace MediaBrowser.ServerApplication
/// </summary>
protected override void FindParts()
{
base.FindParts();
if (IsFirstRun)
{
RegisterServerWithAdministratorAccess();
@@ -295,6 +342,8 @@ namespace MediaBrowser.ServerApplication
Parallel.Invoke(
() => base.FindParts(),
() =>
{
HttpServer.Init(GetExports<IRestfulService>(false));
@@ -305,19 +354,22 @@ namespace MediaBrowser.ServerApplication
() => LibraryManager.AddParts(GetExports<IResolverIgnoreRule>(), GetExports<IVirtualFolderCreator>(), GetExports<IItemResolver>(), GetExports<IIntroProvider>(), GetExports<IBaseItemComparer>()),
() => ProviderManager.AddMetadataProviders(GetExports<BaseMetadataProvider>().ToArray())
() => ProviderManager.AddMetadataProviders(GetExports<BaseMetadataProvider>().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);
}
}
/// <summary>

View File

@@ -0,0 +1,57 @@
using MediaBrowser.Common.Security;
using MediaBrowser.Controller.Plugins;
using MediaBrowser.Model.Logging;
using System;
namespace MediaBrowser.ServerApplication.EntryPoints
{
/// <summary>
/// Class LoadRegistrations
/// </summary>
public class LoadRegistrations : IServerEntryPoint
{
/// <summary>
/// The _security manager
/// </summary>
private readonly ISecurityManager _securityManager;
/// <summary>
/// The _logger
/// </summary>
private readonly ILogger _logger;
/// <summary>
/// Initializes a new instance of the <see cref="LoadRegistrations" /> class.
/// </summary>
/// <param name="securityManager">The security manager.</param>
/// <param name="logManager">The log manager.</param>
public LoadRegistrations(ISecurityManager securityManager, ILogManager logManager)
{
_securityManager = securityManager;
_logger = logManager.GetLogger("Registration Loader");
}
/// <summary>
/// Runs this instance.
/// </summary>
public async void Run()
{
try
{
await _securityManager.LoadAllRegistrationInfo().ConfigureAwait(false);
}
catch (Exception ex)
{
_logger.ErrorException("Error loading registration info", ex);
}
}
/// <summary>
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
/// </summary>
public void Dispose()
{
}
}
}

View File

@@ -181,6 +181,7 @@
<Reference Include="PresentationFramework" />
</ItemGroup>
<ItemGroup>
<Compile Include="EntryPoints\LoadRegistrations.cs" />
<Compile Include="EntryPoints\NewItemNotifier.cs" />
<Compile Include="EntryPoints\RefreshUsersMetadata.cs" />
<Compile Include="EntryPoints\StartupWizard.cs" />