From 34f59f14107c626e77726457211f4802c3a3f834 Mon Sep 17 00:00:00 2001 From: Andrew Welker Date: Wed, 19 Feb 2025 11:06:56 -0600 Subject: [PATCH] fix: move ReleaseRoute & RunRouteRequests to use a queue --- .../Routing/Extensions.cs | 32 ++++++++------- .../Routing/RouteRequestQueueItem.cs | 39 +++++++++++++++++++ 2 files changed, 58 insertions(+), 13 deletions(-) create mode 100644 src/PepperDash.Essentials.Core/Routing/RouteRequestQueueItem.cs diff --git a/src/PepperDash.Essentials.Core/Routing/Extensions.cs b/src/PepperDash.Essentials.Core/Routing/Extensions.cs index ee885abf..e3ba0a74 100644 --- a/src/PepperDash.Essentials.Core/Routing/Extensions.cs +++ b/src/PepperDash.Essentials.Core/Routing/Extensions.cs @@ -1,4 +1,6 @@ -using Serilog.Events; +using PepperDash.Essentials.Core.Queues; +using PepperDash.Essentials.Core.Routing; +using Serilog.Events; using System; using System.Collections.Generic; using System.Diagnostics; @@ -17,6 +19,8 @@ namespace PepperDash.Essentials.Core { private static readonly Dictionary RouteRequests = new Dictionary(); + private static readonly GenericQueue routeRequestQueue = new GenericQueue("routingQueue"); + /// /// Gets any existing RouteDescriptor for a destination, clears it using ReleaseRoute /// and then attempts a new Route and if sucessful, stores that RouteDescriptor @@ -33,6 +37,15 @@ namespace PepperDash.Essentials.Core ReleaseAndMakeRoute(destination, source, signalType, inputPort, outputPort); } + public static void ReleaseRoute(this IRoutingInputs destination) + { + routeRequestQueue.Enqueue(new ReleaseRouteQueueItem(ReleaseRouteInternal, destination, string.Empty)); + } + + public static void ReleaseRoute(this IRoutingInputs destination, string inputPortKey) + { + routeRequestQueue.Enqueue(new ReleaseRouteQueueItem(ReleaseRouteInternal, destination, inputPortKey)); + } public static void RemoveRouteRequestForDestination(string destinationKey) { @@ -59,9 +72,7 @@ namespace PepperDash.Essentials.Core Source = source, SourcePort = sourcePort, SignalType = signalType - }; - - + }; var coolingDevice = destination as IWarmingCooling; @@ -101,9 +112,9 @@ namespace PepperDash.Essentials.Core Debug.LogMessage(LogEventLevel.Information, "Device: {destination} is NOT cooling down. Removing stored route request and routing to source key: {sourceKey}", null, destination.Key, routeRequest.Source.Key); } - destination.ReleaseRoute(destinationPort?.Key ?? string.Empty); + routeRequestQueue.Enqueue(new ReleaseRouteQueueItem(ReleaseRouteInternal, destination,destinationPort?.Key ?? string.Empty)); - RunRouteRequest(routeRequest); + routeRequestQueue.Enqueue(new RouteRequestQueueItem(RunRouteRequest, routeRequest)); } private static void RunRouteRequest(RouteRequest request) @@ -133,19 +144,14 @@ namespace PepperDash.Essentials.Core { Debug.LogMessage(ex, "Exception Running Route Request {request}", null, request); } - } - - public static void ReleaseRoute(this IRoutingInputs destination) - { - ReleaseRoute(destination, string.Empty); - } + } /// /// Will release the existing route on the destination, if it is found in /// RouteDescriptorCollection.DefaultCollection /// /// - public static void ReleaseRoute(this IRoutingInputs destination, string inputPortKey) + private static void ReleaseRouteInternal(IRoutingInputs destination, string inputPortKey) { try { diff --git a/src/PepperDash.Essentials.Core/Routing/RouteRequestQueueItem.cs b/src/PepperDash.Essentials.Core/Routing/RouteRequestQueueItem.cs new file mode 100644 index 00000000..3c923eb6 --- /dev/null +++ b/src/PepperDash.Essentials.Core/Routing/RouteRequestQueueItem.cs @@ -0,0 +1,39 @@ +using PepperDash.Essentials.Core.Queues; +using System; + +namespace PepperDash.Essentials.Core.Routing +{ + public class RouteRequestQueueItem : IQueueMessage + { + private readonly Action action; + private readonly RouteRequest routeRequest; + + public RouteRequestQueueItem(Action routeAction, RouteRequest request) + { + action = routeAction; + routeRequest = request; + } + + public void Dispatch() + { + action(routeRequest); + } + } + + public class ReleaseRouteQueueItem: IQueueMessage + { + private readonly Action action; + private readonly IRoutingInputs destination; + private readonly string inputPortKey; + + public ReleaseRouteQueueItem(Action action, IRoutingInputs destination, string inputPortKey) + { + this.action = action; + this.destination = destination; + this.inputPortKey = inputPortKey; + } + + public void Dispatch() { + action(destination, inputPortKey); + } +}