Skip to content

Commit 42d0202

Browse files
committed
Ticket #15: Use cluster configuration
1 parent d38bb19 commit 42d0202

File tree

8 files changed

+116
-25
lines changed

8 files changed

+116
-25
lines changed

samples/EFCore.Cassandra.Samples/FakeDbContext.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// Copyright (c) SimpleIdServer. All rights reserved.
22
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
3+
using Cassandra;
34
using EFCore.Cassandra.Samples.Models;
45
using Microsoft.EntityFrameworkCore;
56
using Microsoft.EntityFrameworkCore.Cassandra.Storage;
@@ -16,6 +17,21 @@ protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
1617
optionsBuilder.UseCassandra("Contact Points=127.0.0.1;", opt =>
1718
{
1819
opt.MigrationsHistoryTable(HistoryRepository.DefaultTableName, "cv");
20+
}, b =>
21+
{
22+
b.WithQueryOptions(new QueryOptions().SetConsistencyLevel(ConsistencyLevel.LocalOne))
23+
.WithReconnectionPolicy(new ConstantReconnectionPolicy(1000))
24+
.WithRetryPolicy(new DefaultRetryPolicy())
25+
.WithLoadBalancingPolicy(new TokenAwarePolicy(Policies.DefaultPolicies.LoadBalancingPolicy))
26+
.WithDefaultKeyspace(GetType().Name)
27+
.WithPoolingOptions(
28+
PoolingOptions.Create()
29+
.SetMaxSimultaneousRequestsPerConnectionTreshold(HostDistance.Remote, 1_000_000)
30+
.SetMaxSimultaneousRequestsPerConnectionTreshold(HostDistance.Local, 1_000_000)
31+
.SetMaxConnectionsPerHost(HostDistance.Local, 1_000_000)
32+
.SetMaxConnectionsPerHost(HostDistance.Remote, 1_000_000)
33+
.SetMaxRequestsPerConnection(1_000_000)
34+
);
1935
});
2036
}
2137

src/EFCore.Cassandra.Benchmarks/BatchedInsertData.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,17 +40,13 @@ public void SetupFixture()
4040
_applicants = Enumerable.Range(0, Iterations).Select(_ => BuildApplicants()).ToArray();
4141
}
4242

43-
4443
[Benchmark]
4544
public async Task BatchedInsertApplicantsAsync()
4645
{
47-
var a = Enumerable.Range(0, Iterations)
48-
.Select(i => _dbContext.BulkInsertAsync(_applicants[i].ToList()));
49-
46+
var a = Enumerable.Range(0, Iterations).Select(i => _dbContext.BulkInsertAsync(_applicants[i].ToList()));
5047
await Task.WhenAll(a);
5148
}
5249

