private void OnJobCompleted(object sender, JobCompletedEventArgs e) { var jobStatus = _serverCore.GetJobStatus(e.StoreId, e.CompletedJob.JobId.ToString()); if (jobStatus != null && jobStatus.JobStatus == JobStatus.TransactionError) { // Because all transactions should be processable, this indicates a hardware problem or persistent software problem _serverCore.Shutdown(true); _state = CoreState.Broken; } _storeInfo[e.StoreId].Commit(e.CompletedJob.JobId); }
/// <summary> /// Execute an update transaction. /// </summary> /// <param name="storeName">The name of the store to modify</param> /// <param name="preconditions">NTriples that must be in the store in order for the transaction to execute</param> /// <param name="deletePatterns">The delete patterns that will be removed from the store</param> /// <param name="insertData">The NTriples data that will be inserted into the store.</param> /// <param name="waitForCompletion">If set to true the method will block until the transaction completes</param> /// <returns>Job Info</returns> public IJobInfo ExecuteTransaction(string storeName, string preconditions, string deletePatterns, string insertData, bool waitForCompletion = true) { try { if (!waitForCompletion) { var jobId = _serverCore.ProcessTransaction(storeName, preconditions, deletePatterns, insertData); return(new JobInfoWrapper(new JobInfo { JobId = jobId.ToString(), JobPending = true })); } else { var jobId = _serverCore.ProcessTransaction(storeName, preconditions, deletePatterns, insertData); JobExecutionStatus status = _serverCore.GetJobStatus(storeName, jobId.ToString()); while (status.JobStatus != JobStatus.CompletedOk && status.JobStatus != JobStatus.TransactionError) { Thread.Sleep(50); status = _serverCore.GetJobStatus(storeName, jobId.ToString()); } return(new JobInfoWrapper(new JobInfo { JobId = jobId.ToString(), StatusMessage = status.Information, JobCompletedOk = (status.JobStatus == JobStatus.CompletedOk), JobCompletedWithErrors = (status.JobStatus == JobStatus.TransactionError) })); } } catch (Exception ex) { Logging.LogError(BrightstarEventId.ServerCoreException, "Error Queing Transaction {0} {1} {2}", storeName, deletePatterns, insertData); throw new BrightstarClientException("Error queing transaction in store " + storeName + ". " + ex.Message, ex); } }
/// <summary> /// Commits all changes. Waits for the operation to complete. /// </summary> protected override void DoSaveChanges() { if (_optimisticLockingEnabled) { // get subject entity and see if there is a version triple var subjects = AddTriples.Subjects .Union(DeletePatterns.Subjects) .Except(new[] { Constants.WildcardUri }).ToList(); foreach (var subject in subjects) { var entity = LookupDataObject(subject); if (entity == null) { throw new BrightstarClientException("No Entity Found for Subject " + subject); } var version = entity.GetPropertyValue(Constants.VersionPredicateUri); if (version == null) { // no existing version information so assume this is the first time using it with 1 entity.SetProperty(Constants.VersionPredicateUri, 1); } else { var intVersion = Convert.ToInt32(version); // inc version intVersion++; entity.SetProperty(Constants.VersionPredicateUri, intVersion); Preconditions.Add(new Triple { Graph = VersionGraphUri, DataType = RdfDatatypes.Integer, IsLiteral = true, LangCode = null, Object = version.ToString(), Predicate = Constants.VersionPredicateUri, Subject = subject }); } } } var deleteData = new StringWriter(); var dw = new BrightstarTripleSinkAdapter(new NQuadsWriter(deleteData)); foreach (var triple in DeletePatterns.Items) { dw.Triple(triple); } deleteData.Close(); var addData = new StringWriter(); var aw = new BrightstarTripleSinkAdapter(new NQuadsWriter(addData)); foreach (var triple in AddTriples.Items) { aw.Triple(triple); } addData.Close(); var preconditionsData = new StringWriter(); var pw = new BrightstarTripleSinkAdapter(new NQuadsWriter(preconditionsData)); foreach (var triple in Preconditions.Items) { pw.Triple(triple); } preconditionsData.Close(); var nePreconditionsData = new StringWriter(); var nw = new BrightstarTripleSinkAdapter(new NQuadsWriter(nePreconditionsData)); foreach (var triple in NonExistencePreconditions.Items) { nw.Triple(triple); } nePreconditionsData.Close(); var jobId = _serverCore.ProcessTransaction(_storeName, preconditionsData.ToString(), nePreconditionsData.ToString(), deleteData.ToString(), addData.ToString(), UpdateGraphUri); var status = _serverCore.GetJobStatus(_storeName, jobId.ToString()); status.WaitEvent.WaitOne(); // while (!(status.JobStatus == JobStatus.CompletedOk || status.JobStatus == JobStatus.TransactionError)) // { // // wait for completion. //#if !PORTABLE // Thread.Sleep(5); //#endif // status = _serverCore.GetJobStatus(_storeName, jobId.ToString()); // } if (status.JobStatus == JobStatus.TransactionError) { if (status.ExceptionDetail.Type.Equals(typeof(PreconditionFailedException).FullName)) { Preconditions.Clear(); throw TransactionPreconditionsFailedException.FromExceptionDetail(status.ExceptionDetail); } throw new BrightstarClientException(status.ExceptionDetail != null && !String.IsNullOrEmpty(status.ExceptionDetail.Message) ? status.ExceptionDetail.Message : "The transaction encountered an error"); } if (status.JobStatus != JobStatus.CompletedOk) { throw new BrightstarClientException("Unexpected job status on completion: " + status.JobStatus + ". Last message was: " + status.Information); } // reset changes ResetTransactionData(); }
/// <summary> /// Commits all changes. Waits for the operation to complete. /// </summary> protected override void DoSaveChanges() { if (_optimisticLockingEnabled) { // get subject entity and see if there is a version triple var subjects = AddTriples.Select(x => x.Subject).Distinct().Union(DeletePatterns.Select(x => x.Subject).Distinct()).ToList(); foreach (var subject in subjects) { var entity = LookupDataObject(subject); if (entity == null) { throw new BrightstarClientException("No Entity Found for Subject " + subject); } var version = entity.GetPropertyValue(Constants.VersionPredicateUri); if (version == null) { // no existing version information so assume this is the first time using it with OL entity.SetProperty(Constants.VersionPredicateUri, 1); } else { var intVersion = Convert.ToInt32(version); // inc version intVersion++; entity.SetProperty(Constants.VersionPredicateUri, intVersion); Preconditions.Add(new Triple { Graph = Constants.DefaultGraphUri, DataType = RdfDatatypes.Integer, IsLiteral = true, LangCode = null, Object = version.ToString(), Predicate = Constants.VersionPredicateUri, Subject = subject }); } } } var deleteData = new StringWriter(); var dw = new BrightstarTripleSinkAdapter(new NTriplesWriter(deleteData)); foreach (var triple in DeletePatterns) { dw.Triple(triple); } deleteData.Close(); var addData = new StringWriter(); var aw = new BrightstarTripleSinkAdapter(new NTriplesWriter(addData)); foreach (var triple in AddTriples) { aw.Triple(triple); } addData.Close(); var preconditionsData = new StringWriter(); var pw = new BrightstarTripleSinkAdapter(new NTriplesWriter(preconditionsData)); foreach (var triple in Preconditions) { pw.Triple(triple); } preconditionsData.Close(); var jobId = _serverCore.ProcessTransaction(_storeName, preconditionsData.ToString(), deleteData.ToString(), addData.ToString()); var status = _serverCore.GetJobStatus(_storeName, jobId.ToString()); while (!(status.JobStatus == JobStatus.CompletedOk || status.JobStatus == JobStatus.TransactionError)) { // wait for completion. Thread.Sleep(5); status = _serverCore.GetJobStatus(_storeName, jobId.ToString()); } if (status.JobStatus == JobStatus.TransactionError) { if (status.ExceptionDetail.Type.Equals(typeof(PreconditionFailedException).FullName)) { var failedTriples = status.ExceptionDetail.Message.Substring(status.ExceptionDetail.Message.IndexOf("\n") + 1); Preconditions.Clear(); throw new TransactionPreconditionsFailedException(failedTriples); } // todo: fix me and report inner exception throw new BrightstarClientException(status.ExceptionDetail != null ? status.ExceptionDetail.Message : "The transaction encountered an error"); } // reset changes ResetTransactionData(); }