Skip to content
This repository was archived by the owner on Jul 9, 2023. It is now read-only.

Commit 948ef97

Browse files
Fix for UpdateIAmAlive in CosmosDBMembershipTable.cs (#51)
* UpdateIAmAlive was throwing an exception as the MembershipEntry being passed in from Orleans only contained SiloAddress and IAmAliveTime. The code now reads the existing state from Cosmos Db, updates IAmAliveTime and writes it back. From what I can see, this is what UpdateIAmAlive.js used to do. * Fix IAmAlive Co-authored-by: Nick Barrett <[email protected]>
1 parent b75c91c commit 948ef97

File tree

13 files changed

+70
-74
lines changed

13 files changed

+70
-74
lines changed

.github/workflows/ci.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ jobs:
1515
- name: Setup .NET Core
1616
uses: actions/setup-dotnet@v1
1717
with:
18-
dotnet-version: 3.1.100
18+
dotnet-version: 5.0.301
1919
# - name: Azure Cosmos Emulator
2020
# uses: galvesribeiro/[email protected]
2121
# - name: Start CosmosDB Emulator

.github/workflows/publish.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ jobs:
1515
- name: Setup .NET Core
1616
uses: actions/setup-dotnet@v1
1717
with:
18-
dotnet-version: 3.1.100
18+
dotnet-version: 5.0.301
1919
- name: Pack
2020
working-directory: src/Orleans.Clustering.CosmosDB
2121
run: dotnet pack --configuration Release -p:Version=${GITHUB_REF##*/v}

Orleans.CosmosDB.sln

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
Microsoft Visual Studio Solution File, Format Version 12.00
3-
# Visual Studio 15
4-
VisualStudioVersion = 15.0.27130.2036
3+
# Visual Studio Version 16
4+
VisualStudioVersion = 16.0.31320.298
55
MinimumVisualStudioVersion = 15.0.26124.0
66
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{12BE367B-569F-4C2E-AC15-876709C119D1}"
77
EndProject
@@ -12,7 +12,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
1212
.editorconfig = .editorconfig
1313
.gitignore = .gitignore
1414
src\AssemblyInfo.cs = src\AssemblyInfo.cs
15-
.circleci\config.yml = .circleci\config.yml
15+
.github\workflows\ci.yml = .github\workflows\ci.yml
16+
global.json = global.json
17+
.github\workflows\publish.yml = .github\workflows\publish.yml
1618
README.md = README.md
1719
README.Nuget.md = README.Nuget.md
1820
EndProjectSection
@@ -25,7 +27,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Orleans.Persistence.CosmosD
2527
EndProject
2628
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Orleans.Reminders.CosmosDB", "src\Orleans.Reminders.CosmosDB\Orleans.Reminders.CosmosDB.csproj", "{E82D600B-2C44-4458-AB68-BCC25DE16631}"
2729
EndProject
28-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Orleans.Streaming.CosmosDB", "src\Orleans.Streaming.CosmosDB\Orleans.Streaming.CosmosDB.csproj", "{97AC434A-A072-44E4-B8F3-CCFD87A94F08}"
30+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Orleans.Streaming.CosmosDB", "src\Orleans.Streaming.CosmosDB\Orleans.Streaming.CosmosDB.csproj", "{97AC434A-A072-44E4-B8F3-CCFD87A94F08}"
2931
EndProject
3032
Global
3133
GlobalSection(SolutionConfigurationPlatforms) = preSolution

global.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
22
"sdk": {
3-
"version": "3.1.100"
3+
"version": "5.0.301"
44
}
55
}

src/Orleans.Clustering.CosmosDB/CosmosDBMembershipTable.cs

+34-3
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ internal class CosmosDBMembershipTable : IMembershipTable
2626

2727
private CosmosClient _cosmos;
2828
private Container _container;
29+
private ItemResponse<SiloEntity> _selfRow;
2930

3031
public CosmosDBMembershipTable(ILoggerFactory loggerFactory, IOptions<ClusterOptions> clusterOptions, IOptions<CosmosDBClusteringOptions> clusteringOptions)
3132
{
@@ -228,11 +229,41 @@ public async Task<MembershipTableData> ReadRow(SiloAddress key)
228229

229230
}
230231

231-
public Task UpdateIAmAlive(MembershipEntry entry)
232+
public async Task UpdateIAmAlive(MembershipEntry entry)
232233
{
233-
var siloEntity = ConvertToEntity(entry, this._clusterOptions.ClusterId);
234+
var siloEntityId = ConstructSiloEntityId(entry.SiloAddress);
234235

235-
return this._container.ReplaceItemAsync(siloEntity, siloEntity.Id, new PartitionKey(this._clusterOptions.ClusterId));
236+
if (this._selfRow is not { } selfRow)
237+
{
238+
var response = await this._container.ReadItemAsync<SiloEntity>(siloEntityId, new PartitionKey(this._clusterOptions.ClusterId));
239+
240+
if (response.StatusCode != HttpStatusCode.OK)
241+
{
242+
var message = $"Unable to query for SiloEntity {entry.ToFullString()}";
243+
this._logger.LogWarning((int)ErrorCode.MembershipBase, message);
244+
throw new OrleansException(message);
245+
}
246+
247+
this._selfRow = selfRow = response;
248+
}
249+
250+
var siloEntity = selfRow.Resource;
251+
siloEntity.IAmAliveTime = entry.IAmAliveTime;
252+
253+
try
254+
{
255+
var replaceResponse = await this._container.ReplaceItemAsync(
256+
siloEntity,
257+
siloEntityId,
258+
new PartitionKey(this._clusterOptions.ClusterId),
259+
new ItemRequestOptions { IfMatchEtag = selfRow.ETag });
260+
this._selfRow = replaceResponse;
261+
}
262+
catch
263+
{
264+
this._selfRow = null;
265+
throw;
266+
}
236267
}
237268

238269
public async Task<bool> UpdateRow(MembershipEntry entry, string etag, TableVersion tableVersion)

src/Orleans.Persistence.CosmosDB/CosmosDBGrainStorage.cs

+5
Original file line numberDiff line numberDiff line change
@@ -153,10 +153,12 @@ public async Task ReadStateAsync(string grainType, GrainReference grainReference
153153
if (doc.Resource.State != null)
154154
{
155155
grainState.State = JsonConvert.DeserializeObject(doc.Resource.State.ToString(), grainState.State.GetType(), this._options.JsonSerializerSettings);
156+
grainState.RecordExists = true;
156157
}
157158
else
158159
{
159160
grainState.State = Activator.CreateInstance(grainState.State.GetType());
161+
grainState.RecordExists = true;
160162
}
161163

162164
grainState.ETag = doc.Resource.ETag;
@@ -224,6 +226,7 @@ public async Task WriteStateAsync(string grainType, GrainReference grainReferenc
224226
grainState.ETag = response.Resource.ETag;
225227
}
226228

229+
grainState.RecordExists = true;
227230
}
228231
catch (CosmosException dce) when (dce.StatusCode == HttpStatusCode.PreconditionFailed)
229232
{
@@ -259,6 +262,7 @@ await ExecuteWithRetries(() => this._container.DeleteItemAsync<GrainStateEntity>
259262
id, pk, requestOptions));
260263

261264
grainState.ETag = null;
265+
grainState.RecordExists = false;
262266
}
263267
else
264268
{
@@ -278,6 +282,7 @@ await ExecuteWithRetries(() => this._container.DeleteItemAsync<GrainStateEntity>
278282
.ConfigureAwait(false);
279283

280284
grainState.ETag = response.Resource.ETag;
285+
grainState.RecordExists = true;
281286
}
282287
}
283288
catch (Exception exc)

