public static RepositoryInstance Start(RepositoryBuilder builder) { // Required early configuration BlobStorageComponents.DataProvider = Providers.Instance.BlobMetaDataProvider; BlobStorageComponents.ProviderSelector = Providers.Instance.BlobProviderSelector; var initialData = builder.InitialData; if (initialData != null) { DataStore.InstallInitialDataAsync(initialData, CancellationToken.None) .GetAwaiter().GetResult(); } RepositoryInstance repositoryInstance = null; var exclusiveLockOptions = builder.Services?.GetService <IOptions <ExclusiveLockOptions> >()?.Value; ExclusiveBlock.RunAsync("SenseNet.PatchManager", Guid.NewGuid().ToString(), ExclusiveBlockType.WaitAndAcquire, exclusiveLockOptions, CancellationToken.None, () => { var logger = Providers.Instance.GetProvider <ILogger <SnILogger> >(); var patchManager = new PatchManager(builder, logRecord => { logRecord.WriteTo(logger); }); patchManager.ExecutePatchesOnBeforeStart(); repositoryInstance = Start((RepositoryStartSettings)builder); var permissions = initialData?.Permissions; if (permissions != null && permissions.Count > 0) { SecurityHandler.SecurityInstaller.InstallDefaultSecurityStructure(initialData); } patchManager.ExecutePatchesOnAfterStart(); return(System.Threading.Tasks.Task.CompletedTask); }).GetAwaiter().GetResult(); return(repositoryInstance); }
private static void EnsureIndex(RepositoryBuilder builder) { var logger = builder.Services?.GetService <ILogger <RepositoryInstance> >(); logger?.LogInformation("Checking the index..."); // execute a query that should return multiple items if the index is not empty var indexDocExist = SystemAccount.Execute(() => ContentQuery.Query(SafeQueries.ContentTypes, QuerySettings.AdminSettings).Count > 10); if (indexDocExist) { return; } // This scenario auto-generates the whole index from the database. The most common case is // when a new web app domain (usually a container) is started in a load balanced environment. var populator = Providers.Instance.SearchManager.GetIndexPopulator(); var indexCount = 0; populator.IndexingError += (sender, eventArgs) => { logger?.LogWarning($"Error during building app start index for {eventArgs.Path}. " + $"(id: {eventArgs.NodeId}). {eventArgs.Exception?.Message}"); }; populator.NodeIndexed += (sender, eventArgs) => { Interlocked.Increment(ref indexCount); }; logger?.LogInformation("Rebuilding the index..."); populator.ClearAndPopulateAllAsync(CancellationToken.None, builder.Console ?? new LoggerConsole(logger)).GetAwaiter().GetResult(); logger?.LogInformation($"Indexing of {indexCount} nodes finished."); }
public static RepositoryInstance Start(RepositoryBuilder builder) { return(builder == null?Start() : Start((RepositoryStartSettings)builder)); }
private static void WriteLog(string name, object provider) { RepositoryBuilder.WriteLog(name, provider); }
public static RepositoryInstance Start(RepositoryBuilder builder) { var connectionStrings = builder.Services?.GetRequiredService <IOptions <ConnectionStringOptions> >(); Providers.Instance.InitializeBlobProviders(connectionStrings?.Value ?? new ConnectionStringOptions()); EnsureDatabase(builder); var initialData = builder.InitialData; if (initialData != null) { Providers.Instance.DataStore.InstallInitialDataAsync(initialData, CancellationToken.None) .GetAwaiter().GetResult(); } RepositoryInstance repositoryInstance = null; var exclusiveLockOptions = builder.Services?.GetService <IOptions <ExclusiveLockOptions> >()?.Value; ExclusiveBlock.RunAsync("SenseNet.PatchManager", Guid.NewGuid().ToString(), ExclusiveBlockType.WaitAndAcquire, exclusiveLockOptions, CancellationToken.None, () => { var logger = Providers.Instance.GetProvider <ILogger <SnILogger> >(); var patchManager = new PatchManager(builder, logRecord => { logRecord.WriteTo(logger); }); patchManager.ExecutePatchesOnBeforeStart(); repositoryInstance = Start((RepositoryStartSettings)builder); var permissions = initialData?.Permissions; if (permissions != null && permissions.Count > 0) { new SecurityInstaller(Providers.Instance.SecurityHandler, Providers.Instance.StorageSchema, Providers.Instance.DataStore).InstallDefaultSecurityStructure(initialData); } var indexingEngine = Providers.Instance.SearchEngine.IndexingEngine; if (indexingEngine.Running) { if (initialData?.IndexDocuments != null) { // Build the index from an in-memory structure. This is a developer use case. indexingEngine.ClearIndexAsync(CancellationToken.None) .ConfigureAwait(false).GetAwaiter().GetResult(); indexingEngine.WriteIndexAsync(null, null, initialData.IndexDocuments, CancellationToken.None) .ConfigureAwait(false).GetAwaiter().GetResult(); } else { // make sure the index exists and contains documents EnsureIndex(builder); } } patchManager.ExecutePatchesOnAfterStart(); RepositoryVersionInfo.Reset(); return(System.Threading.Tasks.Task.CompletedTask); }).GetAwaiter().GetResult(); return(repositoryInstance); }