From 2f8d857731933ba9eacd9e1b547d419bd26b53f3 Mon Sep 17 00:00:00 2001 From: Tom Gardham-Pallister Date: Thu, 3 May 2018 21:34:22 +0100 Subject: [PATCH] pass expiry period into cookie thing to make this more testable --- .../LoadBalancers/CookieStickySessions.cs | 12 ++++++------ .../LoadBalancers/LoadBalancerFactory.cs | 3 ++- .../LoadBalancer/CookieStickySessionsTests.cs | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/Ocelot/LoadBalancer/LoadBalancers/CookieStickySessions.cs b/src/Ocelot/LoadBalancer/LoadBalancers/CookieStickySessions.cs index 8721939a..6a81aedd 100644 --- a/src/Ocelot/LoadBalancer/LoadBalancers/CookieStickySessions.cs +++ b/src/Ocelot/LoadBalancer/LoadBalancers/CookieStickySessions.cs @@ -12,17 +12,17 @@ namespace Ocelot.LoadBalancer.LoadBalancers public class CookieStickySessions : ILoadBalancer, IDisposable { - private readonly int _expiryInMs; + private readonly int _keyExpiryInMs; private readonly string _key; private readonly ILoadBalancer _loadBalancer; private readonly ConcurrentDictionary _stored; private readonly Timer _timer; private bool _expiring; - public CookieStickySessions(ILoadBalancer loadBalancer, string key, int expiryInMs) + public CookieStickySessions(ILoadBalancer loadBalancer, string key, int keyExpiryInMs, int expiryPeriodInMs) { _key = key; - _expiryInMs = expiryInMs; + _keyExpiryInMs = keyExpiryInMs; _loadBalancer = loadBalancer; _stored = new ConcurrentDictionary(); _timer = new Timer(x => @@ -37,7 +37,7 @@ namespace Ocelot.LoadBalancer.LoadBalancers Expire(); _expiring = false; - }, null, 0, 50); + }, null, 0, expiryPeriodInMs); } public void Dispose() @@ -53,7 +53,7 @@ namespace Ocelot.LoadBalancer.LoadBalancers { var cached = _stored[value]; - var updated = new StickySession(cached.HostAndPort, DateTime.UtcNow.AddMilliseconds(_expiryInMs)); + var updated = new StickySession(cached.HostAndPort, DateTime.UtcNow.AddMilliseconds(_keyExpiryInMs)); _stored[value] = updated; @@ -69,7 +69,7 @@ namespace Ocelot.LoadBalancer.LoadBalancers if (!string.IsNullOrEmpty(value) && !_stored.ContainsKey(value)) { - _stored[value] = new StickySession(next.Data, DateTime.UtcNow.AddMilliseconds(_expiryInMs)); + _stored[value] = new StickySession(next.Data, DateTime.UtcNow.AddMilliseconds(_keyExpiryInMs)); } return new OkResponse(next.Data); diff --git a/src/Ocelot/LoadBalancer/LoadBalancers/LoadBalancerFactory.cs b/src/Ocelot/LoadBalancer/LoadBalancers/LoadBalancerFactory.cs index 1f0ecc72..47b4537d 100644 --- a/src/Ocelot/LoadBalancer/LoadBalancers/LoadBalancerFactory.cs +++ b/src/Ocelot/LoadBalancer/LoadBalancers/LoadBalancerFactory.cs @@ -7,6 +7,7 @@ namespace Ocelot.LoadBalancer.LoadBalancers public class LoadBalancerFactory : ILoadBalancerFactory { private readonly IServiceDiscoveryProviderFactory _serviceProviderFactory; + private const int ExpiryPeriodInMs = 50; public LoadBalancerFactory(IServiceDiscoveryProviderFactory serviceProviderFactory) { @@ -25,7 +26,7 @@ namespace Ocelot.LoadBalancer.LoadBalancers return new LeastConnection(async () => await serviceProvider.Get(), reRoute.ServiceName); case nameof(CookieStickySessions): var loadBalancer = new RoundRobin(async () => await serviceProvider.Get()); - return new CookieStickySessions(loadBalancer, reRoute.LoadBalancerOptions.Key, reRoute.LoadBalancerOptions.ExpiryInMs); + return new CookieStickySessions(loadBalancer, reRoute.LoadBalancerOptions.Key, reRoute.LoadBalancerOptions.ExpiryInMs, ExpiryPeriodInMs); default: return new NoLoadBalancer(await serviceProvider.Get()); } diff --git a/test/Ocelot.UnitTests/LoadBalancer/CookieStickySessionsTests.cs b/test/Ocelot.UnitTests/LoadBalancer/CookieStickySessionsTests.cs index b81ca32e..e1bb15b9 100644 --- a/test/Ocelot.UnitTests/LoadBalancer/CookieStickySessionsTests.cs +++ b/test/Ocelot.UnitTests/LoadBalancer/CookieStickySessionsTests.cs @@ -28,7 +28,7 @@ namespace Ocelot.UnitTests.LoadBalancer { _loadBalancer = new Mock(); const int defaultExpiryInMs = 100; - _stickySessions = new CookieStickySessions(_loadBalancer.Object, "sessionid", defaultExpiryInMs); + _stickySessions = new CookieStickySessions(_loadBalancer.Object, "sessionid", defaultExpiryInMs, 1); _downstreamContext = new DownstreamContext(new DefaultHttpContext()); }