Skip to content

Commit 7fed437

Browse files
committed
Fixing leadership
1 parent 8b014b3 commit 7fed437

3 files changed

Lines changed: 31 additions & 6 deletions

File tree

src/CondenserDotNet.Client/Leadership/LeaderRegistry.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ namespace CondenserDotNet.Client.Leadership
77
public class LeaderRegistry : ILeaderRegistry
88
{
99
private readonly IServiceManager _serviceManager;
10-
private readonly Dictionary<string, LeaderWatcherNew> _leaderWatchers = new Dictionary<string, LeaderWatcherNew>(StringComparer.OrdinalIgnoreCase);
10+
private readonly Dictionary<string, LeaderWatcher> _leaderWatchers = new Dictionary<string, LeaderWatcher>(StringComparer.OrdinalIgnoreCase);
1111

1212
public LeaderRegistry(IServiceManager serviceManager) => _serviceManager = serviceManager;
1313

@@ -23,7 +23,7 @@ public async Task<ILeaderWatcher> GetLeaderWatcherAsync(string keyForLeadership)
2323
{
2424
if (!_leaderWatchers.TryGetValue(keyForLeadership, out var returnValue))
2525
{
26-
returnValue = new LeaderWatcherNew(_serviceManager, keyForLeadership);
26+
returnValue = new LeaderWatcher(_serviceManager, keyForLeadership);
2727
_leaderWatchers[keyForLeadership] = returnValue;
2828
}
2929
return returnValue;

src/CondenserDotNet.Client/Leadership/LeaderWatcherNew.cs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
namespace CondenserDotNet.Client.Leadership
1414
{
15-
public class LeaderWatcherNew : ILeaderWatcher
15+
public class LeaderWatcher : ILeaderWatcher
1616
{
1717
private readonly AsyncManualResetEvent<bool> _electedLeaderEvent = new AsyncManualResetEvent<bool>();
1818
private Action<InformationService> _callback;
@@ -23,8 +23,10 @@ public class LeaderWatcherNew : ILeaderWatcher
2323
private string _keyToWatch;
2424
private AsyncManualResetEvent<InformationService> _currentInfoService = new AsyncManualResetEvent<InformationService>();
2525

26-
public LeaderWatcherNew(IServiceManager serviceManager, string keyToWatch)
26+
public LeaderWatcher(IServiceManager serviceManager, string keyToWatch)
2727
{
28+
_currentInfoService.Reset();
29+
_electedLeaderEvent.Reset();
2830
_keyToWatch = keyToWatch;
2931
_serviceManager = serviceManager;
3032
_sessionIdTask = GetSession();
@@ -92,7 +94,7 @@ private async Task KeepLeadershipLoop()
9294
}
9395
else
9496
{
95-
_electedLeaderEvent.Set(false);
97+
_electedLeaderEvent.Reset();
9698
}
9799
await WaitForLeadershipChange();
98100
}
@@ -105,6 +107,13 @@ private async Task WaitForLeadershipChange()
105107
var leaderResult = await _serviceManager.Client.GetAsync($"{KeyPath}{_keyToWatch}?index={_consulIndex}");
106108
if(!leaderResult.IsSuccessStatusCode)
107109
{
110+
//Lock deleted
111+
if(leaderResult.StatusCode == System.Net.HttpStatusCode.NotFound)
112+
{
113+
_electedLeaderEvent.Reset();
114+
_currentInfoService.Reset();
115+
return;
116+
}
108117
await Task.Delay(500);
109118
continue;
110119
}

test/Condenser.Tests.Integration/LeadershipFacts.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,21 @@ public async Task TestGetLeadership()
8383
}
8484
}
8585

86+
//[Fact]
87+
//public async Task TestHoldingLeadershipForAWhile()
88+
//{
89+
// using (var manager = GetConfig("Service1"))
90+
// {
91+
// manager.AddTtlHealthCheck(100);
92+
// var registerResult = await manager.RegisterServiceAsync();
93+
// var ttlResult = await manager.TtlCheck.ReportPassingAsync();
94+
// var leaderRegistry = new LeaderRegistry(manager);
95+
// var watcher = await leaderRegistry.GetLeaderWatcherAsync(leadershipKey);
96+
// await watcher.GetLeadershipAsync();
97+
// await Task.Delay(50000);
98+
// }
99+
//}
100+
86101
[Fact]
87102
public async Task TestLeadershipFailOver()
88103
{
@@ -116,7 +131,8 @@ public async Task TestLeadershipFailOver()
116131
await manager.TtlCheck.ReportFailAsync();
117132

118133
//Now we wait, the leadership should fall over
119-
Assert.True(resetEvent.WaitOne(5000));
134+
var waitResult = resetEvent.WaitOne(5000);
135+
Assert.True(waitResult);
120136

121137
//Now check that service 2 is the leader
122138
var leader = await watcher2.GetCurrentLeaderAsync();

0 commit comments

Comments
 (0)