コード例 #1
0
        public override async Task VerifyQuality(
            VerificationRequest request,
            IServerStreamWriter <VerificationResponse> responseStream,
            ServerCallContext context)
        {
            try
            {
                await StartRequest(request);

                Func <ITrackCancel, ServiceCallStatus> func =
                    trackCancel => VerifyQualityCore(request, responseStream, trackCancel);

                ServiceCallStatus result =
                    await GrpcServerUtils.ExecuteServiceCall(
                        func, context, _staThreadScheduler);

                _msg.InfoFormat("Verification {0}", result);
            }
            catch (Exception e)
            {
                _msg.Error($"Error verifying quality for request {request}", e);

                SendFatalException(e, responseStream);
                SetUnhealthy();
            }
            finally
            {
                EndRequest();
            }
        }
コード例 #2
0
        private static Action <LoggingEvent> SendInfoLogAction(
            [NotNull] IServerStreamWriter <StandaloneVerificationResponse> responseStream,
            ServiceCallStatus callStatus)
        {
            Action <LoggingEvent> action =
                e =>
            {
                if (e.Level.Value < Level.Info.Value)
                {
                    return;
                }

                var response = new StandaloneVerificationResponse
                {
                    Message = new LogMsg
                    {
                        Message      = e.RenderedMessage,
                        MessageLevel = e.Level.Value
                    },
                    ServiceCallStatus = (int)callStatus
                };

                MessagingUtils.TrySendResponse(responseStream, response);
            };

            return(action);
        }
コード例 #3
0
        public override async Task VerifyQuality(
            VerificationRequest request,
            IServerStreamWriter <VerificationResponse> responseStream,
            ServerCallContext context)
        {
            try
            {
                _msg.InfoFormat("Starting verification request from {0}", request.UserName);
                _msg.DebugFormat("Request details: {0}", request);

                if (Checkout3DAnalyst)
                {
                    // It must be re-checked out (but somehow it's enough to do it
                    // on the calling thread-pool thread!?)
                    Ensure3dAnalyst();
                }

                Func <ITrackCancel, ServiceCallStatus> func =
                    trackCancel => VerifyQualityCore(request, responseStream, trackCancel);

                ServiceCallStatus result =
                    await GrpcServerUtils.ExecuteServiceCall(
                        func, context, _singleStaThreadScheduler);

                _msg.InfoFormat("Verification {0}", result);
            }
            catch (Exception e)
            {
                _msg.Error($"Error verifying quality for request {request}", e);

                SendFatalException(e, responseStream);
                SetUnhealthy();
            }
        }
コード例 #4
0
        public override async Task VerifyStandaloneXml(
            StandaloneVerificationRequest request,
            IServerStreamWriter <StandaloneVerificationResponse> responseStream,
            ServerCallContext context)
        {
            try
            {
                _msg.InfoFormat("Starting stand-alone verification request from {0}",
                                context.Peer);
                _msg.DebugFormat("Request details: {0}", request);

                Action <LoggingEvent> action =
                    SendInfoLogAction(responseStream, ServiceCallStatus.Running);

                using (MessagingUtils.TemporaryRootAppender(new ActionAppender(action)))
                {
                    Func <ITrackCancel, ServiceCallStatus> func =
                        trackCancel => VerifyStandaloneXmlCore(request, responseStream,
                                                               trackCancel);

                    ServiceCallStatus result =
                        await GrpcServerUtils.ExecuteServiceCall(
                            func, context, _singleStaThreadScheduler);

                    _msg.InfoFormat("Verification {0}", result);
                }
            }
            catch (Exception e)
            {
                _msg.Error($"Error verifying quality for request {request}", e);

                SendFatalException(e, responseStream);
                SetUnhealthy();
            }
        }
