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(); } }
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; } }