From 1f342442db73aef3dca486c1b56792eabea9e900 Mon Sep 17 00:00:00 2001 From: CarolWang Date: Wed, 6 Jul 2022 02:25:03 -0700 Subject: [PATCH 01/19] Add setter to TransactionManager.DefaultTimeout and MaxTimeout. --- .../ref/System.Transactions.Local.cs | 4 +- .../System/Transactions/TransactionManager.cs | 48 ++++++++++++++++- .../System.Transactions.Local.Tests.csproj | 1 + .../tests/TransactionManagerTest.cs | 52 +++++++++++++++++++ 4 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs diff --git a/src/libraries/System.Transactions.Local/ref/System.Transactions.Local.cs b/src/libraries/System.Transactions.Local/ref/System.Transactions.Local.cs index f52ae1ffd8b918..2f08b176bc27bf 100644 --- a/src/libraries/System.Transactions.Local/ref/System.Transactions.Local.cs +++ b/src/libraries/System.Transactions.Local/ref/System.Transactions.Local.cs @@ -187,10 +187,10 @@ public static partial class TransactionInterop } public static partial class TransactionManager { - public static System.TimeSpan DefaultTimeout { get { throw null; } } + public static System.TimeSpan DefaultTimeout { get { throw null; } set { } } [System.Diagnostics.CodeAnalysis.DisallowNullAttribute] public static System.Transactions.HostCurrentTransactionCallback? HostCurrentCallback { get { throw null; } set { } } - public static System.TimeSpan MaximumTimeout { get { throw null; } } + public static System.TimeSpan MaximumTimeout { get { throw null; } set { } } public static event System.Transactions.TransactionStartedEventHandler? DistributedTransactionStarted { add { } remove { } } public static void RecoveryComplete(System.Guid resourceManagerIdentifier) { } public static System.Transactions.Enlistment Reenlist(System.Guid resourceManagerIdentifier, byte[] recoveryInformation, System.Transactions.IEnlistmentNotification enlistmentNotification) { throw null; } diff --git a/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs b/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs index c4d3c4ad726a7f..0c3b00d090b53c 100644 --- a/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs +++ b/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs @@ -310,6 +310,31 @@ public static TimeSpan DefaultTimeout } return s_defaultTimeout; } + set + { + TransactionsEtwProvider etwLog = TransactionsEtwProvider.Log; + if (etwLog.IsEnabled()) + { + etwLog.MethodEnter(TraceSourceType.TraceSourceBase, "TransactionManager.set_DefaultTimeout"); + } + + s_defaultTimeout = ValidateTimeout(value); + + if (s_defaultTimeout != DefaultSettingsSection.Timeout) + { + if (etwLog.IsEnabled()) + { + etwLog.ConfiguredDefaultTimeoutAdjusted(); + } + } + + s_defaultTimeoutValidated = true; + + if (etwLog.IsEnabled()) + { + etwLog.MethodExit(TraceSourceType.TraceSourceBase, "TransactionManager.set_DefaultTimeout"); + } + } } @@ -325,7 +350,7 @@ public static TimeSpan MaximumTimeout etwLog.MethodEnter(TraceSourceType.TraceSourceBase, "TransactionManager.get_DefaultMaximumTimeout"); } - LazyInitializer.EnsureInitialized(ref s_maximumTimeout, ref s_cachedMaxTimeout, ref s_classSyncObject, () => DefaultSettingsSection.Timeout); + LazyInitializer.EnsureInitialized(ref s_maximumTimeout, ref s_cachedMaxTimeout, ref s_classSyncObject, () => MachineSettingsSection.MaxTimeout); if (etwLog.IsEnabled()) { @@ -334,6 +359,27 @@ public static TimeSpan MaximumTimeout return s_maximumTimeout; } + set + { + TransactionsEtwProvider etwLog = TransactionsEtwProvider.Log; + if (etwLog.IsEnabled()) + { + etwLog.MethodEnter(TraceSourceType.TraceSourceBase, "TransactionManager.set_DefaultMaximumTimeout"); + } + + if(value < TimeSpan.Zero) + { + throw new ArgumentOutOfRangeException(nameof(value)); + } + + s_cachedMaxTimeout = false; + LazyInitializer.EnsureInitialized(ref s_maximumTimeout, ref s_cachedMaxTimeout, ref s_classSyncObject, () => value); + + if (etwLog.IsEnabled()) + { + etwLog.MethodExit(TraceSourceType.TraceSourceBase, "TransactionManager.set_DefaultMaximumTimeout"); + } + } } /// diff --git a/src/libraries/System.Transactions.Local/tests/System.Transactions.Local.Tests.csproj b/src/libraries/System.Transactions.Local/tests/System.Transactions.Local.Tests.csproj index 90c3f0f9742e01..a5dda3d5689350 100644 --- a/src/libraries/System.Transactions.Local/tests/System.Transactions.Local.Tests.csproj +++ b/src/libraries/System.Transactions.Local/tests/System.Transactions.Local.Tests.csproj @@ -7,6 +7,7 @@ + diff --git a/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs b/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs new file mode 100644 index 00000000000000..5a4fdaa22fce3f --- /dev/null +++ b/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs @@ -0,0 +1,52 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using Xunit; + +namespace System.Transactions.Tests +{ + public class TransactionManagerTest + { + + [Fact] + public void DefaultTimeout_Set_LessThanMaximum() + { + TimeSpan tsDefault = TimeSpan.Parse("00:02:00"); + TransactionManager.DefaultTimeout = tsDefault; + + Assert.Equal(tsDefault, TransactionManager.DefaultTimeout); + } + + [Fact] + public void DefaultTimeout_Set_ExceedMaximum() + { + TimeSpan ts = TransactionManager.MaximumTimeout.Add(TimeSpan.FromMinutes(10)); + TransactionManager.DefaultTimeout = ts; + + Assert.Equal(TransactionManager.DefaultTimeout, TransactionManager.MaximumTimeout); + } + + [Fact] + public void DefaultTimeout_Set_Negative() + { + TimeSpan ts = TimeSpan.Parse("-00:01:00"); + Assert.Throws(() => TransactionManager.DefaultTimeout = ts); + } + + [Fact] + public void MaximumTimeout_Set_Positive() + { + TimeSpan ts = TimeSpan.Parse("00:30:00"); + TransactionManager.MaximumTimeout = ts; + + Assert.Equal(ts, TransactionManager.MaximumTimeout); + } + + [Fact] + public void MaximumTimeout_Set_Negative() + { + TimeSpan ts = TimeSpan.Parse("-00:10:00"); + Assert.Throws(() => TransactionManager.MaximumTimeout = ts); + } + } +} From 0266cfff2111cf43eab2ef94e81540bacca7f914 Mon Sep 17 00:00:00 2001 From: CarolWang Date: Wed, 6 Jul 2022 19:03:20 -0700 Subject: [PATCH 02/19] Address reveiw feedback. --- .../src/System/Transactions/TransactionManager.cs | 8 +++++--- .../tests/TransactionManagerTest.cs | 1 - 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs b/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs index 0c3b00d090b53c..2ed48b17edb111 100644 --- a/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs +++ b/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs @@ -320,7 +320,7 @@ public static TimeSpan DefaultTimeout s_defaultTimeout = ValidateTimeout(value); - if (s_defaultTimeout != DefaultSettingsSection.Timeout) + if (s_defaultTimeout != value) { if (etwLog.IsEnabled()) { @@ -372,8 +372,10 @@ public static TimeSpan MaximumTimeout throw new ArgumentOutOfRangeException(nameof(value)); } - s_cachedMaxTimeout = false; - LazyInitializer.EnsureInitialized(ref s_maximumTimeout, ref s_cachedMaxTimeout, ref s_classSyncObject, () => value); + s_cachedMaxTimeout = true; + s_maximumTimeout = value; + s_defaultTimeout = ValidateTimeout(s_defaultTimeout); + s_defaultTimeoutValidated = true; if (etwLog.IsEnabled()) { diff --git a/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs b/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs index 5a4fdaa22fce3f..41213423341962 100644 --- a/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs +++ b/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs @@ -7,7 +7,6 @@ namespace System.Transactions.Tests { public class TransactionManagerTest { - [Fact] public void DefaultTimeout_Set_LessThanMaximum() { From cfd56736430da782cb50a0077f4dc886e9ae3ba2 Mon Sep 17 00:00:00 2001 From: CarolWang Date: Sun, 10 Jul 2022 18:05:53 -0700 Subject: [PATCH 03/19] Log event if DefaultTimeout get reduced by setting MaxTimeout. --- .../src/System/Transactions/TransactionManager.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs b/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs index 2ed48b17edb111..3e1c9418fd77e9 100644 --- a/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs +++ b/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs @@ -374,7 +374,16 @@ public static TimeSpan MaximumTimeout s_cachedMaxTimeout = true; s_maximumTimeout = value; + TimeSpan defaultTimeout = s_defaultTimeout; s_defaultTimeout = ValidateTimeout(s_defaultTimeout); + if (s_defaultTimeout != defaultTimeout) + { + if (etwLog.IsEnabled()) + { + etwLog.ConfiguredDefaultTimeoutAdjusted(); + } + } + s_defaultTimeoutValidated = true; if (etwLog.IsEnabled()) From b071b0128844feeede9cbbc6d190724f236f10e8 Mon Sep 17 00:00:00 2001 From: CarolWang Date: Mon, 11 Jul 2022 00:09:59 -0700 Subject: [PATCH 04/19] Update tests. --- .../tests/TransactionManagerTest.cs | 31 +++++-------------- 1 file changed, 8 insertions(+), 23 deletions(-) diff --git a/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs b/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs index 41213423341962..d31cbea2887b86 100644 --- a/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs +++ b/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs @@ -8,43 +8,28 @@ namespace System.Transactions.Tests public class TransactionManagerTest { [Fact] - public void DefaultTimeout_Set_LessThanMaximum() + public void DefaultTimeout_MaxTimeout_Set_Get() { TimeSpan tsDefault = TimeSpan.Parse("00:02:00"); - TransactionManager.DefaultTimeout = tsDefault; + TimeSpan tsMax = TimeSpan.Parse("00:30:00"); + TransactionManager.DefaultTimeout = tsDefault; Assert.Equal(tsDefault, TransactionManager.DefaultTimeout); - } - [Fact] - public void DefaultTimeout_Set_ExceedMaximum() - { + TransactionManager.MaximumTimeout = tsMax; + Assert.Equal(tsMax, TransactionManager.MaximumTimeout); + TimeSpan ts = TransactionManager.MaximumTimeout.Add(TimeSpan.FromMinutes(10)); TransactionManager.DefaultTimeout = ts; - + Assert.Equal(tsMax, TransactionManager.MaximumTimeout); Assert.Equal(TransactionManager.DefaultTimeout, TransactionManager.MaximumTimeout); } [Fact] - public void DefaultTimeout_Set_Negative() + public void DefaultTimeout_MaxTimeout_Set_Negative() { TimeSpan ts = TimeSpan.Parse("-00:01:00"); Assert.Throws(() => TransactionManager.DefaultTimeout = ts); - } - - [Fact] - public void MaximumTimeout_Set_Positive() - { - TimeSpan ts = TimeSpan.Parse("00:30:00"); - TransactionManager.MaximumTimeout = ts; - - Assert.Equal(ts, TransactionManager.MaximumTimeout); - } - - [Fact] - public void MaximumTimeout_Set_Negative() - { - TimeSpan ts = TimeSpan.Parse("-00:10:00"); Assert.Throws(() => TransactionManager.MaximumTimeout = ts); } } From ebfcbe3e0aba65a1e3320f459287a6265b9db989 Mon Sep 17 00:00:00 2001 From: CarolWang Date: Mon, 11 Jul 2022 02:55:44 -0700 Subject: [PATCH 05/19] Fix test. --- .../src/System/Transactions/TransactionManager.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs b/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs index 3e1c9418fd77e9..dce15c8f71ef3c 100644 --- a/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs +++ b/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs @@ -374,8 +374,8 @@ public static TimeSpan MaximumTimeout s_cachedMaxTimeout = true; s_maximumTimeout = value; - TimeSpan defaultTimeout = s_defaultTimeout; - s_defaultTimeout = ValidateTimeout(s_defaultTimeout); + TimeSpan defaultTimeout = DefaultTimeout; + s_defaultTimeout = ValidateTimeout(defaultTimeout); if (s_defaultTimeout != defaultTimeout) { if (etwLog.IsEnabled()) From 51039bcc45e60e750db8fe24d0ea155b8493c68d Mon Sep 17 00:00:00 2001 From: CarolWang Date: Mon, 11 Jul 2022 03:38:56 -0700 Subject: [PATCH 06/19] Update. --- .../src/System/Transactions/TransactionManager.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs b/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs index dce15c8f71ef3c..b5226bbc44a999 100644 --- a/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs +++ b/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs @@ -374,8 +374,14 @@ public static TimeSpan MaximumTimeout s_cachedMaxTimeout = true; s_maximumTimeout = value; - TimeSpan defaultTimeout = DefaultTimeout; - s_defaultTimeout = ValidateTimeout(defaultTimeout); + + if(!s_defaultTimeoutValidated) + { + s_defaultTimeout = DefaultSettingsSection.Timeout; + } + + TimeSpan defaultTimeout = s_defaultTimeout; + s_defaultTimeout = ValidateTimeout(s_defaultTimeout); if (s_defaultTimeout != defaultTimeout) { if (etwLog.IsEnabled()) From b7081a92f79161e9141356c84966adcc688846c2 Mon Sep 17 00:00:00 2001 From: CarolWang Date: Mon, 11 Jul 2022 17:37:13 -0700 Subject: [PATCH 07/19] Format and re-org test. --- .../src/System/Transactions/TransactionManager.cs | 4 ++-- .../tests/TransactionManagerTest.cs | 8 ++------ 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs b/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs index b5226bbc44a999..19fb511dccd13c 100644 --- a/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs +++ b/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs @@ -367,7 +367,7 @@ public static TimeSpan MaximumTimeout etwLog.MethodEnter(TraceSourceType.TraceSourceBase, "TransactionManager.set_DefaultMaximumTimeout"); } - if(value < TimeSpan.Zero) + if (value < TimeSpan.Zero) { throw new ArgumentOutOfRangeException(nameof(value)); } @@ -375,7 +375,7 @@ public static TimeSpan MaximumTimeout s_cachedMaxTimeout = true; s_maximumTimeout = value; - if(!s_defaultTimeoutValidated) + if (!s_defaultTimeoutValidated) { s_defaultTimeout = DefaultSettingsSection.Timeout; } diff --git a/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs b/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs index d31cbea2887b86..0088b05734a329 100644 --- a/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs +++ b/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs @@ -23,12 +23,8 @@ public void DefaultTimeout_MaxTimeout_Set_Get() TransactionManager.DefaultTimeout = ts; Assert.Equal(tsMax, TransactionManager.MaximumTimeout); Assert.Equal(TransactionManager.DefaultTimeout, TransactionManager.MaximumTimeout); - } - - [Fact] - public void DefaultTimeout_MaxTimeout_Set_Negative() - { - TimeSpan ts = TimeSpan.Parse("-00:01:00"); + + ts = TimeSpan.Parse("-00:01:00"); Assert.Throws(() => TransactionManager.DefaultTimeout = ts); Assert.Throws(() => TransactionManager.MaximumTimeout = ts); } From 4a594beb5b813e619d5b05a5ddd143d6e768ef2c Mon Sep 17 00:00:00 2001 From: CarolWang Date: Wed, 13 Jul 2022 19:57:29 -0700 Subject: [PATCH 08/19] Interlock access defaulttimeout to avoid data tear in assignment. --- .../System/Transactions/TransactionManager.cs | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs b/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs index 19fb511dccd13c..3295cb241bce0e 100644 --- a/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs +++ b/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs @@ -279,7 +279,7 @@ internal static IsolationLevel DefaultIsolationLevel private static MachineSettingsSection MachineSettings => s_machineSettings ??= MachineSettingsSection.GetSection(); private static bool s_defaultTimeoutValidated; - private static TimeSpan s_defaultTimeout; + private static long s_defaultTimeoutTicks; public static TimeSpan DefaultTimeout { get @@ -292,9 +292,9 @@ public static TimeSpan DefaultTimeout if (!s_defaultTimeoutValidated) { - s_defaultTimeout = ValidateTimeout(DefaultSettingsSection.Timeout); + Interlocked.Exchange(ref s_defaultTimeoutTicks, ValidateTimeout(DefaultSettingsSection.Timeout).Ticks); // If the timeout value got adjusted, it must have been greater than MaximumTimeout. - if (s_defaultTimeout != DefaultSettingsSection.Timeout) + if (s_defaultTimeoutTicks != DefaultSettingsSection.Timeout.Ticks) { if (etwLog.IsEnabled()) { @@ -308,7 +308,7 @@ public static TimeSpan DefaultTimeout { etwLog.MethodExit(TraceSourceType.TraceSourceBase, "TransactionManager.get_DefaultTimeout"); } - return s_defaultTimeout; + return new TimeSpan(s_defaultTimeoutTicks); } set { @@ -318,9 +318,8 @@ public static TimeSpan DefaultTimeout etwLog.MethodEnter(TraceSourceType.TraceSourceBase, "TransactionManager.set_DefaultTimeout"); } - s_defaultTimeout = ValidateTimeout(value); - - if (s_defaultTimeout != value) + Interlocked.Exchange(ref s_defaultTimeoutTicks, ValidateTimeout(value).Ticks); + if (s_defaultTimeoutTicks != value.Ticks) { if (etwLog.IsEnabled()) { @@ -377,12 +376,12 @@ public static TimeSpan MaximumTimeout if (!s_defaultTimeoutValidated) { - s_defaultTimeout = DefaultSettingsSection.Timeout; + Interlocked.Exchange(ref s_defaultTimeoutTicks, DefaultSettingsSection.Timeout.Ticks); } - TimeSpan defaultTimeout = s_defaultTimeout; - s_defaultTimeout = ValidateTimeout(s_defaultTimeout); - if (s_defaultTimeout != defaultTimeout) + long defaultTimeoutTicks = s_defaultTimeoutTicks; + Interlocked.Exchange(ref s_defaultTimeoutTicks, ValidateTimeout(new TimeSpan(s_defaultTimeoutTicks)).Ticks); + if (s_defaultTimeoutTicks != defaultTimeoutTicks) { if (etwLog.IsEnabled()) { From ada0101f40a80c31816b604b152067377a492e1c Mon Sep 17 00:00:00 2001 From: CarolWang Date: Thu, 14 Jul 2022 19:49:59 -0700 Subject: [PATCH 09/19] Update test. --- .../tests/TransactionManagerTest.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs b/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs index 0088b05734a329..2f6d471794ebf4 100644 --- a/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs +++ b/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs @@ -10,6 +10,9 @@ public class TransactionManagerTest [Fact] public void DefaultTimeout_MaxTimeout_Set_Get() { + Assert.Equal(TimeSpan.Parse("00:01:00"), TransactionManager.DefaultTimeout); + Assert.Equal(TimeSpan.Parse("00:10:00"), TransactionManager.MaximumTimeout); + TimeSpan tsDefault = TimeSpan.Parse("00:02:00"); TimeSpan tsMax = TimeSpan.Parse("00:30:00"); @@ -17,7 +20,7 @@ public void DefaultTimeout_MaxTimeout_Set_Get() Assert.Equal(tsDefault, TransactionManager.DefaultTimeout); TransactionManager.MaximumTimeout = tsMax; - Assert.Equal(tsMax, TransactionManager.MaximumTimeout); + Assert.Equal(tsMax, TransactionManager.MaximumTimeout); TimeSpan ts = TransactionManager.MaximumTimeout.Add(TimeSpan.FromMinutes(10)); TransactionManager.DefaultTimeout = ts; From 0f419b25f2783b15c69d3b22ea94b1a6db292ec9 Mon Sep 17 00:00:00 2001 From: CarolWang Date: Thu, 14 Jul 2022 22:48:06 -0700 Subject: [PATCH 10/19] test. --- .../tests/TransactionManagerTest.cs | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs b/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs index 2f6d471794ebf4..0d1ddd15744e9c 100644 --- a/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs +++ b/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs @@ -10,26 +10,25 @@ public class TransactionManagerTest [Fact] public void DefaultTimeout_MaxTimeout_Set_Get() { - Assert.Equal(TimeSpan.Parse("00:01:00"), TransactionManager.DefaultTimeout); - Assert.Equal(TimeSpan.Parse("00:10:00"), TransactionManager.MaximumTimeout); - TimeSpan tsDefault = TimeSpan.Parse("00:02:00"); - TimeSpan tsMax = TimeSpan.Parse("00:30:00"); - TransactionManager.DefaultTimeout = tsDefault; Assert.Equal(tsDefault, TransactionManager.DefaultTimeout); - TransactionManager.MaximumTimeout = tsMax; - Assert.Equal(tsMax, TransactionManager.MaximumTimeout); + //TimeSpan tsMax = TimeSpan.Parse("00:30:00"); + //Assert.Equal(TimeSpan.Parse("00:01:00"), TransactionManager.DefaultTimeout); + //Assert.Equal(TimeSpan.Parse("00:10:00"), TransactionManager.MaximumTimeout); + + //TransactionManager.MaximumTimeout = tsMax; + //Assert.Equal(tsMax, TransactionManager.MaximumTimeout); - TimeSpan ts = TransactionManager.MaximumTimeout.Add(TimeSpan.FromMinutes(10)); - TransactionManager.DefaultTimeout = ts; - Assert.Equal(tsMax, TransactionManager.MaximumTimeout); - Assert.Equal(TransactionManager.DefaultTimeout, TransactionManager.MaximumTimeout); + //TimeSpan ts = TransactionManager.MaximumTimeout.Add(TimeSpan.FromMinutes(10)); + //TransactionManager.DefaultTimeout = ts; + //Assert.Equal(tsMax, TransactionManager.MaximumTimeout); + //Assert.Equal(TransactionManager.DefaultTimeout, TransactionManager.MaximumTimeout); - ts = TimeSpan.Parse("-00:01:00"); - Assert.Throws(() => TransactionManager.DefaultTimeout = ts); - Assert.Throws(() => TransactionManager.MaximumTimeout = ts); + //ts = TimeSpan.Parse("-00:01:00"); + //Assert.Throws(() => TransactionManager.DefaultTimeout = ts); + //Assert.Throws(() => TransactionManager.MaximumTimeout = ts); } } } From 034b85b45a57cabe40d28067ec0bbfdc41da21ce Mon Sep 17 00:00:00 2001 From: CarolWang Date: Sun, 17 Jul 2022 19:48:40 -0700 Subject: [PATCH 11/19] update. --- .../src/System/Transactions/TransactionManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs b/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs index 3295cb241bce0e..8fa05748b9c982 100644 --- a/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs +++ b/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs @@ -278,7 +278,7 @@ internal static IsolationLevel DefaultIsolationLevel private static MachineSettingsSection? s_machineSettings; private static MachineSettingsSection MachineSettings => s_machineSettings ??= MachineSettingsSection.GetSection(); - private static bool s_defaultTimeoutValidated; + private static volatile bool s_defaultTimeoutValidated; private static long s_defaultTimeoutTicks; public static TimeSpan DefaultTimeout { From 358b742003d0fc69f2cdc7431449399877478865 Mon Sep 17 00:00:00 2001 From: CarolWang Date: Sun, 17 Jul 2022 23:09:36 -0700 Subject: [PATCH 12/19] update. --- .../src/System/Transactions/TransactionManager.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs b/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs index 8fa05748b9c982..2a60317480444b 100644 --- a/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs +++ b/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs @@ -278,7 +278,7 @@ internal static IsolationLevel DefaultIsolationLevel private static MachineSettingsSection? s_machineSettings; private static MachineSettingsSection MachineSettings => s_machineSettings ??= MachineSettingsSection.GetSection(); - private static volatile bool s_defaultTimeoutValidated; + private static bool s_defaultTimeoutValidated; private static long s_defaultTimeoutTicks; public static TimeSpan DefaultTimeout { @@ -294,7 +294,7 @@ public static TimeSpan DefaultTimeout { Interlocked.Exchange(ref s_defaultTimeoutTicks, ValidateTimeout(DefaultSettingsSection.Timeout).Ticks); // If the timeout value got adjusted, it must have been greater than MaximumTimeout. - if (s_defaultTimeoutTicks != DefaultSettingsSection.Timeout.Ticks) + if (Interlocked.Read(ref s_defaultTimeoutTicks) != DefaultSettingsSection.Timeout.Ticks) { if (etwLog.IsEnabled()) { @@ -308,7 +308,7 @@ public static TimeSpan DefaultTimeout { etwLog.MethodExit(TraceSourceType.TraceSourceBase, "TransactionManager.get_DefaultTimeout"); } - return new TimeSpan(s_defaultTimeoutTicks); + return new TimeSpan(Interlocked.Read(ref s_defaultTimeoutTicks)); } set { @@ -319,7 +319,7 @@ public static TimeSpan DefaultTimeout } Interlocked.Exchange(ref s_defaultTimeoutTicks, ValidateTimeout(value).Ticks); - if (s_defaultTimeoutTicks != value.Ticks) + if (Interlocked.Read(ref s_defaultTimeoutTicks) != value.Ticks) { if (etwLog.IsEnabled()) { @@ -379,9 +379,9 @@ public static TimeSpan MaximumTimeout Interlocked.Exchange(ref s_defaultTimeoutTicks, DefaultSettingsSection.Timeout.Ticks); } - long defaultTimeoutTicks = s_defaultTimeoutTicks; + long defaultTimeoutTicks = Interlocked.Read(ref s_defaultTimeoutTicks); Interlocked.Exchange(ref s_defaultTimeoutTicks, ValidateTimeout(new TimeSpan(s_defaultTimeoutTicks)).Ticks); - if (s_defaultTimeoutTicks != defaultTimeoutTicks) + if (Interlocked.Read(ref s_defaultTimeoutTicks) != defaultTimeoutTicks) { if (etwLog.IsEnabled()) { From 02ceaee4759fb866c65097a9f66ff77124b159e1 Mon Sep 17 00:00:00 2001 From: CarolWang Date: Mon, 18 Jul 2022 01:15:27 -0700 Subject: [PATCH 13/19] test --- .../src/System/Transactions/TransactionManager.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs b/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs index 2a60317480444b..9247183ef1fde5 100644 --- a/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs +++ b/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs @@ -278,7 +278,7 @@ internal static IsolationLevel DefaultIsolationLevel private static MachineSettingsSection? s_machineSettings; private static MachineSettingsSection MachineSettings => s_machineSettings ??= MachineSettingsSection.GetSection(); - private static bool s_defaultTimeoutValidated; + private static volatile bool s_defaultTimeoutValidated; private static long s_defaultTimeoutTicks; public static TimeSpan DefaultTimeout { @@ -380,7 +380,7 @@ public static TimeSpan MaximumTimeout } long defaultTimeoutTicks = Interlocked.Read(ref s_defaultTimeoutTicks); - Interlocked.Exchange(ref s_defaultTimeoutTicks, ValidateTimeout(new TimeSpan(s_defaultTimeoutTicks)).Ticks); + Interlocked.Exchange(ref s_defaultTimeoutTicks, ValidateTimeout(new TimeSpan(Interlocked.Read(ref s_defaultTimeoutTicks))).Ticks); if (Interlocked.Read(ref s_defaultTimeoutTicks) != defaultTimeoutTicks) { if (etwLog.IsEnabled()) From 6042799f4eafc1cf09e2100842f8134d13c16ec1 Mon Sep 17 00:00:00 2001 From: CarolWang Date: Tue, 19 Jul 2022 20:40:36 -0700 Subject: [PATCH 14/19] Sleep 1s after set before get. --- .../tests/TransactionManagerTest.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs b/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs index 0d1ddd15744e9c..6f23c4b3b46e5a 100644 --- a/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs +++ b/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs @@ -10,8 +10,15 @@ public class TransactionManagerTest [Fact] public void DefaultTimeout_MaxTimeout_Set_Get() { + //Assert.Equal(TimeSpan.Parse("00:01:00"), TransactionManager.DefaultTimeout); + //Assert.Equal(TimeSpan.Parse("00:10:00"), TransactionManager.MaximumTimeout); + TimeSpan tsDefault = TimeSpan.Parse("00:02:00"); + TransactionManager.DefaultTimeout = tsDefault; + + Threading.Thread.Sleep(1000); + Assert.Equal(tsDefault, TransactionManager.DefaultTimeout); //TimeSpan tsMax = TimeSpan.Parse("00:30:00"); From 50b2c405776a72cd85d774bb4bc404f183bb1ee7 Mon Sep 17 00:00:00 2001 From: CarolWang Date: Tue, 19 Jul 2022 23:20:19 -0700 Subject: [PATCH 15/19] test --- .../System.Transactions.Local/tests/TransactionManagerTest.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs b/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs index 6f23c4b3b46e5a..aea83c14373bd4 100644 --- a/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs +++ b/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs @@ -13,11 +13,11 @@ public void DefaultTimeout_MaxTimeout_Set_Get() //Assert.Equal(TimeSpan.Parse("00:01:00"), TransactionManager.DefaultTimeout); //Assert.Equal(TimeSpan.Parse("00:10:00"), TransactionManager.MaximumTimeout); - TimeSpan tsDefault = TimeSpan.Parse("00:02:00"); + TimeSpan tsDefault = TimeSpan.Parse("00:08:00"); TransactionManager.DefaultTimeout = tsDefault; - Threading.Thread.Sleep(1000); + Threading.Thread.Sleep(5000); Assert.Equal(tsDefault, TransactionManager.DefaultTimeout); From 1a934e84a787ca8f67970ec9a7e5fde669fbaf26 Mon Sep 17 00:00:00 2001 From: CarolWang Date: Wed, 20 Jul 2022 01:15:32 -0700 Subject: [PATCH 16/19] update. --- .../System/Transactions/TransactionManager.cs | 19 ++++------- .../tests/TransactionManagerTest.cs | 32 +++++++------------ 2 files changed, 17 insertions(+), 34 deletions(-) diff --git a/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs b/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs index 9247183ef1fde5..e556b0b07ce417 100644 --- a/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs +++ b/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs @@ -278,7 +278,7 @@ internal static IsolationLevel DefaultIsolationLevel private static MachineSettingsSection? s_machineSettings; private static MachineSettingsSection MachineSettings => s_machineSettings ??= MachineSettingsSection.GetSection(); - private static volatile bool s_defaultTimeoutValidated; + private static bool s_defaultTimeoutValidated; private static long s_defaultTimeoutTicks; public static TimeSpan DefaultTimeout { @@ -292,8 +292,7 @@ public static TimeSpan DefaultTimeout if (!s_defaultTimeoutValidated) { - Interlocked.Exchange(ref s_defaultTimeoutTicks, ValidateTimeout(DefaultSettingsSection.Timeout).Ticks); - // If the timeout value got adjusted, it must have been greater than MaximumTimeout. + LazyInitializer.EnsureInitialized(ref s_defaultTimeoutTicks, ref s_defaultTimeoutValidated, ref s_classSyncObject, () => ValidateTimeout(DefaultSettingsSection.Timeout).Ticks); if (Interlocked.Read(ref s_defaultTimeoutTicks) != DefaultSettingsSection.Timeout.Ticks) { if (etwLog.IsEnabled()) @@ -301,7 +300,6 @@ public static TimeSpan DefaultTimeout etwLog.ConfiguredDefaultTimeoutAdjusted(); } } - s_defaultTimeoutValidated = true; } if (etwLog.IsEnabled()) @@ -373,15 +371,12 @@ public static TimeSpan MaximumTimeout s_cachedMaxTimeout = true; s_maximumTimeout = value; + LazyInitializer.EnsureInitialized(ref s_defaultTimeoutTicks, ref s_defaultTimeoutValidated, ref s_classSyncObject, () => DefaultSettingsSection.Timeout.Ticks); - if (!s_defaultTimeoutValidated) - { - Interlocked.Exchange(ref s_defaultTimeoutTicks, DefaultSettingsSection.Timeout.Ticks); - } - - long defaultTimeoutTicks = Interlocked.Read(ref s_defaultTimeoutTicks); + long defaultTimeoutTicks = 0; + Interlocked.Exchange(ref defaultTimeoutTicks, Interlocked.Read(ref s_defaultTimeoutTicks)); Interlocked.Exchange(ref s_defaultTimeoutTicks, ValidateTimeout(new TimeSpan(Interlocked.Read(ref s_defaultTimeoutTicks))).Ticks); - if (Interlocked.Read(ref s_defaultTimeoutTicks) != defaultTimeoutTicks) + if (Interlocked.Read(ref s_defaultTimeoutTicks) != Interlocked.Read(ref defaultTimeoutTicks)) { if (etwLog.IsEnabled()) { @@ -389,8 +384,6 @@ public static TimeSpan MaximumTimeout } } - s_defaultTimeoutValidated = true; - if (etwLog.IsEnabled()) { etwLog.MethodExit(TraceSourceType.TraceSourceBase, "TransactionManager.set_DefaultMaximumTimeout"); diff --git a/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs b/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs index aea83c14373bd4..c2455444b4222d 100644 --- a/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs +++ b/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs @@ -10,32 +10,22 @@ public class TransactionManagerTest [Fact] public void DefaultTimeout_MaxTimeout_Set_Get() { - //Assert.Equal(TimeSpan.Parse("00:01:00"), TransactionManager.DefaultTimeout); - //Assert.Equal(TimeSpan.Parse("00:10:00"), TransactionManager.MaximumTimeout); - - TimeSpan tsDefault = TimeSpan.Parse("00:08:00"); - + TimeSpan tsDefault = TimeSpan.Parse("00:02:00"); TransactionManager.DefaultTimeout = tsDefault; - - Threading.Thread.Sleep(5000); - Assert.Equal(tsDefault, TransactionManager.DefaultTimeout); - //TimeSpan tsMax = TimeSpan.Parse("00:30:00"); - //Assert.Equal(TimeSpan.Parse("00:01:00"), TransactionManager.DefaultTimeout); - //Assert.Equal(TimeSpan.Parse("00:10:00"), TransactionManager.MaximumTimeout); - - //TransactionManager.MaximumTimeout = tsMax; - //Assert.Equal(tsMax, TransactionManager.MaximumTimeout); + TimeSpan tsMax = TimeSpan.Parse("00:30:00"); + TransactionManager.MaximumTimeout = tsMax; + Assert.Equal(tsMax, TransactionManager.MaximumTimeout); - //TimeSpan ts = TransactionManager.MaximumTimeout.Add(TimeSpan.FromMinutes(10)); - //TransactionManager.DefaultTimeout = ts; - //Assert.Equal(tsMax, TransactionManager.MaximumTimeout); - //Assert.Equal(TransactionManager.DefaultTimeout, TransactionManager.MaximumTimeout); + TimeSpan ts = TransactionManager.MaximumTimeout.Add(TimeSpan.FromMinutes(10)); + TransactionManager.DefaultTimeout = ts; + Assert.Equal(tsMax, TransactionManager.MaximumTimeout); + Assert.Equal(TransactionManager.DefaultTimeout, TransactionManager.MaximumTimeout); - //ts = TimeSpan.Parse("-00:01:00"); - //Assert.Throws(() => TransactionManager.DefaultTimeout = ts); - //Assert.Throws(() => TransactionManager.MaximumTimeout = ts); + ts = TimeSpan.Parse("-00:01:00"); + Assert.Throws(() => TransactionManager.DefaultTimeout = ts); + Assert.Throws(() => TransactionManager.MaximumTimeout = ts); } } } From b809474b3ae863517701453351021dd74c782b7b Mon Sep 17 00:00:00 2001 From: CarolWang Date: Wed, 20 Jul 2022 18:31:21 -0700 Subject: [PATCH 17/19] Re run test. --- .../tests/TransactionManagerTest.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs b/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs index c2455444b4222d..55e40af2ef8820 100644 --- a/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs +++ b/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs @@ -11,11 +11,11 @@ public class TransactionManagerTest public void DefaultTimeout_MaxTimeout_Set_Get() { TimeSpan tsDefault = TimeSpan.Parse("00:02:00"); - TransactionManager.DefaultTimeout = tsDefault; - Assert.Equal(tsDefault, TransactionManager.DefaultTimeout); - TimeSpan tsMax = TimeSpan.Parse("00:30:00"); - TransactionManager.MaximumTimeout = tsMax; + + TransactionManager.DefaultTimeout = tsDefault; + TransactionManager.MaximumTimeout = tsMax; + Assert.Equal(tsDefault, TransactionManager.DefaultTimeout); Assert.Equal(tsMax, TransactionManager.MaximumTimeout); TimeSpan ts = TransactionManager.MaximumTimeout.Add(TimeSpan.FromMinutes(10)); From 12ced01f4856d729271c5f8d7f1be9317613d936 Mon Sep 17 00:00:00 2001 From: CarolWang Date: Wed, 20 Jul 2022 23:24:11 -0700 Subject: [PATCH 18/19] update test and rebase. --- .../tests/TransactionManagerTest.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs b/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs index 55e40af2ef8820..9566901d90db8b 100644 --- a/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs +++ b/src/libraries/System.Transactions.Local/tests/TransactionManagerTest.cs @@ -11,11 +11,11 @@ public class TransactionManagerTest public void DefaultTimeout_MaxTimeout_Set_Get() { TimeSpan tsDefault = TimeSpan.Parse("00:02:00"); - TimeSpan tsMax = TimeSpan.Parse("00:30:00"); - TransactionManager.DefaultTimeout = tsDefault; + Assert.Equal(tsDefault, TransactionManager.DefaultTimeout); + + TimeSpan tsMax = TimeSpan.Parse("00:30:00"); TransactionManager.MaximumTimeout = tsMax; - Assert.Equal(tsDefault, TransactionManager.DefaultTimeout); Assert.Equal(tsMax, TransactionManager.MaximumTimeout); TimeSpan ts = TransactionManager.MaximumTimeout.Add(TimeSpan.FromMinutes(10)); From d32499e5610aae2f78285410848af9702aea2d87 Mon Sep 17 00:00:00 2001 From: CarolWang Date: Mon, 25 Jul 2022 17:52:44 -0700 Subject: [PATCH 19/19] update. --- .../src/System/Transactions/TransactionManager.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs b/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs index e556b0b07ce417..242325130d6546 100644 --- a/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs +++ b/src/libraries/System.Transactions.Local/src/System/Transactions/TransactionManager.cs @@ -374,9 +374,9 @@ public static TimeSpan MaximumTimeout LazyInitializer.EnsureInitialized(ref s_defaultTimeoutTicks, ref s_defaultTimeoutValidated, ref s_classSyncObject, () => DefaultSettingsSection.Timeout.Ticks); long defaultTimeoutTicks = 0; - Interlocked.Exchange(ref defaultTimeoutTicks, Interlocked.Read(ref s_defaultTimeoutTicks)); + defaultTimeoutTicks = Interlocked.Read(ref s_defaultTimeoutTicks); Interlocked.Exchange(ref s_defaultTimeoutTicks, ValidateTimeout(new TimeSpan(Interlocked.Read(ref s_defaultTimeoutTicks))).Ticks); - if (Interlocked.Read(ref s_defaultTimeoutTicks) != Interlocked.Read(ref defaultTimeoutTicks)) + if (Interlocked.Read(ref s_defaultTimeoutTicks) != defaultTimeoutTicks) { if (etwLog.IsEnabled()) {