Пример #1
0
        public ExportWorkerResultsTableRecord(DataRow exportWorkerResultsTableDataRow)
        {
            if (exportWorkerResultsTableDataRow == null)
            {
                throw new ArgumentNullException(nameof(exportWorkerResultsTableDataRow));
            }

            TableRowId          = (Int32)exportWorkerResultsTableDataRow[Constant.Sql.ColumnsNames.ExportWorkerResultsTable.TableRowId];
            AgentId             = (Int32)exportWorkerResultsTableDataRow[Constant.Sql.ColumnsNames.ExportWorkerResultsTable.AgentId];
            WorkspaceArtifactId = (Int32)exportWorkerResultsTableDataRow[Constant.Sql.ColumnsNames.ExportWorkerResultsTable.WorkspaceArtifactId];
            ExportJobArtifactId = (Int32)exportWorkerResultsTableDataRow[Constant.Sql.ColumnsNames.ExportWorkerResultsTable.ExportJobArtifactId];
            String objectTypeString = (String)exportWorkerResultsTableDataRow[Constant.Sql.ColumnsNames.ExportWorkerResultsTable.ObjectType];

            ObjectType = (Constant.Enums.SupportedObjects)Enum.Parse(typeof(Constant.Enums.SupportedObjects), objectTypeString);
            WorkspaceResourceGroupArtifactId = (Int32)exportWorkerResultsTableDataRow[Constant.Sql.ColumnsNames.ExportWorkerResultsTable.WorkspaceResourceGroupArtifactId];
            QueueStatus  = (Int32)exportWorkerResultsTableDataRow[Constant.Sql.ColumnsNames.ExportWorkerResultsTable.QueueStatus];
            MetaData     = (String)exportWorkerResultsTableDataRow[Constant.Sql.ColumnsNames.ExportWorkerResultsTable.MetaData];
            TimeStampUtc = (DateTime)exportWorkerResultsTableDataRow[Constant.Sql.ColumnsNames.ExportWorkerResultsTable.TimeStampUtc];
        }
Пример #2
0
        public async Task ProcessBatchRecordsAsync(DataTable batchDataTable, Int32 workspaceArtifactID, Int32 jobArtifactID, Constant.Enums.SupportedObjects objectType)
        {
            try
            {
                RaiseAndLogDebugMessage($"Processing batch of records in export worker agent. [{nameof(AgentId)} = {AgentId}]");

                switch (objectType)
                {
                case Constant.Enums.SupportedObjects.User:
                    await ProcessUsers(workspaceArtifactID, jobArtifactID, batchDataTable);

                    break;

                default:
                    throw new AdminMigrationUtilityException(Constant.ErrorMessages.InvalidAdminObjectTypeError);
                }

                RaiseAndLogDebugMessage($"Processed batch of records in export worker agent. [{nameof(AgentId)} = {AgentId}]");
            }
            catch (Exception ex)
            {
                //update export job status to error
                await UpdateExportJobStatus(workspaceArtifactID, jobArtifactID, Constant.Status.Job.ERROR);

                //rethrow exception
                throw new AdminMigrationUtilityException(Constant.ErrorMessages.ExportManagerJobError, ex);
            }
            finally
            {
                //remove batch records from export worker queue table
                await RemoveBatchFromExportWorkerQueueTableAsync();
            }
        }
        public async Task ProcessNewRecordAsync(String delimitedListOfResourceGroupIds)
        {
            if (delimitedListOfResourceGroupIds != String.Empty)
            {
                DataTable dataTable = await RetrieveNextRecordInExportManagerQueueTableAsync(delimitedListOfResourceGroupIds);

                if (TableIsNotEmpty(dataTable))
                {
                    ExportManagerQueueRecord exportManagerQueueRecord = new ExportManagerQueueRecord(dataTable.Rows[0]);

                    SetJobProperties(exportManagerQueueRecord);

                    String context = $"[Table = {QueueTable}, ID = {TableRowId}, Workspace Artifact ID = {WorkspaceArtifactId}, Export Job Artifact ID = {ExportJobArtifactId}]";
                    RaiseAndLogDebugMessage($"Processing record(s). {context}");

                    try
                    {
                        Int32 numberOfExpectedExports;

                        //update export job status to in progress
                        await UpdateExportJobStatus(Constant.Status.Job.IN_PROGRESS_MANAGER, exportManagerQueueRecord);

                        //update export manager queue record with export results table name
                        String exportResultsTableName = $"{Constant.Names.ExportWorkerResultsTablePrefix}{Guid.NewGuid()}";
                        await SqlQueryHelper.UpdateResultsTableNameInExportManagerQueueAsync(AgentHelper.GetDBContext(-1), exportManagerQueueRecord.TableRowId, exportResultsTableName);

                        // Add specific logic for other types of objects here #DifferentObject
                        Constant.Enums.SupportedObjects migrationObjectType = (Constant.Enums.SupportedObjects)Enum.Parse(typeof(Constant.Enums.SupportedObjects), exportManagerQueueRecord.ObjectType);
                        switch (migrationObjectType)
                        {
                        case Constant.Enums.SupportedObjects.User:
                            numberOfExpectedExports = await ProcessUsers(exportManagerQueueRecord, exportResultsTableName);

                            break;

                        default:
                            throw new AdminMigrationUtilityException(Constant.ErrorMessages.InvalidAdminObjectTypeError);
                        }

                        //Update status and statistics long as cancellation is not requested
                        if (!await CancellationRequestedAsync(exportManagerQueueRecord))
                        {
                            await SqlQueryHelper.UpdateStatusInExportManagerQueueByWorkspaceJobIdAsync(
                                eddsDbContext : AgentHelper.GetDBContext(-1),
                                workspaceArtifactId : exportManagerQueueRecord.WorkspaceArtifactId,
                                exportJobArtifactId : exportManagerQueueRecord.ExportJobArtifactId,
                                queueStatus : Constant.Status.Queue.WAITING_FOR_WORKERS_TO_FINISH);

                            await UpdateExportJobStatus(Constant.Status.Job.COMPLETED_MANAGER, exportManagerQueueRecord);

                            await UpdateExportJobExpectedNumberOfExports(numberOfExpectedExports, exportManagerQueueRecord);
                        }
                    }
                    catch (Exception ex)
                    {
                        //update export job status to error
                        await UpdateExportJobStatus(Constant.Status.Job.ERROR, exportManagerQueueRecord);

                        String details = ExceptionMessageFormatter.GetExceptionMessageIncludingAllInnerExceptions(ex);
                        RaiseAndLogDebugMessage(details);

                        //remove record from export manager queue table
                        await ClearRecordsFromQueueTables(exportManagerQueueRecord);
                    }
                }
            }
        }