Skip to content

Commit 076ee44

Browse files
ReubenBondCopilot
andcommitted
fix: include active local silo in manifest
Synchronously add the local silo manifest when advancing to a membership version where the local silo is active. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent eb2a06c commit 076ee44

2 files changed

Lines changed: 42 additions & 6 deletions

File tree

src/Orleans.Runtime/Manifest/ClusterManifestProvider.cs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ namespace Orleans.Runtime.Metadata
1616
{
1717
internal partial class ClusterManifestProvider : IClusterManifestProvider, IAsyncDisposable, IDisposable, ILifecycleParticipant<ISiloLifecycle>
1818
{
19+
private readonly SiloAddress _localSiloAddress;
1920
private readonly ILogger<ClusterManifestProvider> _logger;
2021
private readonly IServiceProvider _services;
2122
private readonly IClusterMembershipService _clusterMembershipService;
@@ -32,12 +33,14 @@ internal partial class ClusterManifestProvider : IClusterManifestProvider, IAsyn
3233
private Task? _runTask;
3334

3435
public ClusterManifestProvider(
36+
ILocalSiloDetails localSiloDetails,
3537
SiloManifestProvider siloManifestProvider,
3638
IClusterMembershipService clusterMembershipService,
3739
IFatalErrorHandler fatalErrorHandler,
3840
ILogger<ClusterManifestProvider> logger,
3941
IServiceProvider services)
4042
{
43+
_localSiloAddress = localSiloDetails.SiloAddress;
4144
_logger = logger;
4245
_services = services;
4346
_clusterMembershipService = clusterMembershipService;
@@ -52,13 +55,13 @@ public ClusterManifestProvider(
5255
onPublished: update => Interlocked.Exchange(ref _current, update));
5356
}
5457

55-
public ClusterManifest Current => EnsureCurrentManifestVersion(_clusterMembershipService.CurrentSnapshot);
58+
public ClusterManifest Current => EnsureValidManifestForCurrentMembership(_clusterMembershipService.CurrentSnapshot);
5659

5760
public IAsyncEnumerable<ClusterManifest> Updates => _updates;
5861

5962
public GrainManifest LocalGrainManifest { get; }
6063

61-
private ClusterManifest EnsureCurrentManifestVersion(ClusterMembershipSnapshot clusterMembership)
64+
private ClusterManifest EnsureValidManifestForCurrentMembership(ClusterMembershipSnapshot clusterMembership)
6265
{
6366
var current = _current;
6467
var membershipVersion = clusterMembership.Version.Value;
@@ -76,6 +79,12 @@ private ClusterManifest EnsureCurrentManifestVersion(ClusterMembershipSnapshot c
7679
}
7780

7881
var synchronizedSilos = RemoveNonActiveSilos(current.Silos, clusterMembership);
82+
if (clusterMembership.GetSiloStatus(_localSiloAddress) == SiloStatus.Active
83+
&& !synchronizedSilos.ContainsKey(_localSiloAddress))
84+
{
85+
synchronizedSilos = synchronizedSilos.Add(_localSiloAddress, LocalGrainManifest);
86+
}
87+
7988
var version = new MajorMinorVersion(membershipVersion, 0);
8089
var updated = CreateClusterManifest(version, synchronizedSilos);
8190
TryPublishManifest(updated);
@@ -147,7 +156,7 @@ private async Task ProcessMembershipUpdates()
147156

148157
private async Task<bool> UpdateManifest(ClusterMembershipSnapshot clusterMembership)
149158
{
150-
var existingManifest = EnsureCurrentManifestVersion(clusterMembership);
159+
var existingManifest = EnsureValidManifestForCurrentMembership(clusterMembership);
151160
if (existingManifest.Version.Major > clusterMembership.Version.Value)
152161
{
153162
return true;

test/Orleans.Core.Tests/Manifest/ClusterManifestProviderTests.cs

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,29 @@ public void Current_WhenLocalSiloIsNotActive_ResolvesTypeFromLocalManifest()
5353
Assert.Equal(TestGrainType, typeResolver.GetGrainType(TestInterfaceType));
5454
}
5555

56+
[Fact]
57+
public void Current_WhenLocalSiloBecomesActive_IncludesLocalManifestSynchronously()
58+
{
59+
var localSilo = CreateSiloAddress(11111, 1);
60+
using var membership = new TestClusterMembershipService(CreateMembershipSnapshot(
61+
1,
62+
(localSilo, SiloStatus.Created)));
63+
var grainFactory = CreateGrainFactory(CreateSiloAddress(11112, 1), CreateGrainManifest());
64+
var provider = CreateClusterManifestProvider(localSilo, membership, grainFactory);
65+
66+
Assert.DoesNotContain(localSilo, provider.Current.Silos.Keys);
67+
68+
membership.Update(CreateMembershipSnapshot(
69+
2,
70+
(localSilo, SiloStatus.Active)));
71+
72+
var current = provider.Current;
73+
74+
Assert.Equal(new MajorMinorVersion(2, 0), current.Version);
75+
Assert.Contains(localSilo, current.Silos.Keys);
76+
Assert.Contains(provider.LocalGrainManifest, current.AllGrainManifests);
77+
}
78+
5679
[Fact]
5780
public async Task Current_WhenMembershipVersionAdvances_PrunesNonActiveSilosAtFirstMinorVersion()
5881
{
@@ -91,7 +114,7 @@ public async Task Current_WhenMembershipVersionAdvances_PrunesNonActiveSilosAtFi
91114
}
92115

93116
[Fact]
94-
public async Task Current_WhenRemoteSiloBecomesActive_PublishesPrunedManifestBeforeRemoteFetch()
117+
public async Task Current_WhenRemoteSiloBecomesActive_IncludesLocalManifestBeforeRemoteFetch()
95118
{
96119
var localSilo = CreateSiloAddress(11111, 1);
97120
var remoteSilo = CreateSiloAddress(11112, 1);
@@ -105,7 +128,7 @@ public async Task Current_WhenRemoteSiloBecomesActive_PublishesPrunedManifestBef
105128

106129
var current = provider.Current;
107130
Assert.Equal(new MajorMinorVersion(1, 0), current.Version);
108-
Assert.DoesNotContain(localSilo, current.Silos.Keys);
131+
Assert.Contains(localSilo, current.Silos.Keys);
109132
Assert.DoesNotContain(remoteSilo, current.Silos.Keys);
110133
Assert.Contains(provider.LocalGrainManifest, current.AllGrainManifests);
111134

@@ -116,7 +139,7 @@ public async Task Current_WhenRemoteSiloBecomesActive_PublishesPrunedManifestBef
116139

117140
var pruned = provider.Current;
118141
Assert.Equal(new MajorMinorVersion(2, 0), pruned.Version);
119-
Assert.DoesNotContain(localSilo, pruned.Silos.Keys);
142+
Assert.Contains(localSilo, pruned.Silos.Keys);
120143
Assert.DoesNotContain(remoteSilo, pruned.Silos.Keys);
121144

122145
var lifecycle = await StartAsync(provider);
@@ -183,7 +206,11 @@ private static ClusterManifestProvider CreateClusterManifestProvider(
183206
.AddSingleton(grainFactory)
184207
.BuildServiceProvider();
185208

209+
var localSiloDetails = Substitute.For<ILocalSiloDetails>();
210+
localSiloDetails.SiloAddress.Returns(localSilo);
211+
186212
return new ClusterManifestProvider(
213+
localSiloDetails,
187214
siloManifestProvider,
188215
membership,
189216
Substitute.For<IFatalErrorHandler>(),

0 commit comments

Comments
 (0)