public void RecordRead(ITransactionalResource transactionalResource, TransactionalResourceVersion readVersion, long stableVersion) { if (readVersion.TransactionId == TransactionId) { // Just reading our own write here. // Sanity check to see if there's a lost write. int resourceWriteNumber; if (WriteSet.TryGetValue(transactionalResource, out resourceWriteNumber) && resourceWriteNumber > readVersion.WriteNumber) { // Context has record of more writes than we have, some writes must be lost. throw new OrleansTransactionAbortedException(TransactionId, "Lost Write"); } } else { TransactionalResourceVersion resourceReadVersion; if (ReadSet.TryGetValue(transactionalResource, out resourceReadVersion) && resourceReadVersion != readVersion) { // Uh-oh. Read two different versions of the grain. throw new OrleansValidationFailedException(TransactionId); } ReadSet[transactionalResource] = readVersion; if (readVersion.TransactionId != TransactionId && readVersion.TransactionId > stableVersion) { DependentTransactions.Add(readVersion.TransactionId); } } }
public void Abort() { _transactionStatus = TransactionStatus.Aborted; #if DEBUG Console.WriteLine("ABORTED: " + ID); #endif WriteSet.Clear(); ReadSet.Clear(); }
/// <summary> /// For verbose tracing and debugging. /// </summary> public override string ToString() { return(string.Join("", TransactionId, (IsReadOnly ? " RO" : ""), (IsAborted ? " Aborted" : ""), $" R{{{string.Join(",", ReadSet.Select(kvp => $"{kvp.Key.ToShortString()}.{kvp.Value}"))}}}", $" W{{{string.Join(",", WriteSet.Select(kvp => $"{kvp.Key.ToShortString()}.{TransactionId}#{kvp.Value}"))}}}", $" D{{{string.Join(",", DependentTransactions)}}}" )); }
private void HandleCommit(int writeStamp) { foreach (var entry in WriteSet) { var lo = entry.Key; var value = entry.Value; lo.Commit(value, writeStamp); } WriteSet.Unlock(); }
public void RecordWrite(ITransactionalResource transactionalResource, TransactionalResourceVersion latestVersion, long stableVersion) { int writeNumber; WriteSet.TryGetValue(transactionalResource, out writeNumber); WriteSet[transactionalResource] = writeNumber + 1; if (latestVersion.TransactionId != TransactionId && latestVersion.TransactionId > stableVersion) { DependentTransactions.Add(latestVersion.TransactionId); } }
private void Union(TransactionInfo other) { if (TransactionId != other.TransactionId) { IsAborted = true; string error = $"Attempting to perform union between different Transactions. Attempted union between Transactions {TransactionId} and {other.TransactionId}"; throw new InvalidOperationException(error); } if (other.IsAborted) { IsAborted = true; } // Take a union of the ReadSets. foreach (var grain in other.ReadSet.Keys) { if (ReadSet.ContainsKey(grain)) { if (ReadSet[grain] != other.ReadSet[grain]) { // Conflict! Transaction must abort IsAborted = true; } } else { ReadSet.Add(grain, other.ReadSet[grain]); } } // Take a union of the WriteSets. foreach (var grain in other.WriteSet.Keys) { if (!WriteSet.ContainsKey(grain)) { WriteSet[grain] = 0; } WriteSet[grain] += other.WriteSet[grain]; } DependentTransactions.UnionWith(other.DependentTransactions); }
public bool Validate(out int writeStamp) { writeStamp = -1; if (Status == TransactionStatus.Aborted || !WriteSet.TryLock(STMSystem.TIME_OUT)) { return(false); } if (ValidateReadset()) { writeStamp = VersionClock.IncrementClock(); return(true); } WriteSet.Unlock(); return(false); }
/// <summary> /// Use this endpoint to Get transaction by transaction id. /// </summary> /// <exception cref="Xooa.Client.Exception.XooaApiException">Thrown when fails to make API call</exception> /// <exception cref="Xooa.Client.Exception.XooaRequestTimeoutException">Thrown when a 202 response is recieved.</exception> /// <param name="transactionId">Transaction Id to fetch data</param> /// <param name="timeout">Timeout interval for transaction.</param> /// <returns>TransactionResponse giving the data about the transaction.</returns> public TransactionResponse getTransactionByTransactionId(string transactionId, string timeout = "3000") { Log.Info("Invoking URL - " + XooaConstants.TRANSACTION_URL); var localVarPath = XooaConstants.TRANSACTION_URL; var contentType = XooaConstants.CONTENT_TYPE; var localVarQueryParameters = new List <KeyValuePair <string, string> >(); localVarQueryParameters.Add(new KeyValuePair <string, string>(XooaConstants.ASYNC, XooaConstants.FALSE)); localVarQueryParameters.Add(new KeyValuePair <string, string>(XooaConstants.TIMEOUT, timeout)); var localVarHeaderParams = new Dictionary <string, string>(); localVarHeaderParams.Add(XooaConstants.ACCEPT, XooaConstants.CONTENT_TYPE); localVarHeaderParams.Add(XooaConstants.AUTHORIZATION, XooaConstants.TOKEN + apiToken); var localVarPathParams = new Dictionary <string, string>(); localVarPathParams.Add("TransactionId", transactionId); int statusCode = 0; try { RestRequest request = XooaSDK.Client.Util.Request.PrepareRequest(localVarPath, RestSharp.Method.GET, localVarQueryParameters, null, localVarHeaderParams, null, localVarPathParams, contentType); IRestResponse response = RestClient.Execute(request); JObject details = XooaSDK.Client.Util.Request.GetData(response); string txnId = details["txid"].ToString(); string smartContract = details["smartcontract"].ToString(); string creatorMspId = details["creator_msp_id"].ToString(); string createdAt = details["createdt"].ToString(); string type = details["type"].ToString(); var endorserIds = details["endorser_msp_id"]; var readsets = details["read_set"]; var writesets = details["write_set"]; List <string> endorserMspIds = new List <string>(); List <ReadSet> readSetsList = new List <ReadSet>(); List <WriteSet> writeSetsList = new List <WriteSet>(); foreach (var id in endorserIds) { endorserMspIds.Add(id.ToString()); } foreach (var set in readsets) { string chaincode = set["chaincode"].ToString(); var readsubsets = set["set"]; List <ReadSubSet> subSetsList = new List <ReadSubSet>(); foreach (var subset in readsubsets) { string key = subset["key"].ToString(); var vrsn = subset["version"]; string blockNumber = vrsn["block_num"].ToString(); string transactionNumber = vrsn["tx_num"].ToString(); Response.Version version = new Response.Version(blockNumber, transactionNumber); ReadSubSet readSubSet = new ReadSubSet(key, version); subSetsList.Add(readSubSet); } ReadSet readSet = new ReadSet(chaincode, subSetsList); readSetsList.Add(readSet); } foreach (var set in writesets) { string chaincode = set["chaincode"].ToString(); var writesubsets = set["set"]; List <WriteSubSet> writeSubSetsList = new List <WriteSubSet>(); foreach (var writesubset in writesubsets) { string key = set["key"].ToString(); string value = set["value"].ToString(); bool isDelete = (bool)set["is_delete"]; WriteSubSet writeSubSet = new WriteSubSet(key, value, isDelete); writeSubSetsList.Add(writeSubSet); } WriteSet writeSet = new WriteSet(chaincode, writeSubSetsList); writeSetsList.Add(writeSet); } TransactionResponse transactionResponse = new TransactionResponse(txnId, smartContract, creatorMspId, endorserMspIds, type, createdAt, readSetsList, writeSetsList); return(transactionResponse); } catch (XooaRequestTimeoutException xrte) { Log.Error(xrte); throw xrte; } catch (XooaApiException xae) { Log.Error(xae); throw xae; } catch (System.Exception e) { Log.Error(e); throw new XooaApiException(statusCode, e.Message); } }
private Transaction(TransactionStatus status, int readStmp, Transaction parent) { Init(status, readStmp); Parent = parent; WriteSet = new WriteSet(parent.WriteSet); }
private Transaction(TransactionStatus status, int readStmp) { Init(status, readStmp); WriteSet = new WriteSet(); }