Ejemplo n.º 1
0
        private SeedingReport(SeedBucketInfo seedBucketInfo, SeedingPlan?seedingPlan, IReadOnlyCollection <SingleSeedSeedingReport> singleSeedSeedingResults, SeedingStatus status)
        {
            System.Diagnostics.Debug.Assert(status != SeedingStatus.SeedBucketHasErrors ||
                                            (status == SeedingStatus.SeedBucketHasErrors &&
                                             seedBucketInfo.HasAnyErrors &&
                                             seedingPlan == null &&
                                             singleSeedSeedingResults.Count == 0));

            System.Diagnostics.Debug.Assert(status != SeedingStatus.BuildingServiceProviderFailed ||
                                            (status == SeedingStatus.BuildingServiceProviderFailed &&
                                             !seedBucketInfo.HasAnyErrors &&
                                             seedingPlan != null &&
                                             singleSeedSeedingResults.Count == 0));

            System.Diagnostics.Debug.Assert(status != SeedingStatus.SeedingSingleSeedFailed ||
                                            (status == SeedingStatus.SeedingSingleSeedFailed &&
                                             !seedBucketInfo.HasAnyErrors &&
                                             seedingPlan != null &&
                                             singleSeedSeedingResults.Count(result => result.Status == SingleSeedSeedingStatus.Failed) == 1 &&
                                             singleSeedSeedingResults.Last().Status == SingleSeedSeedingStatus.Failed));

            System.Diagnostics.Debug.Assert(status != SeedingStatus.Succeeded ||
                                            (status == SeedingStatus.Succeeded &&
                                             !seedBucketInfo.HasAnyErrors &&
                                             seedingPlan != null &&

                                             // We can have a situation that there is no seeds to seed. This is fine.
                                             singleSeedSeedingResults.All(result => result.Status != SingleSeedSeedingStatus.Failed)));

            SeedBucketInfo           = seedBucketInfo;
            SeedingPlan              = seedingPlan;
            SingleSeedSeedingResults = singleSeedSeedingResults;
            Status = status;
        }
Ejemplo n.º 2
0
        private static async Task SeedDatabaseAsync(IWebHost host)
        {
            try
            {
                using (var scope = host.Services.CreateScope())
                {
                    IServiceProvider services = scope.ServiceProvider;

                    Log.Information("----- Checking seeding status");

                    var catalogContextSetup  = services.GetService <CatalogContextSetup>();
                    var orderingContextSetup = services.GetService <OrderingContextSetup>();

                    var catalogSeedingStatus = await catalogContextSetup.GetSeedingStatusAsync();

                    Log.Information("----- SeedingStatus ({Context}): {@SeedingStatus}", "Catalog", catalogSeedingStatus);

                    var orderingSeedingStatus = await orderingContextSetup.GetSeedingStatusAsync();

                    Log.Information("----- SeedingStatus ({Context}): {@SeedingStatus}", "Ordering", orderingSeedingStatus);

                    var seedingStatus = new SeedingStatus(catalogSeedingStatus, orderingSeedingStatus);
                    Log.Information("----- SeedingStatus ({Context}): {@SeedingStatus}", "Aggregated", seedingStatus);

                    if (!seedingStatus.NeedsSeeding)
                    {
                        Log.Information("----- No seeding needed");

                        return;
                    }

                    Log.Information("----- Seeding database");

                    var sw = new Stopwatch();
                    sw.Start();

                    void ProgressAggregator()
                    {
                        seedingStatus.RecordsLoaded = catalogSeedingStatus.RecordsLoaded + orderingSeedingStatus.RecordsLoaded;

                        Log.Debug("----- Seeding {SeedingPercentComplete}% complete", seedingStatus.PercentComplete);
                        _seedingProgress = seedingStatus.PercentComplete;
                    }

                    var catalogProgressHandler = new Progress <int>(value =>
                    {
                        catalogSeedingStatus.RecordsLoaded = value;
                        ProgressAggregator();
                    });

                    var orderingProgressHandler = new Progress <int>(value =>
                    {
                        orderingSeedingStatus.RecordsLoaded = value;
                        ProgressAggregator();
                    });

                    Log.Information("----- Seeding CatalogContext");
                    Task catalogSeedingTask = Task.Run(async() => await catalogContextSetup.SeedAsync(catalogProgressHandler));

                    Log.Information("----- Seeding OrderingContext");
                    Task orderingSeedingTask = Task.Run(async() => await orderingContextSetup.SeedAsync(orderingProgressHandler));

                    await Task.WhenAll(catalogSeedingTask, orderingSeedingTask);

                    seedingStatus.SetAsComplete();
                    _seedingProgress = seedingStatus.PercentComplete;

                    Log.Information("----- Database Seeded ({ElapsedTime:n3}s)", sw.Elapsed.TotalSeconds);
                }
            }
            catch (Exception ex)
            {
                Log.Error(ex, "----- Exception seeding database");
            }
        }