From 887ee5160c7894dadf3806aed4d365b911d655d3 Mon Sep 17 00:00:00 2001 From: Jared Date: Thu, 26 Oct 2017 11:23:51 -0700 Subject: [PATCH] Correct issue where multiple applications on the same client machine that don't share local cache were ignoring update and delete subscriber actions. --- source/DoubleCache/Redis/RedisPublisher.cs | 9 ++++++--- source/DoubleCache/Redis/RedisSubscriber.cs | 2 +- source/DoubleCacheTests/PublisherTests.cs | 6 ++++-- source/DoubleCacheTests/RedisSubscriberTests.cs | 8 +++++--- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/source/DoubleCache/Redis/RedisPublisher.cs b/source/DoubleCache/Redis/RedisPublisher.cs index 3b6ceed..4b2f0e8 100644 --- a/source/DoubleCache/Redis/RedisPublisher.cs +++ b/source/DoubleCache/Redis/RedisPublisher.cs @@ -9,16 +9,18 @@ public class RedisPublisher : ICachePublisher { private IConnectionMultiplexer _connection; private IItemSerializer _itemSerializer; + private string _clientName; public RedisPublisher(IConnectionMultiplexer connection, IItemSerializer itemSerializer) { _connection = connection; _itemSerializer = itemSerializer; + _clientName = connection.ClientName + "." + System.AppDomain.CurrentDomain.FriendlyName; } public void NotifyUpdate(string key, string type) { - var data = _itemSerializer.Serialize(new CacheUpdateNotificationArgs { Key = key, Type = type, ClientName = _connection.ClientName }); + var data = _itemSerializer.Serialize(new CacheUpdateNotificationArgs { Key = key, Type = type, ClientName = _clientName }); _connection.GetSubscriber().Publish( "cacheUpdate", data, @@ -30,7 +32,7 @@ public void NotifyUpdate(string key, string type, TimeSpan? specificTimeToLive) var data = _itemSerializer.Serialize(new CacheUpdateNotificationArgs { Key = key, Type = type, - ClientName = _connection.ClientName, + ClientName = _clientName, SpecificTimeToLive = new TimeToLive(specificTimeToLive)}); _connection.GetSubscriber().Publish( @@ -43,7 +45,8 @@ public void NotifyDelete(string key) { var data = _itemSerializer.Serialize(new CacheUpdateNotificationArgs { Key = key, - ClientName = _connection.ClientName}); + ClientName = _clientName + }); _connection.GetSubscriber().Publish( "cacheDelete", data, diff --git a/source/DoubleCache/Redis/RedisSubscriber.cs b/source/DoubleCache/Redis/RedisSubscriber.cs index 8a50fe9..f649a76 100644 --- a/source/DoubleCache/Redis/RedisSubscriber.cs +++ b/source/DoubleCache/Redis/RedisSubscriber.cs @@ -21,7 +21,7 @@ public RedisSubscriber(IConnectionMultiplexer connection, ICacheAside remoteCach connection.GetSubscriber().Subscribe("cacheDelete", CacheDeleted); _remoteCache = remoteCache; _itemSerializer = itemSerializer; - _clientName = connection.ClientName; + _clientName = connection.ClientName + "." + System.AppDomain.CurrentDomain.FriendlyName; } private void CacheUpdated(RedisChannel channel, RedisValue message) diff --git a/source/DoubleCacheTests/PublisherTests.cs b/source/DoubleCacheTests/PublisherTests.cs index 3b77427..148191f 100644 --- a/source/DoubleCacheTests/PublisherTests.cs +++ b/source/DoubleCacheTests/PublisherTests.cs @@ -13,6 +13,7 @@ public class PublisherTests private IConnectionMultiplexer _connection; private IItemSerializer _serializer; private ISubscriber _subscriber; + private string _expectedClientName; private ICachePublisher publisher; @@ -21,6 +22,7 @@ public PublisherTests() _connection = A.Fake(); _serializer = A.Fake(); _subscriber = A.Fake(); + _expectedClientName = "C." + System.AppDomain.CurrentDomain.FriendlyName; A.CallTo(() => _connection.GetSubscriber(null)).Returns(_subscriber); A.CallTo(() => _connection.ClientName).Returns("C"); @@ -35,7 +37,7 @@ public void PublishUpdate_SerializerCalled() publisher.NotifyUpdate("A", "B"); A.CallTo(() => _serializer.Serialize( - A.That.Matches(args => args.Key == "A" && args.Type == "B" && args.ClientName == "C"))) + A.That.Matches(args => args.Key == "A" && args.Type == "B" && args.ClientName == _expectedClientName))) .MustHaveHappened(Repeated.Exactly.Once); } @@ -45,7 +47,7 @@ public void PublishDelete_SerializerCalled() publisher.NotifyDelete("A"); A.CallTo(() => _serializer.Serialize( - A.That.Matches(args => args.Key == "A" && args.ClientName == "C"))) + A.That.Matches(args => args.Key == "A" && args.ClientName == _expectedClientName))) .MustHaveHappened(Repeated.Exactly.Once); } diff --git a/source/DoubleCacheTests/RedisSubscriberTests.cs b/source/DoubleCacheTests/RedisSubscriberTests.cs index b18e3d2..c3f4d37 100644 --- a/source/DoubleCacheTests/RedisSubscriberTests.cs +++ b/source/DoubleCacheTests/RedisSubscriberTests.cs @@ -16,12 +16,14 @@ public class RedisSubscriberTests private ICacheAside _remoteCache; private IItemSerializer _itemSerializer; private IConnectionMultiplexer _connection; + private string _expectedClientName; public RedisSubscriberTests() { _subscriber = A.Fake(); _remoteCache = A.Fake(); _itemSerializer = A.Fake(); + _expectedClientName = "A." + System.AppDomain.CurrentDomain.FriendlyName; _connection = A.Fake(); A.CallTo(() => _connection.GetSubscriber(A._)).Returns(_subscriber); @@ -86,7 +88,7 @@ public void OnMessage_EventTriggered(string channelName) var eventHandler = A.Fake>(); - A.CallTo(() => _itemSerializer.Deserialize(A._)).Returns(new CacheUpdateNotificationArgs() { ClientName ="A" }); + A.CallTo(() => _itemSerializer.Deserialize(A._)).Returns(new CacheUpdateNotificationArgs() { ClientName = _expectedClientName }); var cacheSubscriber = new RedisSubscriber(_connection, _remoteCache, _itemSerializer); @@ -101,7 +103,7 @@ public void OnMessage_EventTriggered(string channelName) [Theory] [InlineData("cacheUpdate")] [InlineData("cacheDelete")] - public void OnMessage_SameClientName_EventNotTriggered(string channelName) + public void OnMessage_SameClientNameSameApplicationName_EventNotTriggered(string channelName) { Action method = null; @@ -113,7 +115,7 @@ public void OnMessage_SameClientName_EventNotTriggered(string channelName) var eventHandler = A.Fake>(); - A.CallTo(() => _itemSerializer.Deserialize(A._)).Returns(new CacheUpdateNotificationArgs() { ClientName = "A" }); + A.CallTo(() => _itemSerializer.Deserialize(A._)).Returns(new CacheUpdateNotificationArgs() { ClientName = _expectedClientName }); var cacheSubscriber = new RedisSubscriber(_connection, _remoteCache, _itemSerializer);