コード例 #5
0
        private static ServiceCallStatus SendFinalResponse(
            [CanBeNull] QualityVerification verification,
            [CanBeNull] string qaServiceCancellationMessage,
            ConcurrentBag <IssueMsg> issues,
            List <GdbObjRefMsg> deletableAllowedErrors,
            [CanBeNull] IEnvelope verifiedPerimeter,
            Action <VerificationResponse> writeAction)
        {
            var response = new VerificationResponse();

            while (issues.TryTake(out IssueMsg issue))
            {
                response.Issues.Add(issue);
            }

            response.ObsoleteExceptions.AddRange(deletableAllowedErrors);

            ServiceCallStatus finalStatus =
                GetFinalCallStatus(verification, qaServiceCancellationMessage);

            response.ServiceCallStatus = (int)finalStatus;

            if (!string.IsNullOrEmpty(qaServiceCancellationMessage))
            {
                response.Progress = new VerificationProgressMsg
                {
                    Message = qaServiceCancellationMessage
                };
            }

            PackVerification(verification, response);

            if (verifiedPerimeter != null)
            {
                response.VerifiedPerimeter =
                    ProtobufGeometryUtils.ToShapeMsg(verifiedPerimeter);
            }

            _msg.DebugFormat(
                "Sending final message with {0} errors back to client...",
                issues.Count);

            try
            {
                writeAction(response);
            }
            catch (InvalidOperationException ex)
            {
                // For example: System.InvalidOperationException: Only one write can be pending at a time
                _msg.Warn(
                    "Error sending progress to the client. Retrying the last response in 1s...",
                    ex);

                // Re-try (only for final message)
                Task.Delay(1000);
                writeAction(response);
            }

            return(finalStatus);
        }
コード例 #6
0
        private ServiceCallStatus VerifyQualityCore(
            VerificationRequest request,
            IServerStreamWriter <VerificationResponse> responseStream,
            ITrackCancel trackCancel)
        {
            SetupUserNameProvider(request);

            void SendResponse(VerificationResponse r) => responseStream.WriteAsync(r);

            BackgroundVerificationService qaService = null;
            List <GdbObjRefMsg>           deletableAllowedErrorRefs = new List <GdbObjRefMsg>();
            QualityVerification           verification = null;
            var    issueCollection     = new ConcurrentBag <IssueMsg>();
            string cancellationMessage = null;

            try
            {
                // TODO: Separate long-lived objects, such as datasetLookup, domainTransactions (add to this class) from
                // short-term objects (request) -> add to background verification inputs
                IBackgroundVerificationInputs backgroundVerificationInputs =
                    _verificationInputsFactoryMethod(request);

                qaService = CreateVerificationService(backgroundVerificationInputs, issueCollection,
                                                      SendResponse, trackCancel);

                int maxParallelRequested = request.MaxParallelProcessing;

                if (backgroundVerificationInputs.WorkerClient != null &&
                    maxParallelRequested > 1)
                {
                    // allow directly adding issues found by client processes:
                    qaService.DistributedTestRunner = new DistributedTestRunner(
                        backgroundVerificationInputs.WorkerClient, request, issueCollection);
                }

                verification = qaService.Verify(backgroundVerificationInputs, trackCancel);

                deletableAllowedErrorRefs.AddRange(
                    GetDeletableAllowedErrorRefs(request.Parameters, qaService));
            }
            catch (Exception e)
            {
                _msg.Error($"Error checking quality for request {request}", e);
                cancellationMessage = $"Server error: {e.Message}";

                if (!EnvironmentUtils.GetBooleanEnvironmentVariableValue(
                        "PROSUITE_QA_SERVER_KEEP_SERVING_ON_ERROR"))
                {
                    SetUnhealthy();
                }
            }

            ServiceCallStatus result = SendFinalResponse(
                verification, cancellationMessage ?? qaService.CancellationMessage, issueCollection,
                deletableAllowedErrorRefs, qaService?.VerifiedPerimeter, SendResponse);

            return(result);
        }
コード例 #7
0
        public override async Task VerifyDataQuality(
            IAsyncStreamReader <DataVerificationRequest> requestStream,
            IServerStreamWriter <DataVerificationResponse> responseStream,
            ServerCallContext context)
        {
            VerificationRequest request = null;

            try
            {
                Assert.True(await requestStream.MoveNext(), "No request");

                //while (await requestStream.MoveNext())
                DataVerificationRequest initialrequest =
                    Assert.NotNull(requestStream.Current, "No request");

                request = initialrequest.Request;

                _msg.InfoFormat("Starting verification request from {0}", request);
                _msg.DebugFormat("Request details: {0}", request);

                if (Checkout3DAnalyst)
                {
                    // It must be re-checked out (but somehow it's enough to do it
                    // on the calling thread-pool thread!?)
                    Ensure3dAnalyst();
                }

                Func <DataVerificationResponse, DataVerificationRequest> moreDataRequest =
                    delegate(DataVerificationResponse r)
                {
                    return(Task.Run(async() =>
                                    await RequestMoreDataAsync(
                                        requestStream, responseStream, context, r)
                                    .ConfigureAwait(false))
                           .Result);
                };

                Func <ITrackCancel, ServiceCallStatus> func =
                    trackCancel =>
                    VerifyDataQualityCore(initialrequest, moreDataRequest, responseStream,
                                          trackCancel);

                ServiceCallStatus result =
                    await GrpcServerUtils.ExecuteServiceCall(
                        func, context, _singleStaThreadScheduler);

                _msg.InfoFormat("Verification {0}", result);
            }
            catch (Exception e)
            {
                _msg.Error($"Error verifying quality for request {request}", e);

                SendFatalException(e, responseStream);
                SetUnhealthy();
            }
        }
