diff --git a/CHANGELOG.md b/CHANGELOG.md index 4003d59..3e6cc28 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ### Changed - `HttpClientWebClient` for NET3.5 is now using User-Agent property directly +- Improved cancelation or disposal of childs when leaving an action ## 3.2.0 [Release date: 2023-12-06] [GitHub Releases](https://github.com/Dynatrace/openkit-dotnet/releases/tag/v3.2.0) diff --git a/src/Dynatrace.OpenKit/Core/Objects/BaseAction.cs b/src/Dynatrace.OpenKit/Core/Objects/BaseAction.cs index 0adc00a..e39d41b 100644 --- a/src/Dynatrace.OpenKit/Core/Objects/BaseAction.cs +++ b/src/Dynatrace.OpenKit/Core/Objects/BaseAction.cs @@ -18,6 +18,7 @@ using Dynatrace.OpenKit.Protocol; using Dynatrace.OpenKit.Util; using System; +using System.Collections.Generic; namespace Dynatrace.OpenKit.Core.Objects { @@ -376,6 +377,8 @@ public IAction CancelAction() private IAction DoLeaveAction(bool discardData) { + IList childObjects; + lock (LockObject) { if (ThisAction.IsActionLeft) @@ -385,9 +388,10 @@ private IAction DoLeaveAction(bool discardData) } isActionLeft = true; - } - var childObjects = ThisComposite.GetCopyOfChildObjects(); + childObjects = ThisComposite.GetCopyOfChildObjects(); + } + foreach (var childObject in childObjects) { if (discardData) @@ -407,7 +411,7 @@ private IAction DoLeaveAction(bool discardData) childObject.Dispose(); } } - + EndTime = Beacon.CurrentTimestamp; EndSequenceNo = Beacon.NextSequenceNumber; diff --git a/src/Dynatrace.OpenKit/Core/Objects/OpenKit.cs b/src/Dynatrace.OpenKit/Core/Objects/OpenKit.cs index 7cb99d1..210d414 100644 --- a/src/Dynatrace.OpenKit/Core/Objects/OpenKit.cs +++ b/src/Dynatrace.OpenKit/Core/Objects/OpenKit.cs @@ -15,6 +15,7 @@ // using System; +using System.Collections.Generic; using Dynatrace.OpenKit.API; using Dynatrace.OpenKit.Core.Caching; using Dynatrace.OpenKit.Core.Configuration; @@ -214,6 +215,8 @@ public void Shutdown() logger.Debug($"{GetType().Name} shutdown requested"); } + IList childObjects; + lock (lockObject) { if (isShutdown) @@ -222,10 +225,11 @@ public void Shutdown() } isShutdown = true; + + childObjects = ThisComposite.GetCopyOfChildObjects(); } // close all open children - var childObjects = ThisComposite.GetCopyOfChildObjects(); foreach (var childObject in childObjects) { childObject.Dispose(); diff --git a/src/Dynatrace.OpenKit/Core/Objects/Session.cs b/src/Dynatrace.OpenKit/Core/Objects/Session.cs index 2d0cf75..4e989d3 100644 --- a/src/Dynatrace.OpenKit/Core/Objects/Session.cs +++ b/src/Dynatrace.OpenKit/Core/Objects/Session.cs @@ -409,12 +409,18 @@ public void End(bool sendSessionEndEvent) // forcefully leave all child elements // Since the end time was set, no further child objects are added to the internal list so the following // operations are safe outside the lock block. - var childObjects = ThisComposite.GetCopyOfChildObjects(); + IList childObjects; + + lock (state) + { + childObjects = ThisComposite.GetCopyOfChildObjects(); + } + foreach (var childObject in childObjects) { childObject.Dispose(); } - + // send the end event, only if a session is explicitly ended if (sendSessionEndEvent) { diff --git a/src/Dynatrace.OpenKit/Core/Objects/SessionProxy.cs b/src/Dynatrace.OpenKit/Core/Objects/SessionProxy.cs index 9c15b13..22804c5 100644 --- a/src/Dynatrace.OpenKit/Core/Objects/SessionProxy.cs +++ b/src/Dynatrace.OpenKit/Core/Objects/SessionProxy.cs @@ -384,6 +384,8 @@ public void End() logger.Debug($"{this} End()"); } + IList childObjects; + lock (lockObject) { if (isFinished) @@ -392,9 +394,10 @@ public void End() } isFinished = true; + + childObjects = ThisComposite.GetCopyOfChildObjects(); } - var childObjects = ThisComposite.GetCopyOfChildObjects(); foreach (var childObject in childObjects) { if (childObject is ISessionInternals childSession) @@ -406,7 +409,7 @@ public void End() childObject.Dispose(); } } - + parent.OnChildClosed(this); sessionWatchdog.RemoveFromSplitByTimeout(this); }