53-
5450
private Applicant[] BuildApplicants()
5551
{
5652
return Enumerable.Range(0, BatchSize).Select(_ => BuildApplicant()).ToArray();

src/EFCore.Cassandra.Benchmarks/CassandraBenchmarkConfig.cs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,21 @@
66

77
namespace EFCore.Cassandra.Benchmarks
88
{
9-
[Config(typeof(CassandraBenchmarkConfig))]
10-
public class CassandraBenchmarkConfig : ManualConfig
11-
{
12-
public CassandraBenchmarkConfig()
9+
[Config(typeof(CassandraBenchmarkConfig))]
10+
public class CassandraBenchmarkConfig : ManualConfig
1311
{
14-
AddJob(
15-
Job.Default
16-
.WithPlatform(Platform.X64)
17-
.WithJit(Jit.RyuJit)
18-
.WithRuntime(CoreRuntime.Core31)
19-
.WithWarmupCount(1)
20-
.WithIterationCount(3)
21-
.WithId("Cassandra benchmark config"));
12+
public CassandraBenchmarkConfig()
13+
{
14+
AddJob(
15+
Job.Default
16+
.WithPlatform(Platform.X64)
17+
.WithJit(Jit.RyuJit)
18+
.WithRuntime(CoreRuntime.Core31)
19+
.WithWarmupCount(1)
20+
.WithIterationCount(3)
21+
.WithId("Cassandra benchmark config"));
2222

23-
AddDiagnoser(MemoryDiagnoser.Default);
23+
AddDiagnoser(MemoryDiagnoser.Default);
24+
}
2425
}
25-
}
2626
}

src/EFCore.Cassandra.Benchmarks/FakeDbContext.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// Copyright (c) SimpleIdServer. All rights reserved.
22
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
3+
using Cassandra;
34
using EFCore.Cassandra.Benchmarks.Models;
45
using Microsoft.EntityFrameworkCore;
56
using Microsoft.EntityFrameworkCore.Cassandra.Storage;
@@ -16,6 +17,21 @@ protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
1617
optionsBuilder.UseCassandra("Contact Points=127.0.0.1;", opt =>
1718
{
1819
opt.MigrationsHistoryTable(HistoryRepository.DefaultTableName, "cv");
20+
}, o => {
21+
22+
o.WithQueryOptions(new QueryOptions().SetConsistencyLevel(ConsistencyLevel.LocalOne))
23+
.WithReconnectionPolicy(new ConstantReconnectionPolicy(1000))
24+
.WithRetryPolicy(new DefaultRetryPolicy())
25+
.WithLoadBalancingPolicy(new TokenAwarePolicy(Policies.DefaultPolicies.LoadBalancingPolicy))
26+
.WithDefaultKeyspace(GetType().Name)
27+
.WithPoolingOptions(
28+
PoolingOptions.Create()
29+
.SetMaxSimultaneousRequestsPerConnectionTreshold(HostDistance.Remote, 1_000_000)
30+
.SetMaxSimultaneousRequestsPerConnectionTreshold(HostDistance.Local, 1_000_000)
31+
.SetMaxConnectionsPerHost(HostDistance.Local, 1_000_000)
32+
.SetMaxConnectionsPerHost(HostDistance.Remote, 1_000_000)
33+
.SetMaxRequestsPerConnection(1_000_000)
34+
);
1935
});
2036
}
2137

