Пример #1
0
        private static bool SatisfyDataRequest(
            [NotNull] DataVerificationResponse arg,
            [NotNull] IVerificationDataProvider verificationDataProvider,
            [NotNull] IClientStreamWriter <DataVerificationRequest> callRequestStream)
        {
            DataVerificationRequest result = new DataVerificationRequest();

            try
            {
                if (arg.SchemaRequest != null)
                {
                    result.Schema = verificationDataProvider.GetGdbSchema(arg.SchemaRequest);
                }
                else if (arg.DataRequest != null)
                {
                    result.Data = verificationDataProvider
                                  .GetData(arg.DataRequest).FirstOrDefault();
                }

                callRequestStream.WriteAsync(result);

                return(true);
            }
            catch (Exception e)
            {
                _msg.Debug("Error handling data request", e);

                // Send an empty message to make sure the server does not wait forever:
                callRequestStream.WriteAsync(result);
                throw;
            }
        }
Пример #2
0
        private static async Task <DataVerificationRequest> RequestMoreDataAsync(
            IAsyncStreamReader <DataVerificationRequest> requestStream,
            IServerStreamWriter <DataVerificationResponse> responseStream,
            ServerCallContext context,
            DataVerificationResponse r)
        {
            DataVerificationRequest resultData = null;

            Task responseReaderTask = Task.Run(
                async() =>
            {
                while (resultData == null)
                {
                    while (await requestStream.MoveNext().ConfigureAwait(false))
                    {
                        resultData = requestStream.Current;
                        break;
                    }
                }
            });

            await responseStream.WriteAsync(r).ConfigureAwait(false);

            await responseReaderTask.ConfigureAwait(false);

            return(resultData);
        }
Пример #3
0
        public void InitializeSchema(ICollection <Dataset> datasets)
        {
            if (_dataRequestFunc == null)
            {
                return;
            }

            if (_virtualWorkspaces != null)
            {
                return;
            }

            var dataRequest = new DataVerificationResponse
            {
                SchemaRequest = new SchemaRequest()
            };

            dataRequest.SchemaRequest.DatasetIds.AddRange(datasets.Select(d => d.Id));

            DataVerificationRequest dataResponse = _dataRequestFunc(dataRequest);

            SetGdbSchema(ProtobufConversionUtils.CreateSchema(
                             dataResponse.Schema.ClassDefinitions,
                             dataResponse.Schema.RelclassDefinitions, _dataRequestFunc));
        }
Пример #4
0
        private async Task <bool> VerifyDataAsync(
            [NotNull] QualityVerificationGrpc.QualityVerificationGrpcClient rpcClient,
            [NotNull] CancellationTokenSource cancellationSource,
            [CanBeNull] SchemaMsg schemaMsg = null)
        {
            using (var call = rpcClient.VerifyDataQuality())
            {
                var initialRequest =
                    new DataVerificationRequest
                {
                    Request = VerificationRequest,
                    Schema  = schemaMsg
                };

                await call.RequestStream.WriteAsync(initialRequest);

                while (await call.ResponseStream.MoveNext(cancellationSource.Token))
                {
                    var responseMsg = call.ResponseStream.Current;

                    if (responseMsg.SchemaRequest != null || responseMsg.DataRequest != null)
                    {
                        await ProvideDataToServer(responseMsg, call.RequestStream,
                                                  cancellationSource);
                    }
                    else
                    {
                        HandleProgressMsg(responseMsg.Response);
                    }
                }
            }

            return(true);
        }
Пример #5
0
        public override IRow GetRow(int id)
        {
            Assert.True(_schema.HasOID, "The table {0} has no OID", DatasetUtils.GetName(_schema));
            Assert.False(string.IsNullOrEmpty(_schema.OIDFieldName),
                         "The table {0} has no OID Field Name", DatasetUtils.GetName(_schema));

            DataVerificationResponse response =
                new DataVerificationResponse
            {
                DataRequest = new DataRequest
                {
                    WhereClause = $"{_schema.OIDFieldName} = {id}"
                }
            };

            if (_queryDefinition != null)
            {
                response.DataRequest.RelQueryDef = _queryDefinition;
            }
            else
            {
                response.DataRequest.ClassDef = Assert.NotNull(_classDefinition);
            }

            DataVerificationRequest moreData = GetData(response);

            foreach (GdbObjectMsg gdbObjMsg in moreData.Data.GdbObjects)
            {
                return(ProtobufConversionUtils.FromGdbObjectMsg(gdbObjMsg, _schema));
            }

            // or better: COMException?
            return(null);
        }
        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();
            }
        }
