Example #1
0
        private void WorkProcessor(BlockingCollection <SubJob> workQueue, BlockingCollection <SubJob> sendQueue, CancellationToken ct)
        {
            while (!ct.IsCancellationRequested)
            {
                try
                {
                    SubJob subJob = _workQueue.Take(ct);

                    SubJobResult        subJobResult  = _resultCache.GetEmptySubJobResult(readZValues: false);
                    SubJobOperationType operationType = DetermineOperationType(subJob, subJobResult);

                    if (operationType != SubJobOperationType.None && operationType != SubJobOperationType.Fetch)
                    {
                        subJob.OperationType = operationType;
                        subJob.SubJobResult  = subJobResult;
                        if (ProcessSubJob(subJob, ct))
                        {
                            _sendQueue.Add(subJob);
                        }
                        else
                        {
                            // Since we are not using this SubJobResult, mark it as free
                            subJob.SubJobResult.IsFree = true;
                        }
                    }
                    else
                    {
                        // Since we are not using this SubJobResult, mark it as free
                        subJobResult.IsFree = true;
                    }
                }
                catch (TaskCanceledException tce)
                {
                    Console.WriteLine($"Process SubJob, instance:{InstanceNum} got error: {tce.Message}.");
                    break;
                }
                catch (OperationCanceledException oce)
                {
                    Console.WriteLine($"Process SubJob, instance:{InstanceNum} got error: {oce.Message}.");
                    break;
                }
                catch (Exception e)
                {
                    Console.WriteLine($"Process SubJob, instance:{InstanceNum} got error: {e.Message}.");
                    //break;
                }
            }
        }
Example #2
0
        private void HandleSubJob(SubJob subJob)
        {
            SubJobResult        subJobResult  = _resultCache.GetEmptySubJobResult(readZValues: false);
            SubJobOperationType operationType = DetermineOperationType(subJob, subJobResult);

            if (operationType == SubJobOperationType.Fetch)
            {
                Console.WriteLine($"Sub Job Results were retreived from file. {GetDiagInfo(subJob)}");

                subJob.OperationType = operationType;
                subJob.SubJobResult  = subJobResult;
                _sendQueue.Add(subJob);
            }
            else
            {
                // Since we are not using this SubJobResult, mark it as free
                subJobResult.IsFree = true;
            }
        }
Example #3
0
        private SubJobOperationType DetermineOperationType(SubJob subJob, SubJobResult subJobResult)
        {
            SubJobOperationType result = SubJobOperationType.Unknown;

            if (subJob.ParentJob.Closed)
            {
                Debug.WriteLine($"Not Processing Sub Job. {GetDiagInfo(subJob)}");
                return(SubJobOperationType.None);
            }

            if (TryRetrieveWorkResultFromRepo(subJob, subJobResult))
            {
                uint targetIterations = subJob.ParentJob.FJobRequest.MaxIterations;
                if (subJobResult.IterationCount == 0 || subJobResult.IterationCount == targetIterations)
                {
                    // The WorkResult read from file has the correct iteration count. (Or we are not tracking the iteration count.)
                    //Console.WriteLine("Sub Job Results were retreived from file. {GetDiagInfo(subJob)}");
                    result = SubJobOperationType.Fetch;
                }

                else if (subJobResult.IterationCount < targetIterations)
                {
                    result = SubJobOperationType.IncreaseIterations;
                }
                else
                {
                    result = SubJobOperationType.DecreaseIterations;
                }
            }
            else
            {
                result = SubJobOperationType.Build;
            }

            return(result);
        }