src/EFCore.Cassandra/CassandraDbContextOptionsExtensions.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// Copyright (c) SimpleIdServer. All rights reserved.
22
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
3+
using Cassandra;
34
using Microsoft.EntityFrameworkCore.Cassandra.Infrastructure.Internal;
45
using Microsoft.EntityFrameworkCore.Infrastructure;
56
using System;
@@ -9,8 +10,18 @@ namespace Microsoft.EntityFrameworkCore
910
public static class CassandraDbContextOptionsExtensions
1011
{
1112
public static DbContextOptionsBuilder UseCassandra(this DbContextOptionsBuilder optionsBuilder, string connectionString, Action<CassandraDbContextOptionsBuilder> cassandraOptionsAction = null)
13+
{
14+
return UseCassandra(optionsBuilder, connectionString, cassandraOptionsAction, null);
15+
}
16+
17+
public static DbContextOptionsBuilder UseCassandra(this DbContextOptionsBuilder optionsBuilder, string connectionString, Action<CassandraDbContextOptionsBuilder> cassandraOptionsAction = null, Action<Builder> clusterBuilderCallback = null)
1218
{
1319
var extension = (CassandraOptionsExtension)GetOrCreateExtension(optionsBuilder).WithConnectionString(connectionString);
20+
if (clusterBuilderCallback != null)
21+
{
22+
extension = extension.WithCallbackClusterBuilder(clusterBuilderCallback);
23+
}
24+
1425
((IDbContextOptionsBuilderInfrastructure)optionsBuilder).AddOrUpdateExtension(extension);
1526
cassandraOptionsAction?.Invoke(new CassandraDbContextOptionsBuilder(optionsBuilder));
1627
return optionsBuilder;

src/EFCore.Cassandra/Infrastructure/Internal/CassandraOptionsExtension.cs

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,52 @@
22
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
33
using Microsoft.EntityFrameworkCore.Infrastructure;
44
using Microsoft.Extensions.DependencyInjection;
5+
using System;
56
using System.Collections.Generic;
67
using System.Text;
8+
using Cassandra;
9+
using System.Linq;
710

811
namespace Microsoft.EntityFrameworkCore.Cassandra.Infrastructure.Internal
912
{
1013
public class CassandraOptionsExtension : RelationalOptionsExtension
1114
{
15+
private Action<Builder> _callback;
16+
1217
public CassandraOptionsExtension() { }
1318

1419
protected CassandraOptionsExtension(CassandraOptionsExtension copyFrom) : base(copyFrom) { }
1520

1621
public override DbContextOptionsExtensionInfo Info => new ExtensionInfo(this);
1722

23+
public virtual Action<Builder> ClusterBuilder => _callback;
24+
1825
public override void ApplyServices(IServiceCollection services)
1926
{
2027
services.AddEntityFrameworkCassandra();
2128
}
2229

23-
protected override RelationalOptionsExtension Clone() => new CassandraOptionsExtension(this);
30+
public CassandraOptionsExtension WithCallbackClusterBuilder(Action<Builder> callback)
31+
{
32+
var clone = (CassandraOptionsExtension)Clone();
33+
clone._callback = callback;
34+
return clone;
35+
}
36+
37+
38+
protected override RelationalOptionsExtension Clone() => new CassandraOptionsExtension(this)
39+
{
40+
_callback = _callback
41+
};
42+
43+
public new static CassandraOptionsExtension Extract(IDbContextOptions options)
44+
{
45+
var relationalOptionsExtensions
46+
= options.Extensions
47+
.OfType<CassandraOptionsExtension>()
48+
.ToList();
49+
return relationalOptionsExtensions[0];
50+
}
2451

2552
private sealed class ExtensionInfo : RelationalExtensionInfo
2653
{
Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
11
// Copyright (c) SimpleIdServer. All rights reserved.
22
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
3-
using Cassandra.Data;
3+
using EFCore.Cassandra.Storage.Internal;
44
using Microsoft.EntityFrameworkCore.Storage;
55
using System.Data.Common;
66

77
namespace Microsoft.EntityFrameworkCore.Cassandra.Storage.Internal
88
{
99
public class CassandraRelationalConnection : RelationalConnection, ICassandraRelationalConnection
1010
{
11-
public CassandraRelationalConnection(RelationalConnectionDependencies dependencies) : base(dependencies)
12-
{
13-
}
11+
public CassandraRelationalConnection(RelationalConnectionDependencies dependencies) : base(dependencies) { }
1412

15-
protected override DbConnection CreateDbConnection() => new CqlConnection(ConnectionString);
13+
protected override DbConnection CreateDbConnection() => new EFCassandraDbConnection(ConnectionString, Dependencies);
1614
}
1715
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// Copyright (c) SimpleIdServer. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
3+
using Cassandra;
4+
using Cassandra.Data;
5+
using Microsoft.EntityFrameworkCore.Cassandra.Infrastructure.Internal;
6+
using Microsoft.EntityFrameworkCore.Storage;
7+
8+
namespace EFCore.Cassandra.Storage.Internal
9+
{
10+
public class EFCassandraDbConnection : CqlConnection
11+
{
12+
private readonly CassandraOptionsExtension _cassandraOptionsExtension;
13+
14+
public EFCassandraDbConnection(string connectionString, RelationalConnectionDependencies dependencies) : base(connectionString)
15+
{
16+
_cassandraOptionsExtension = CassandraOptionsExtension.Extract(dependencies.ContextOptions);
17+
}
18+
19+
protected override void OnBuildingCluster(Builder builder)
20+
{
21+
if (_cassandraOptionsExtension.ClusterBuilder != null)
22+
{
23+
_cassandraOptionsExtension.ClusterBuilder(builder);
24+
}
25+
}
26+
}
27+
}

0 commit comments

Comments
 (0)