From 8e9bb592eadc1dc563d593cce4d899f16ba3bf0c Mon Sep 17 00:00:00 2001 From: Ahmed Zamil Date: Thu, 11 Jul 2024 11:37:43 +0300 Subject: [PATCH 1/2] package update --- Esiur/Esiur.csproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Esiur/Esiur.csproj b/Esiur/Esiur.csproj index 5d2fd79..5c3f370 100644 --- a/Esiur/Esiur.csproj +++ b/Esiur/Esiur.csproj @@ -63,7 +63,7 @@ - + @@ -74,10 +74,10 @@ - + - + From f0fff9224f867fb57e2facf8dd2e3604a3d416b8 Mon Sep 17 00:00:00 2001 From: Ahmed Zamil Date: Tue, 16 Jul 2024 09:59:23 +0300 Subject: [PATCH 2/2] deal lock avoidance --- Esiur/Esiur.csproj | 2 +- Esiur/Net/IIP/DistributedConnection.cs | 2 +- .../Net/IIP/DistributedConnectionProtocol.cs | 23 +++++++++++++------ .../DistributedResourceAttachRequestInfo.cs | 20 ++++++++++++++++ 4 files changed, 38 insertions(+), 9 deletions(-) create mode 100644 Esiur/Net/IIP/DistributedResourceAttachRequestInfo.cs diff --git a/Esiur/Esiur.csproj b/Esiur/Esiur.csproj index 5c3f370..d110b1c 100644 --- a/Esiur/Esiur.csproj +++ b/Esiur/Esiur.csproj @@ -5,7 +5,7 @@ Ahmed Kh. Zamil http://www.esiur.com true - 2.4.3 + 2.4.4 https://github.com/esiur/esiur-dotnet Ahmed Kh. Zamil diff --git a/Esiur/Net/IIP/DistributedConnection.cs b/Esiur/Net/IIP/DistributedConnection.cs index e240a94..f913fd1 100644 --- a/Esiur/Net/IIP/DistributedConnection.cs +++ b/Esiur/Net/IIP/DistributedConnection.cs @@ -1817,7 +1817,7 @@ public partial class DistributedConnection : NetworkConnection, IStore { try { - x.TriggerError(new AsyncException(ErrorType.Management, 0, "Connection closed")); + x.Reply.TriggerError(new AsyncException(ErrorType.Management, 0, "Connection closed")); } catch (Exception ex) { diff --git a/Esiur/Net/IIP/DistributedConnectionProtocol.cs b/Esiur/Net/IIP/DistributedConnectionProtocol.cs index 68fc35b..41b0cc1 100644 --- a/Esiur/Net/IIP/DistributedConnectionProtocol.cs +++ b/Esiur/Net/IIP/DistributedConnectionProtocol.cs @@ -48,7 +48,7 @@ partial class DistributedConnection KeyList> attachedResources = new KeyList>(); KeyList> suspendedResources = new KeyList>(); - KeyList> resourceRequests = new KeyList>(); + KeyList resourceRequests = new KeyList(); KeyList> templateRequests = new KeyList>(); KeyList> templateByNameRequests = new KeyList>(); @@ -2249,14 +2249,24 @@ partial class DistributedConnection resource = neededResources[id]; - var request = resourceRequests[id]; + var requestInfo = resourceRequests[id]; - if (request != null) + if (requestInfo != null) { if (resource != null && (requestSequence?.Contains(id) ?? false)) + { + // dead lock avoidance for loop reference. return new AsyncReply(resource); + } + else if (resource != null && requestInfo.RequestSequence.Contains(id)) + { + // dead lock avoidance for dependent reference. + return new AsyncReply(resource); + } else - return request; + { + return requestInfo.Reply; + } } else if (resource != null && !resource.DistributedResourceSuspended) { @@ -2266,11 +2276,10 @@ partial class DistributedConnection } + var newSequence = requestSequence != null ? requestSequence.Concat(new uint[] { id }).ToArray() : new uint[] { id }; var reply = new AsyncReply(); - resourceRequests.Add(id, reply); - - var newSequence = requestSequence != null ? requestSequence.Concat(new uint[] { id }).ToArray() : new uint[] { id }; + resourceRequests.Add(id, new DistributedResourceAttachRequestInfo(reply, newSequence)); SendRequest(IIPPacketAction.AttachResource) .AddUInt32(id) diff --git a/Esiur/Net/IIP/DistributedResourceAttachRequestInfo.cs b/Esiur/Net/IIP/DistributedResourceAttachRequestInfo.cs new file mode 100644 index 0000000..164efb9 --- /dev/null +++ b/Esiur/Net/IIP/DistributedResourceAttachRequestInfo.cs @@ -0,0 +1,20 @@ +using Esiur.Core; +using Esiur.Resource; +using System; +using System.Collections.Generic; +using System.Text; + +namespace Esiur.Net.IIP +{ + internal class DistributedResourceAttachRequestInfo + { + public AsyncReply Reply { get; set; } + public uint[] RequestSequence { get; set; } + + public DistributedResourceAttachRequestInfo(AsyncReply reply, uint[] requestSequence) + { + Reply = reply; + RequestSequence = requestSequence; + } + } +}