Skip to content

Commit b4242ba

Browse files
committed
Pivot to BenchmarkDotNet
1 parent 14632c9 commit b4242ba

38 files changed

+1229
-137
lines changed

Akka.Persistence.Benchmarks.sln

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
Microsoft Visual Studio Solution File, Format Version 12.00
3-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Akka.Persistence.Benchmarks", "src\Akka.Persistence.Benchmarks\Akka.Persistence.Benchmarks.csproj", "{EA7E363E-D1C1-49B7-AA57-4785B9190CF8}"
3+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Akka.Persistence.Benchmarks.Tests", "src\Akka.Persistence.Benchmarks.Tests\Akka.Persistence.Benchmarks.Tests.csproj", "{EA7E363E-D1C1-49B7-AA57-4785B9190CF8}"
44
EndProject
55
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SolutionFolder", "SolutionFolder", "{CB6C1195-5067-47DB-8196-75576697DFCC}"
66
ProjectSection(SolutionItems) = preProject
@@ -12,6 +12,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SolutionFolder", "SolutionF
1212
RELEASE_NOTES.md = RELEASE_NOTES.md
1313
EndProjectSection
1414
EndProject
15+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Akka.Persistence.Benchmarks", "src\Akka.Persistence.Benchmarks\Akka.Persistence.Benchmarks.csproj", "{A2743044-7635-4DE5-931F-9D53624EBC1B}"
16+
EndProject
1517
Global
1618
GlobalSection(SolutionConfigurationPlatforms) = preSolution
1719
Debug|Any CPU = Debug|Any CPU
@@ -22,5 +24,9 @@ Global
2224
{EA7E363E-D1C1-49B7-AA57-4785B9190CF8}.Debug|Any CPU.Build.0 = Debug|Any CPU
2325
{EA7E363E-D1C1-49B7-AA57-4785B9190CF8}.Release|Any CPU.ActiveCfg = Release|Any CPU
2426
{EA7E363E-D1C1-49B7-AA57-4785B9190CF8}.Release|Any CPU.Build.0 = Release|Any CPU
27+
{A2743044-7635-4DE5-931F-9D53624EBC1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
28+
{A2743044-7635-4DE5-931F-9D53624EBC1B}.Debug|Any CPU.Build.0 = Debug|Any CPU
29+
{A2743044-7635-4DE5-931F-9D53624EBC1B}.Release|Any CPU.ActiveCfg = Release|Any CPU
30+
{A2743044-7635-4DE5-931F-9D53624EBC1B}.Release|Any CPU.Build.0 = Release|Any CPU
2531
EndGlobalSection
2632
EndGlobal

Directory.Packages.props

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,16 @@
88
<ItemGroup>
99
<PackageVersion Include="Akka.Hosting" Version="$(AkkaHostingVersion)" />
1010
<PackageVersion Include="Akka.Hosting.TestKit" Version="$(AkkaHostingVersion)" />
11+
<PackageVersion Include="Akka.Persistence.Azure" Version="1.5.51.1" />
1112
<PackageVersion Include="Akka.Persistence.Azure.Hosting" Version="1.5.51.1" />
13+
<PackageVersion Include="Akka.Persistence.MongoDb" Version="1.5.42" />
1214
<PackageVersion Include="Akka.Persistence.MongoDb.Hosting" Version="1.5.42" />
15+
<PackageVersion Include="Akka.Persistence.PostgreSql" Version="1.5.37" />
16+
<PackageVersion Include="Akka.Persistence.Redis" Version="1.5.42" />
1317
<PackageVersion Include="Akka.Persistence.Redis.Hosting" Version="1.5.42" />
18+
<PackageVersion Include="Akka.Persistence.Sql" Version="1.5.51.1" />
1419
<PackageVersion Include="Akka.Persistence.Sql.Hosting" Version="1.5.51.1" />
20+
<PackageVersion Include="Akka.Persistence.Sqlite" Version="1.5.39" />
1521
<PackageVersion Include="Aspire.Hosting.SqlServer" Version="9.5.1" />
1622
<PackageVersion Include="MathNet.Numerics" Version="5.0.0" />
1723
<PackageVersion Include="BenchmarkDotNet" Version="0.15.4" />
@@ -20,7 +26,8 @@
2026
<PackageVersion Include="Aspire.Hosting.AppHost" Version="9.3.1" />
2127
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.0.0" />
2228
<PackageVersion Include="MySql.Data" Version="9.4.0" />
23-
<PackageVersion Include="Npgsql" Version="9.0.4" />
29+
<PackageVersion Include="Npgsql" Version="9.0.00
30+
" />
2431
<PackageVersion Include="Testcontainers.Azurite" Version="4.7.0" />
2532
<PackageVersion Include="TestContainers.Container.Database.MsSql" Version="1.5.4" />
2633
<PackageVersion Include="TestContainers.Container.Database.MySql" Version="1.5.4" />
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<OutputType>Exe</OutputType>
5+
<TargetFramework>net9.0</TargetFramework>
6+
<ImplicitUsings>enable</ImplicitUsings>
7+
<Nullable>enable</Nullable>
8+
</PropertyGroup>
9+
10+
<ItemGroup>
11+
<PackageReference Include="Akka.Hosting.TestKit" />
12+
<PackageReference Include="Akka.Persistence.Azure.Hosting" />
13+
<PackageReference Include="Akka.Persistence.MongoDb.Hosting" />
14+
<PackageReference Include="Akka.Persistence.Redis.Hosting" />
15+
<PackageReference Include="Akka.Persistence.Sql.Hosting" />
16+
<PackageReference Include="MathNet.Numerics" />
17+
<PackageReference Include="Microsoft.Data.SqlClient" />
18+
<PackageReference Include="Microsoft.NET.Test.Sdk" />
19+
<PackageReference Include="MySql.Data" />
20+
<PackageReference Include="Npgsql" />
21+
<PackageReference Include="Testcontainers.MongoDb" />
22+
<PackageReference Include="Testcontainers.MsSql" />
23+
<PackageReference Include="Testcontainers.MySql" />
24+
<PackageReference Include="Testcontainers.PostgreSql" />
25+
<PackageReference Include="Testcontainers.Redis" />
26+
<PackageReference Include="Testcontainers.Azurite" />
27+
</ItemGroup>
28+
29+
<ItemGroup>
30+
<None Update="xunit.runner.json">
31+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
32+
</None>
33+
</ItemGroup>
34+
35+
</Project>
File renamed without changes.
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
using Akka.Hosting;
2+
using Akka.Persistence.Azure.Hosting;
3+
using DotNet.Testcontainers.Configurations;
4+
using DotNet.Testcontainers.Containers;
5+
using Testcontainers.Azurite;
6+
7+
namespace Akka.Persistence.Benchmarks.Fixtures;
8+
9+
public class AzuriteFixture: Fixture
10+
{
11+
public AzuriteFixture(): this(false)
12+
{
13+
}
14+
15+
public AzuriteFixture(bool useVolume)
16+
{
17+
var builder = new AzuriteBuilder();
18+
19+
if (useVolume)
20+
builder = builder.WithVolumeMount("benchmark-azurite-data", "/data", AccessMode.ReadWrite);
21+
22+
var container = builder.Build();
23+
24+
Container = container;
25+
ConnectionStringFunc = container.GetConnectionString;
26+
}
27+
28+
public override DockerContainer Container { get; }
29+
protected override Func<string> ConnectionStringFunc { get; }
30+
31+
public override Task<bool> IsVolumeInitializedAsync(string persistenceId)
32+
{
33+
throw new NotImplementedException();
34+
}
35+
36+
public override void ConfigureAkka(AkkaConfigurationBuilder builder, IServiceProvider provider)
37+
{
38+
if (Container.State == TestcontainersStates.Undefined)
39+
Container.StartAsync().GetAwaiter().GetResult();
40+
41+
builder.WithAzurePersistence(
42+
connectionString: ConnectionStringFunc());
43+
}
44+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace Akka.Persistence.Benchmarks.Fixtures;
2+
3+
public static class Consts
4+
{
5+
public const string DatabaseName = "akka";
6+
public const string Username = "akka";
7+
public const string Password = "Strong0Password!";
8+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using Akka.Hosting;
2+
using DotNet.Testcontainers.Containers;
3+
4+
namespace Akka.Persistence.Benchmarks.Fixtures;
5+
6+
public abstract class Fixture
7+
{
8+
public abstract DockerContainer Container { get; }
9+
protected abstract Func<string> ConnectionStringFunc { get; }
10+
11+
public string ConnectionString
12+
{
13+
get
14+
{
15+
if (Container.State == TestcontainersStates.Undefined)
16+
{
17+
Container.StartAsync().GetAwaiter().GetResult();
18+
}
19+
20+
return ConnectionStringFunc();
21+
}
22+
}
23+
24+
public abstract Task<bool> IsVolumeInitializedAsync(string persistenceId);
25+
26+
public abstract void ConfigureAkka(AkkaConfigurationBuilder builder, IServiceProvider provider);
27+
}

src/Akka.Persistence.Benchmarks/Fixtures/IFixture.cs renamed to src/Akka.Persistence.Benchmarks.Tests/Fixtures/IFixture.cs

File renamed without changes.
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
using Akka.Hosting;
2+
using Akka.Persistence.Hosting;
3+
using Akka.Persistence.MongoDb.Hosting;
4+
using DotNet.Testcontainers.Configurations;
5+
using DotNet.Testcontainers.Containers;
6+
using Testcontainers.MongoDb;
7+
using static Akka.Persistence.Benchmarks.Fixtures.Consts;
8+
9+
namespace Akka.Persistence.Benchmarks.Fixtures;
10+
11+
public class MongoDbFixture: Fixture
12+
{
13+
public MongoDbFixture() : this(false)
14+
{
15+
}
16+
17+
public MongoDbFixture(bool useVolume)
18+
{
19+
var builder = new MongoDbBuilder()
20+
.WithUsername(Username)
21+
.WithPassword(Password)
22+
.WithReplicaSet(DatabaseName);
23+
24+
if (useVolume)
25+
builder = builder.WithVolumeMount("benchmark-mongodb-data", "/data/db", AccessMode.ReadWrite);
26+
27+
var container = builder.Build();
28+
29+
Container = container;
30+
ConnectionStringFunc = container.GetConnectionString;
31+
}
32+
33+
public override DockerContainer Container { get; }
34+
protected override Func<string> ConnectionStringFunc { get; }
35+
36+
public override Task<bool> IsVolumeInitializedAsync(string persistenceId)
37+
{
38+
throw new NotImplementedException();
39+
}
40+
41+
public override void ConfigureAkka(AkkaConfigurationBuilder builder, IServiceProvider provider)
42+
{
43+
if (Container.State == TestcontainersStates.Undefined)
44+
Container.StartAsync().GetAwaiter().GetResult();
45+
46+
builder.WithMongoDbPersistence(
47+
connectionString: ConnectionStringFunc(),
48+
mode: PersistenceMode.Journal,
49+
autoInitialize: true);
50+
}
51+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
using Akka.Hosting;
2+
using Akka.Persistence.Hosting;
3+
using Akka.Persistence.Sql.Hosting;
4+
using DotNet.Testcontainers.Configurations;
5+
using DotNet.Testcontainers.Containers;
6+
using LinqToDB;
7+
using MySql.Data.MySqlClient;
8+
using Testcontainers.MySql;
9+
using static Akka.Persistence.Benchmarks.Fixtures.Consts;
10+
11+
namespace Akka.Persistence.Benchmarks.Fixtures;
12+
13+
public class MySqlFixture: Fixture
14+
{
15+
public MySqlFixture() : this(false)
16+
{
17+
}
18+
19+
public MySqlFixture(bool useVolume)
20+
{
21+
var builder = new MySqlBuilder()
22+
.WithUsername(Username)
23+
.WithPassword(Password)
24+
.WithDatabase(DatabaseName);
25+
26+
if (useVolume)
27+
builder = builder.WithVolumeMount("benchmark-mysql-data", "/var/lib/mysql", AccessMode.ReadWrite);
28+
29+
var container = builder.Build();
30+
31+
Container = container;
32+
ConnectionStringFunc = container.GetConnectionString;
33+
}
34+
35+
public override DockerContainer Container { get; }
36+
protected override Func<string> ConnectionStringFunc { get; }
37+
38+
public override async Task<bool> IsVolumeInitializedAsync(string persistenceId)
39+
{
40+
var connectionString = ConnectionStringFunc();
41+
42+
await using var conn = new MySqlConnection(connectionString);
43+
await conn.OpenAsync();
44+
45+
await using var cmd = new MySqlCommand(
46+
"""
47+
SELECT
48+
CASE
49+
WHEN EXISTS (
50+
SELECT 1
51+
FROM journal
52+
WHERE persistence_id = @SearchValue
53+
)
54+
THEN TRUE
55+
ELSE FALSE
56+
END;
57+
""", conn);
58+
cmd.Parameters.AddWithValue("@SearchValue", persistenceId);
59+
60+
try
61+
{
62+
return Convert.ToBoolean(cmd.ExecuteScalar());
63+
}
64+
catch
65+
{
66+
return false;
67+
}
68+
}
69+
70+
public override void ConfigureAkka(AkkaConfigurationBuilder builder, IServiceProvider provider)
71+
{
72+
if (Container.State == TestcontainersStates.Undefined)
73+
Container.StartAsync().GetAwaiter().GetResult();
74+
75+
builder.WithSqlPersistence(
76+
connectionString: ConnectionStringFunc(),
77+
providerName: ProviderName.MySql,
78+
mode: PersistenceMode.Journal,
79+
autoInitialize: true);
80+
}
81+
}

0 commit comments

Comments
 (0)