src/Orleans.Persistence.CosmosDB/Orleans.Persistence.CosmosDB.csproj

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
44
<TargetFramework>netstandard2.0</TargetFramework>
@@ -27,9 +27,9 @@
2727
</ItemGroup>
2828

2929
<ItemGroup>
30-
<PackageReference Include="Microsoft.Azure.Cosmos" Version="3.6.0" />
31-
<PackageReference Include="Microsoft.Orleans.OrleansRuntime" Version="3.0.2" />
32-
<PackageReference Include="System.Threading.Tasks.Extensions" Version="4.5.3" />
30+
<PackageReference Include="Microsoft.Azure.Cosmos" Version="3.17.1" />
31+
<PackageReference Include="Microsoft.Orleans.OrleansRuntime" Version="3.4.2" />
32+
<PackageReference Include="System.Threading.Tasks.Extensions" Version="4.5.4" />
3333
</ItemGroup>
3434

3535
</Project>

src/Orleans.Reminders.CosmosDB/Orleans.Reminders.CosmosDB.csproj

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@
2727
</ItemGroup>
2828

2929
<ItemGroup>
30-
<PackageReference Include="Microsoft.Azure.Cosmos" Version="3.6.0" />
31-
<PackageReference Include="Microsoft.Orleans.OrleansRuntime" Version="3.0.2" />
30+
<PackageReference Include="Microsoft.Azure.Cosmos" Version="3.17.1" />
31+
<PackageReference Include="Microsoft.Orleans.OrleansRuntime" Version="3.4.2" />
3232
</ItemGroup>
3333

