protected override DataSet ServerProcessInternal(DataSet ds)
        {
            if (serviceUri == "(local)")
            {
                return(LocalProcess(ds));
            }

            string hash = DataSetDiskCache.ComputeHash(ds);

            DataSet proxyDataSet = null;

            // Creating new DataSet at the service.
            // TODO: fix following:
            try
            {
                try
                {
                    proxyDataSet = ProxyDataSet.CreateProxySync(taskQueue, ServicePort, "msds:memory", false, 10 * 60 * 1000);
                }
                catch (CommunicationObjectFaultedException)
                {
                    //Connection to server closed.
                    //Recreate service port and try again.
                    if (proxyDataSet != null && !proxyDataSet.IsDisposed)
                    {
                        proxyDataSet.Dispose();
                    }
                    this._servicePort = null;
                    proxyDataSet      = ProxyDataSet.CreateProxySync(taskQueue, ServicePort, "msds:memory", false, 10 * 60 * 1000);
                }
                AutoResetEvent     completed   = new AutoResetEvent(false);
                OnCommittedHandler onCommitted = new OnCommittedHandler(completed, OnDataSetCommitted);
                proxyDataSet.Committed += onCommitted.Handler;

                proxyDataSet.IsAutocommitEnabled = false;
                FetchClimateRequestBuilder.CopyRequestedDataSet(ds, proxyDataSet, false);
                proxyDataSet.Metadata[Namings.metadataNameHash] = hash;
                proxyDataSet.Commit();

                if (proxyDataSet.HasChanges)
                {
                    proxyDataSet.Commit();
                }

                completed.WaitOne();
                proxyDataSet.IsAutocommitEnabled = true;
                return(proxyDataSet);
            }
            catch
            {
                if (proxyDataSet != null && !proxyDataSet.IsDisposed)
                {
                    proxyDataSet.Dispose();
                }
                throw;
            }
        }
        private void OnDataSetCommitted(DataSetCommittedEventArgs e, OnCommittedHandler handler)
        {
            if ((e.Changes.ChangesetSource & ChangesetSource.Remote) == 0)
            {
                return; // we're waiting for remote changes
            }
            var ds = e.DataSet;

            if (FetchClimateRequestBuilder.IsProcessingSuccessful(ds) || FetchClimateRequestBuilder.IsProcessingFailed(ds))
            {
                ds.Committed -= handler.Handler;
                handler.Completed.Set();
            }
        }
Example #3
0
        protected override DataSet ServerProcessInternal(DataSet ds)
        {
            DateTime start = DateTime.Now;

            bool resultGot = false;

            DataSet inputDs = ds;

            DataSet resultDs = null;

            while (!resultGot)
            {
                resultDs = RestApiWrapper.Instance.Process(ds);
                if (FetchClimateRequestBuilder.IsResultDataSet(resultDs))
                {
                    resultGot = true;
                }
                else
                {
                    if (FetchClimateRequestBuilder.ResendRequest(resultDs))
                    {
                        ds = inputDs;
                    }
                    else
                    {
                        ds = resultDs;
                    }

                    int    expectedCalculationTime = 0;
                    string hash = string.Empty;
                    FetchClimateRequestBuilder.GetStatusCheckParams(resultDs, out expectedCalculationTime, out hash);

                    Thread.Sleep(expectedCalculationTime);
                }

                if ((!resultGot) && (DateTime.Now - start) > timeout)
                {
                    throw new TimeoutException("Request to fetch climate has timed out. Increase timeout value or try again later.");
                }
            }

            return(resultDs);
        }
        protected override DataSet LocalProcess(DataSet ds)
        {
            DataSet resultDs = null;

            try
            {
                //Microsoft.Research.Science.Data.Factory.DataSetFactory.Register(typeof(Microsoft.Research.Science.Data.Memory2.ChunkedMemoryDataSet));
                resultDs = DataSet.Open("msds:memory");
                resultDs.IsAutocommitEnabled = false;
                FetchClimateRequestBuilder.CopyRequestedDataSet(ds, resultDs, false);
                if (resultDs.HasChanges)
                {
                    resultDs.Commit();
                }
                Microsoft.Research.Science.Data.Climate.Processing.ClimateRequestProcessor.Process(resultDs, 0);

                if (FetchClimateRequestBuilder.IsProcessingSuccessful(resultDs))
                {
                    ;//cache.Add(ds,ComputeHash(request));
                }
                else if (!FetchClimateRequestBuilder.IsProcessingFailed(resultDs))
                {
                    throw new Exception("Processor hasn't finished the work.");
                }

                resultDs.IsAutocommitEnabled = true;
                return(resultDs);
            }
            catch
            {
                if (resultDs != null && !resultDs.IsDisposed)
                {
                    resultDs.Dispose();
                }
                throw;
            }
        }