Beispiel #1
0
        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);
        }
Beispiel #2
0
        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.");
        }
Beispiel #3
0
 public static RepositoryInstance Start(RepositoryBuilder builder)
 {
     return(builder == null?Start() : Start((RepositoryStartSettings)builder));
 }
Beispiel #4
0
 private static void WriteLog(string name, object provider)
 {
     RepositoryBuilder.WriteLog(name, provider);
 }
Beispiel #5
0
        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);
        }