public static ValueTask <IActionResult> SynchronizePartitionAsync(this IActionResult result, DbTable dbTable, DbPartition partitionToSave,
                                                                          DataSynchronizationPeriod period)
        {
            if (ServiceLocator.SnapshotStorage == null)
            {
                return(new ValueTask <IActionResult>(result));
            }

            if (period == DataSynchronizationPeriod.Immediately)
            {
                var partitionSnapshot = PartitionSnapshot.Create(dbTable, partitionToSave);

                return(result.ResponseWithActionAsync(() => ServiceLocator
                                                      .SnapshotStorage
                                                      .SavePartitionSnapshotAsync(partitionSnapshot)));
            }

            ServiceLocator.SnapshotSaverScheduler.SynchronizePartition(dbTable, partitionToSave, period);
            return(new ValueTask <IActionResult>(result));
        }
示例#2
0
        public async Task TheLoop()
        {
            await LoadSnapshotsAsync();

            while (!_appIsShuttingDown || ServiceLocator.SnapshotSaverScheduler.TasksToSyncCount() > 0)
            {
                try
                {
                    var elementToSave = ServiceLocator.SnapshotSaverScheduler.GetTaskToSync(_appIsShuttingDown);

                    while (elementToSave != null)
                    {
                        switch (elementToSave)
                        {
                        case SyncTable syncTable:
                            await ServiceLocator.SnapshotStorage.SaveTableSnapshotAsync(syncTable.DbTable);

                            break;

                        case SyncPartition syncPartition:

                            var partitionSnapshot = PartitionSnapshot.Create(syncPartition.DbTable, syncPartition.DbPartition);
                            await ServiceLocator.SnapshotStorage.SavePartitionSnapshotAsync(partitionSnapshot);

                            break;

                        case SyncDeletePartition syncDeletePartition:
                            await ServiceLocator.SnapshotStorage.DeleteTablePartitionAsync(syncDeletePartition.TableName,
                                                                                           syncDeletePartition.PartitionKey);

                            break;
                        }

                        elementToSave = ServiceLocator.SnapshotSaverScheduler.GetTaskToSync(_appIsShuttingDown);
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine("There is something wrong during saving the snapshot. " + e.Message);
                }
            }