コード例 #8
0
ファイル: Main.cs プロジェクト: FlukeFan/Atlanta
        private void MediaService_GetMediaListCompleted(ServiceCallStatus status)
        {
            IList<Media> mediaList =
                _mediaService.GetMediaList(status);

            Write("GetMediaList Response:");
            foreach (Media media in mediaList)
            {
                Write("Media: " + media.Id + ", " + media.Name + ", " + media.Type + ", " + media.Description);
            }
        }
コード例 #9
0
ファイル: Main.cs プロジェクト: TheNephalim/Atlanta
        private void MediaService_GetMediaListCompleted(ServiceCallStatus status)
        {
            IList <Media> mediaList =
                _mediaService.GetMediaList(status);

            Write("GetMediaList Response:");
            foreach (Media media in mediaList)
            {
                Write("Media: " + media.Id + ", " + media.Name + ", " + media.Type + ", " + media.Description);
            }
        }
コード例 #10
0
ファイル: Main.cs プロジェクト: TheNephalim/Atlanta
 private void MediaService_CreateCompleted(ServiceCallStatus status)
 {
     try
     {
         _lastCreatedMedia = _mediaService.Create(status);
         Write("Media created: " + _lastCreatedMedia.Name + " (" + _lastCreatedMedia.Id + ")");
         _test4.IsEnabled = true;
     }
     catch (DuplicationException de)
     {
         Write("Attempt to create duplicate Media: " + de.DuplicateValue + " (" + de.DuplicateId + ")");
     }
 }
コード例 #11
0
ファイル: Main.cs プロジェクト: FlukeFan/Atlanta
 private void MediaService_CreateCompleted(ServiceCallStatus status)
 {
     try
     {
         _lastCreatedMedia = _mediaService.Create(status);
         Write("Media created: " + _lastCreatedMedia.Name + " (" + _lastCreatedMedia.Id + ")");
         _test4.IsEnabled = true;
     }
     catch (DuplicationException de)
     {
         Write("Attempt to create duplicate Media: " + de.DuplicateValue + " (" + de.DuplicateId + ")");
     }
 }
コード例 #12
0
        public override async Task VerifyDataQuality(
            IAsyncStreamReader <DataVerificationRequest> requestStream,
            IServerStreamWriter <DataVerificationResponse> responseStream,
            ServerCallContext context)
        {
            VerificationRequest request = null;

            try
            {
                Assert.True(await requestStream.MoveNext(), "No request");

                DataVerificationRequest initialRequest =
                    Assert.NotNull(requestStream.Current, "No request");

                request = initialRequest.Request;

                await StartRequest(request);

                Func <DataVerificationResponse, DataVerificationRequest> moreDataRequest =
                    delegate(DataVerificationResponse r)
                {
                    return(Task.Run(async() =>
                                    await RequestMoreDataAsync(
                                        requestStream, responseStream, context, r)
                                    .ConfigureAwait(false))
                           .Result);
                };

                Func <ITrackCancel, ServiceCallStatus> func =
                    trackCancel =>
                    VerifyDataQualityCore(initialRequest, moreDataRequest, responseStream,
                                          trackCancel);

                ServiceCallStatus result =
                    await GrpcServerUtils.ExecuteServiceCall(
                        func, context, _staThreadScheduler);

                _msg.InfoFormat("Verification {0}", result);
            }
            catch (Exception e)
            {
                _msg.Error($"Error verifying quality for request {request}", e);

                SendFatalException(e, responseStream);
                SetUnhealthy();
            }
            finally
            {
                EndRequest();
            }
        }
コード例 #13
0
        private void MasterWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            ServiceCallStatus arg = e.UserState as ServiceCallStatus;
            DataGridViewRow   row = dataGridView1.Rows[arg.Row];

            row.Cells[0].Value = arg.Status;
            if (arg.Data is Exception)
            {
                addToTag(row, (arg.Data as Exception).Message);
            }
            else if (arg.Data is string)
            {
                addToTag(row, arg.Data as string);
            }
        }
