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 <nick@opscentre.co.nz>
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

Lines changed: 1 addition & 1 deletion
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/AzureCosmosAction@v1.0.0
2121
# - name: Start CosmosDB Emulator

.github/workflows/publish.yml

Lines changed: 1 addition & 1 deletion
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

Lines changed: 6 additions & 4 deletions
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 34 additions & 3 deletions
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

Lines changed: 5 additions & 0 deletions
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

Lines changed: 4 additions & 4 deletions
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

Lines changed: 2 additions & 2 deletions
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

Lines changed: 2 additions & 2 deletions
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

Lines changed: 1 addition & 21 deletions
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
{

0 commit comments

Comments
 (0)