Skip to content

Commit f1efb2a

Browse files
ReubenBondCopilot
andcommitted
Fix transaction request serialization
Restore transaction request services after deserialization and preserve method options needed by transaction invokers after copied or serialized delivery. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 9c51a13 commit f1efb2a

2 files changed

Lines changed: 14 additions & 2 deletions

File tree

src/Orleans.Transactions/TransactionAttribute.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ public enum TransactionOptionAlias
7676
}
7777

7878
[GenerateSerializer]
79+
[SerializationCallbacks(typeof(OnDeserializedCallbacks))]
7980
public abstract class TransactionRequestBase : RequestBase, IOutgoingGrainCallFilter, IOnDeserialized
8081
{
8182
[NonSerialized]
@@ -95,6 +96,9 @@ public abstract class TransactionRequestBase : RequestBase, IOutgoingGrainCallFi
9596
[Id(2)]
9697
public bool UseExclusiveLock { get; set; }
9798

99+
[Id(3)]
100+
private InvokeMethodOptions _methodOptions;
101+
98102
[GeneratedActivatorConstructor]
99103
protected TransactionRequestBase(Serializer<OrleansTransactionAbortedException> exceptionSerializer, IServiceProvider serviceProvider)
100104
{
@@ -126,6 +130,12 @@ protected void SetTransactionOptions(TransactionOption txOption)
126130
this.TransactionOption = txOption;
127131
}
128132

133+
protected new void AddInvokeMethodOptions(InvokeMethodOptions options)
134+
{
135+
base.AddInvokeMethodOptions(options);
136+
_methodOptions |= options;
137+
}
138+
129139
protected void SetExclusiveLock(bool value)
130140
{
131141
this.UseExclusiveLock = value;
@@ -206,7 +216,8 @@ public override async ValueTask<Response> Invoke()
206216
var transactionTimeout = Debugger.IsAttached ? TimeSpan.FromMinutes(30) : TimeSpan.FromSeconds(10);
207217

208218
// Start a new transaction
209-
var isReadOnly = this.Options.HasFlag(InvokeMethodOptions.ReadOnly);
219+
var isReadOnly = this.Options.HasFlag(InvokeMethodOptions.ReadOnly)
220+
|| _methodOptions.HasFlag(InvokeMethodOptions.ReadOnly);
210221
transactionInfo = await TransactionAgent.StartTransaction(isReadOnly, transactionTimeout);
211222
startedNewTransaction = true;
212223
}

src/api/Orleans.Transactions/Orleans.Transactions.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ protected TransactionRequest(Serialization.Serializer<Transactions.OrleansTransa
6262
}
6363

6464
[GenerateSerializer]
65+
[SerializationCallbacks(typeof(Runtime.OnDeserializedCallbacks))]
6566
public abstract partial class TransactionRequestBase : Runtime.RequestBase, IOutgoingGrainCallFilter, Serialization.IOnDeserialized
6667
{
6768
[GeneratedActivatorConstructor]
@@ -2106,4 +2107,4 @@ public Copier_OperationState(global::Orleans.Serialization.Serializers.ICodecPro
21062107

21072108
public global::Orleans.Transactions.TransactionCommitter<TService>.OperationState DeepCopy(global::Orleans.Transactions.TransactionCommitter<TService>.OperationState original, global::Orleans.Serialization.Cloning.CopyContext context) { throw null; }
21082109
}
2109-
}
2110+
}

0 commit comments

Comments
 (0)