コード例 #14
0
        private void InvokeServicesWorker_DoWork(object threadContext)
        {
            ServiceCallStatus call    = threadContext as ServiceCallStatus;
            SADIService       service = call.Data as SADIService;

            try
            {
                call.Status = "Assembling input";
                MasterWorker.ReportProgress(1, call);
                MemoryStore input = assembleInput(SelectedNodes, service);

                call.Status = "Calling service";
                call.Data   = "Assembled input:\r\n" + SemWebHelper.storeToString(input);
                MasterWorker.ReportProgress(33, call);
                Store output = service.invokeService(input);

                call.Status = "Storing output";
                call.Data   = "Received output:\r\n" + SemWebHelper.storeToString(output);
                MasterWorker.ReportProgress(66, call);
                ICollection <IStatement> statements = KE.Import(output);
                showNewStatements(statements);

                call.Status = "Done";
                call.Data   = service;
                MasterWorker.ReportProgress(100, call);
            }
            catch (Exception err)
            {
                SADIHelper.error("ServiceCall", "error calling service", service, err);
                call.Status = "Error";
                call.Data   = "Error:\r\n" + err.Message;
                MasterWorker.ReportProgress(100, call);
            }
            finally
            {
                Interlocked.Decrement(ref NumWorkers);
            }
        }
コード例 #15
0
        private ServiceCallStatus VerifyDataQualityCore(
            [NotNull] DataVerificationRequest initialRequest,
            Func <DataVerificationResponse, DataVerificationRequest> moreDataRequest,
            IServerStreamWriter <DataVerificationResponse> responseStream,
            ITrackCancel trackCancel)
        {
            var request = initialRequest.Request;

            SetupUserNameProvider(request);

            void SendResponse(VerificationResponse r) => responseStream.WriteAsync(
                new DataVerificationResponse {
                Response = r
            });

            BackgroundVerificationService qaService = null;
            List <GdbObjRefMsg>           deletableAllowedErrorRefs = new List <GdbObjRefMsg>();
            QualityVerification           verification = null;
            var    issueCollection     = new ConcurrentBag <IssueMsg>();
            string cancellationMessage = null;

            try
            {
                // TODO: Separate long-lived objects, such as datasetLookup, domainTransactions (add to this class) from
                // short-term objects (request) -> add to background verification inputs
                IBackgroundVerificationInputs backgroundVerificationInputs =
                    _verificationInputsFactoryMethod(request);

                if (initialRequest.Schema != null)
                {
                    backgroundVerificationInputs.SetGdbSchema(
                        ProtobufConversionUtils.CreateSchema(initialRequest.Schema.ClassDefinitions,
                                                             initialRequest
                                                             .Schema.RelclassDefinitions,
                                                             moreDataRequest));
                }
                else if (moreDataRequest != null)
                {
                    backgroundVerificationInputs.SetRemoteDataAccess(moreDataRequest);
                }

                qaService = CreateVerificationService(backgroundVerificationInputs, issueCollection,
                                                      SendResponse, trackCancel);

                verification = qaService.Verify(backgroundVerificationInputs, trackCancel);

                deletableAllowedErrorRefs.AddRange(
                    GetDeletableAllowedErrorRefs(request.Parameters, qaService));
            }
            catch (Exception e)
            {
                _msg.Error($"Error checking quality for request {request}", e);
                cancellationMessage = $"Server error: {e.Message}";

                SetUnhealthy();
            }

            ServiceCallStatus result = SendFinalResponse(
                verification, cancellationMessage ?? qaService.CancellationMessage, issueCollection,
                deletableAllowedErrorRefs, qaService?.VerifiedPerimeter, SendResponse);

            return(result);
        }
コード例 #16
0
 private ServiceResult(ServiceCallStatus status, string message)
     : this(status, new[] { message })
 {
 }
コード例 #17
0
ファイル: Main.cs プロジェクト: TheNephalim/Atlanta
 private void MediaService_ModifyCompleted(ServiceCallStatus status)
 {
     throw new NotImplementedException();
 }
コード例 #18
0
ファイル: Main.cs プロジェクト: FlukeFan/Atlanta
 private void MediaService_ModifyCompleted(ServiceCallStatus status)
 {
     throw new NotImplementedException();
 }
コード例 #19
0
 private ServiceResult(ServiceCallStatus status, IEnumerable <string> messages = null)
 {
     Status   = status;
     Messages = messages ?? Enumerable.Empty <string>();
 }
コード例 #20
0
 internal ServiceResult(TValue value, ServiceCallStatus status, IEnumerable <string> messages = null)
 {
     Value    = value;
     Status   = status;
     Messages = messages ?? Enumerable.Empty <string>();
 }
コード例 #21
0
 internal ServiceResult(TValue value, ServiceCallStatus status, string message)
     : this(value, status, new[] { message })
 {
 }