3434
</Project>

src/Orleans.Streaming.CosmosDB/Orleans.Streaming.CosmosDB.csproj

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@
2525
<ItemGroup>
2626
<PackageReference Include="Microsoft.Azure.DocumentDB.Core" Version="2.9.1" />
2727
<PackageReference Include="Microsoft.Orleans.OrleansProviders" Version="3.0.2" />
28-
<PackageReference Include="System.Threading.Tasks.Extensions" Version="4.5.3" />
28+
<PackageReference Include="System.Threading.Tasks.Extensions" Version="4.5.4" />
2929
<PackageReference Include="Microsoft.Azure.DocumentDB.ChangeFeedProcessor" Version="2.2.8" />
30-
<PackageReference Include="Microsoft.Orleans.OrleansRuntime" Version="3.0.2" />
30+
<PackageReference Include="Microsoft.Orleans.OrleansRuntime" Version="3.4.2" />
3131
<PackageReference Include="Microsoft.Orleans.CodeGenerator.MSBuild" Version="3.0.2" />
3232
</ItemGroup>
3333

test/Orleans.CosmosDB.Tests/MBTTests.cs

+1-21
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,8 @@ namespace Orleans.CosmosDB.Tests
1616
/// <summary>
1717
/// Tests for operation of Orleans Membership Table using Azure Cosmos DB
1818
/// </summary>
19-
public class MBTTests : MembershipTableTestsBase/*, IClassFixture<AzureStorageBasicTests>*/
19+
public class MBTTests : MembershipTableTestsBase
2020
{
21-
public MBTTests() : base(CreateFilters())
22-
{
23-
}
24-
25-
private static LoggerFilterOptions CreateFilters()
26-
{
27-
var filters = new LoggerFilterOptions();
28-
//filters.AddFilter(typeof(Orleans.Clustering.CosmosDB.AzureTableDataManager<>).FullName, LogLevel.Trace);
29-
//filters.AddFilter(typeof(OrleansSiloInstanceManager).FullName, LogLevel.Trace);
30-
//filters.AddFilter("Orleans.Storage", LogLevel.Trace);
31-
return filters;
32-
}
33-
3421
protected override IMembershipTable CreateMembershipTable(ILogger logger, string accountEndpoint, string accountKey)
3522
{
3623
var httpHandler = new HttpClientHandler()
@@ -44,7 +31,6 @@ protected override IMembershipTable CreateMembershipTable(ILogger logger, string
4431
new CosmosClientOptions { ConnectionMode = ConnectionMode.Gateway }
4532
);
4633

47-
//TestUtils.CheckForAzureStorage();
4834
var options = new CosmosDBClusteringOptions()
4935
{
5036
Client = dbClient,
@@ -80,12 +66,6 @@ protected override IGatewayListProvider CreateGatewayListProvider(ILogger logger
8066
Options.Create(new GatewayOptions()));
8167
}
8268

83-
protected override Task<string> GetConnectionString()
84-
{
85-
//TestUtils.CheckForAzureStorage();
86-
return Task.FromResult("");
87-
}
88-
8969
[Fact]
9070
public async Task GetGateways()
9171
{

test/Orleans.CosmosDB.Tests/MembershipTableTestsBase.cs

+2-22
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,14 @@ internal static class SiloInstanceTableTestConstants
2424
}
2525

2626
[Collection("Default")]
27-
public abstract class MembershipTableTestsBase : IDisposable //, IClassFixture<ConnectionStringFixture>
27+
public abstract class MembershipTableTestsBase : IDisposable
2828
{
2929
private static readonly string hostName = Dns.GetHostName();
3030
private readonly ILogger logger = null;
3131
private readonly IMembershipTable membershipTable;
3232
private readonly IGatewayListProvider gatewayListProvider;
3333
protected readonly string clusterId;
3434
protected ILoggerFactory loggerFactory;
35-
protected const string testDatabaseName = "OrleansMembershipTest";//for relational storage
3635

3736
private static string accountEndpoint;
3837
private static string accountKey;
@@ -42,10 +41,8 @@ static MembershipTableTestsBase()
4241
OrleansFixture.GetAccountInfo(out accountEndpoint, out accountKey);
4342
}
4443

45-
protected MembershipTableTestsBase(/*ConnectionStringFixture fixture, TestEnvironmentFixture environment, */LoggerFilterOptions filters)
44+
protected MembershipTableTestsBase()
4645
{
47-
//this.environment = environment;
48-
//loggerFactory = TestingUtils.CreateDefaultLoggerFactory($"{this.GetType()}.log", filters);
4946
var sp = new ServiceCollection().AddLogging(b => b.AddConsole()).BuildServiceProvider();
5047
loggerFactory = sp.GetRequiredService<ILoggerFactory>();
5148
logger = loggerFactory.CreateLogger(this.GetType().FullName);
@@ -54,40 +51,23 @@ protected MembershipTableTestsBase(/*ConnectionStringFixture fixture, TestEnviro
5451

5552
logger?.Info("ClusterId={0}", this.clusterId);
5653

57-
//fixture.InitializeConnectionStringAccessor(GetConnectionString);
58-
//this.connectionString = fixture.ConnectionString;
59-
var adoVariant = GetAdoInvariant();
60-
6154
membershipTable = CreateMembershipTable(logger, accountEndpoint, accountKey);
6255
membershipTable.InitializeMembershipTable(true).WithTimeout(TimeSpan.FromMinutes(3)).Wait();
6356

6457
gatewayListProvider = CreateGatewayListProvider(logger, accountEndpoint, accountKey);
6558
gatewayListProvider.InitializeGatewayListProvider().WithTimeout(TimeSpan.FromMinutes(3)).Wait();
6659
}
6760

68-
//public IGrainFactory GrainFactory => this.environment.GrainFactory;
69-
70-
//public IGrainReferenceConverter GrainReferenceConverter => this.environment.Services.GetRequiredService<IGrainReferenceConverter>();
71-
72-
//public IServiceProvider Services => this.environment.Services;
73-
7461
public void Dispose()
7562
{
7663
if (membershipTable != null && SiloInstanceTableTestConstants.DeleteEntriesAfterTest)
7764
{
7865
membershipTable.DeleteMembershipTableEntries(this.clusterId).Wait();
7966
}
80-
//this.loggerFactory.Dispose();
8167
}
8268

8369
protected abstract IGatewayListProvider CreateGatewayListProvider(ILogger logger, string accountEndpoint, string accountKey);
8470
protected abstract IMembershipTable CreateMembershipTable(ILogger logger, string accountEndpoint, string accountKey);
85-
protected abstract Task<string> GetConnectionString();
86-
87-
protected virtual string GetAdoInvariant()
88-
{
89-
return null;
90-
}
9171

9272
protected async Task MembershipTable_GetGateways()
9373
{

test/Orleans.CosmosDB.Tests/Orleans.CosmosDB.Tests.csproj

+11-8
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,23 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>netcoreapp3.1</TargetFramework>
4+
<TargetFramework>net5.0</TargetFramework>
55
<LangVersion>latest</LangVersion>
66
<IsPackable>false</IsPackable>
77
</PropertyGroup>
88

99
<ItemGroup>
10-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.4.0" />
11-
<PackageReference Include="Microsoft.Orleans.CodeGenerator.MSBuild" Version="3.0.2" />
12-
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.1" />
13-
<PackageReference Include="Microsoft.Orleans.Server" Version="3.0.2" />
14-
<PackageReference Include="Newtonsoft.Json" Version="12.0.2" />
10+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.10.0" />
11+
<PackageReference Include="Microsoft.Orleans.CodeGenerator.MSBuild" Version="3.4.2" />
12+
<PackageReference Include="Microsoft.Extensions.Hosting" Version="5.0.0" />
13+
<PackageReference Include="Microsoft.Orleans.Server" Version="3.4.2" />
14+
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
1515
<PackageReference Include="System.Threading.Tasks.Extensions" Version="4.5.4" />
1616
<PackageReference Include="xunit" Version="2.4.1" />
17-
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.1" />
17+
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
18+
<PrivateAssets>all</PrivateAssets>
19+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
20+
</PackageReference>
1821
</ItemGroup>
1922

2023
<ItemGroup>

test/Orleans.CosmosDB.Tests/PersistenceTests.cs

-5
Original file line numberDiff line numberDiff line change
@@ -188,9 +188,7 @@ public async Task ClearState()
188188

189189
var list = await grain.Read();
190190

191-
192191
Assert.Empty(list);
193-
194192
}
195193

196194
[Fact]
@@ -220,9 +218,6 @@ public async Task ClearState_BeforeWrite()
220218

221219
var grain = this._fixture.Client.GetGrain<ITestCustomPartitionGrain>(guid);
222220
await grain.ClearState();
223-
224-
225221
}
226222
}
227-
228223
}

0 commit comments

Comments
 (0)