Пример #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");

                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();
            }
        }
Пример #8
0
        private async Task SatisfyDataQueryAsync(
            [NotNull] DataRequest dataRequest,
            [NotNull] IClientStreamWriter <DataVerificationRequest> targetStream)
        {
            // Once the result messages are split up, this could be used for higher throughput
            foreach (GdbData data in Assert.NotNull(VerificationDataProvider).GetData(dataRequest))
            {
                DataVerificationRequest r = new DataVerificationRequest
                {
                    Data = data
                };

                await targetStream.WriteAsync(r);
            }
        }
Пример #9
0
        private ITable GetRemoteQueryTable([NotNull] string relationshipClassName,
                                           [NotNull] Model model,
                                           [NotNull] IList <ITable> tables,
                                           JoinType joinType,
                                           [CanBeNull] string whereClause)
        {
            var dataRequest = new DataVerificationResponse
            {
                SchemaRequest = new SchemaRequest()
            };

            RelationshipClassQuery relClassQueryMsg =
                new RelationshipClassQuery
            {
                RelationshipClassName = relationshipClassName,
                WorkspaceHandle       = model.Id,
                JoinType = (int)joinType,
            };

            relClassQueryMsg.Tables.AddRange(tables.Select(DatasetUtils.GetName));

            if (!string.IsNullOrEmpty(whereClause))
            {
                relClassQueryMsg.WhereClause = whereClause;
            }

            dataRequest.SchemaRequest.RelationshipClassQueries.Add(relClassQueryMsg);

            DataVerificationRequest dataResponse = _dataRequestFunc(dataRequest);

            GdbWorkspace gdbWorkspace =
                Assert.NotNull(_virtualWorkspaces).First(w => w.WorkspaceHandle == model.Id);

            ObjectClassMsg queryTableMsg = dataResponse.Schema.RelclassDefinitions.First();

            Func <ITable, BackingDataset> createBackingDataset = null;

            if (_dataRequestFunc != null)
            {
                createBackingDataset = (t) =>
                                       new RemoteDataset(t, _dataRequestFunc, null, relClassQueryMsg);
            }

            // It is cached on the client side, in case various tests utilize the same definition.
            // TODO: Test!
            return(ProtobufConversionUtils.FromObjectClassMsg(queryTableMsg, gdbWorkspace,
                                                              createBackingDataset));
        }
Пример #10
0
        public override int GetRowCount(IQueryFilter filter)
        {
            DataRequest dataRequest = CreateDataRequest(filter);

            dataRequest.CountOnly = true;

            DataVerificationResponse response =
                new DataVerificationResponse
            {
                DataRequest = dataRequest
            };

            DataVerificationRequest moreData = GetData(response);

            if (moreData == null)
            {
                throw new IOException(
                          $"No data provided by the client for data request {response.DataRequest}");
            }

            return(moreData.Data.GdbObjectCount);
        }
Пример #11
0
        public override IEnumerable <IRow> Search(IQueryFilter filter, bool recycling)
        {
            DataRequest dataRequest = CreateDataRequest(filter);

            DataVerificationResponse response =
                new DataVerificationResponse
            {
                DataRequest = dataRequest
            };

            DataVerificationRequest moreData = GetData(response);

            if (moreData == null)
            {
                throw new IOException(
                          $"No data provided by the client for data request {response.DataRequest}");
            }

            foreach (GdbObjectMsg gdbObjMsg in moreData.Data.GdbObjects)
            {
                yield return(ProtobufConversionUtils.FromGdbObjectMsg(gdbObjMsg, _schema));
            }
        }
Пример #12
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);
        }