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]; }
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); } } } }