private void GetResultPage(ImportResponse response, int pageSize) { CachedImportRequest cachedRequest = this.GetFromCache(response.Context); int itemCount = 0; response.Objects = new List <CSEntryChange>(); response.TotalItems = cachedRequest.Count; if (pageSize > 0) { CSEntryChange csentry; while (cachedRequest.Queue.TryDequeue(out csentry)) { itemCount++; response.Objects.Add(csentry); if (itemCount >= pageSize) { break; } } } if (cachedRequest.Queue.IsEmpty && cachedRequest.ProducerComplete) { response.HasMoreItems = false; } else { response.HasMoreItems = true; } }
private void AddToCache(string context, CachedImportRequest request) { AcmaSyncService.cache.Add(context, request, new CacheItemPolicy() { SlidingExpiration = new TimeSpan(0, 10, 0) }); }
private void ProduceCSEntryChanges(ResultEnumerator results, Schema schema, CachedImportRequest request) { ParallelOptions op = new ParallelOptions(); op.CancellationToken = new CancellationToken(); request.CancellationToken = op.CancellationToken; op.MaxDegreeOfParallelism = 1; Parallel.ForEach(results, op, item => { if (op.CancellationToken.IsCancellationRequested) { return; } string objectClassName = item.ObjectClass == null ? item.DeltaObjectClassName : item.ObjectClass.Name; SchemaType type = schema.Types.FirstOrDefault(t => t.Name == objectClassName); if (type == null) { return; } CSEntryChange csentry = null; try { csentry = item.ToCSEntryChange(type); MAStatistics.AddImportOperation(); } catch (Exception ex) { MAStatistics.AddImportError(); if (csentry == null) { csentry = CSEntryChange.Create(); } if (string.IsNullOrWhiteSpace(csentry.DN)) { csentry.ErrorCodeImport = MAImportError.ImportErrorCustomStopRun; } else { csentry.ErrorCodeImport = MAImportError.ImportErrorCustomContinueRun; } csentry.ErrorName = ex.Message; csentry.ErrorDetail = ex.StackTrace; } request.Queue.Enqueue(csentry); }); request.ProducerComplete = true; }
private void StartProducerThread(ResultEnumerator results, Schema schema, CachedImportRequest request) { Task t = new Task(() => { this.ProduceCSEntryChanges(results, schema, request); }); t.Start(); }
public ImportResponse ImportStart(ImportStartRequest request) { Logger.WriteLine("Import request received"); MAStatistics.StartOperation(MAOperationType.Import); ImportResponse response = new ImportResponse(); CachedImportRequest cachedRequest = new CachedImportRequest(); cachedRequest.Request = request; if (cachedRequest.Request.ImportType == OperationType.Delta) { this.ProcessOperationEvents(AcmaEventOperationType.DeltaImport); } else { this.ProcessOperationEvents(AcmaEventOperationType.FullImport); } byte[] watermark = ActiveConfig.DB.GetHighWatermarkMAObjectsDelta(); response.Watermark = watermark == null ? null : Convert.ToBase64String(watermark); cachedRequest.HighWatermark = watermark; Logger.WriteLine("Got delta watermark: {0}", response.Watermark); ResultEnumerator enumerator; if (cachedRequest.Request.ImportType == OperationType.Delta) { enumerator = ActiveConfig.DB.EnumerateMAObjectsDelta(watermark); } else { enumerator = ActiveConfig.DB.EnumerateMAObjects(cachedRequest.Request.Schema.Types.Select(t => t.Name).ToList(), null, null); } cachedRequest.Queue = new ConcurrentQueue <CSEntryChange>(); cachedRequest.Count = enumerator.TotalCount; this.StartProducerThread(enumerator, request.Schema, cachedRequest); response.Context = Guid.NewGuid().ToString(); this.AddToCache(response.Context, cachedRequest); this.GetResultPage(response, request.PageSize); return(response); }