Skip to content

Commit 9195b82

Browse files
fix: have the database seed executed only once
1 parent 405a15c commit 9195b82

10 files changed

Lines changed: 42 additions & 41 deletions

benchmark/BenchmarkRunner/Benchmarks/BaseBenchmark.cs

Lines changed: 0 additions & 28 deletions
This file was deleted.

benchmark/BenchmarkRunner/Benchmarks/BaseReadBenchmark.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using BenchmarkDotNet.Attributes;
2+
using BenchmarkRunner.Utils;
23

3-
public abstract class BaseReadBenchmark : BaseBenchmark
4+
public abstract class BaseReadBenchmark
45
{
56
[Params(1000)]
67
public int QueriesToRun { get; set; }
@@ -12,11 +13,10 @@ public abstract class BaseReadBenchmark : BaseBenchmark
1213
public int Limit { get; set; }
1314

1415
[IterationSetup]
15-
public static void IterationSetup() => InvokeGarbageCollection();
16+
public static void IterationSetup() => Helpers.InvokeGarbageCollection();
1617
public abstract Task Sqlc_GetCustomerOrders();
1718
public abstract Task EFCore_NoTracking_GetCustomerOrders();
1819
public abstract Task EFCore_WithTracking_GetCustomerOrders();
19-
2020
private static int CalculateMaxConcurrency(int totalTasks, int maxConcurrency)
2121
{
2222
return new int[] {

benchmark/BenchmarkRunner/Benchmarks/BaseWriteBenchmark.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
using BenchmarkDotNet.Attributes;
22

3-
public abstract class BaseWriteBenchmark : BaseBenchmark
3+
public abstract class BaseWriteBenchmark
44
{
55
[Params(2000000)]
66
public int TotalRecords { get; set; }

benchmark/BenchmarkRunner/Benchmarks/MysqlReadBenchmark.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public class MysqlReadBenchmark : BaseReadBenchmark
2323
[GlobalSetup]
2424
public async Task GlobalSetup()
2525
{
26-
await InitializeOnceAsync(async () =>
26+
await Helpers.InitializeOnceAsync(async () =>
2727
{
2828
await MysqlDatabaseHelper.CleanupDatabaseAsync(_connectionString);
2929
var seeder = new MysqlDatabaseSeeder(_connectionString);

benchmark/BenchmarkRunner/Benchmarks/MysqlWriteBenchmark.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public class MysqlWriteBenchmark : BaseWriteBenchmark
3030
[GlobalSetup]
3131
public async Task GlobalSetup()
3232
{
33-
await InitializeOnceAsync(async () =>
33+
await Helpers.InitializeOnceAsync(async () =>
3434
{
3535
await MysqlDatabaseHelper.CleanupDatabaseAsync(_connectionString);
3636
var seeder = new MysqlDatabaseSeeder(_connectionString);
@@ -57,7 +57,7 @@ await seeder.SeedAsync(
5757
public static void IterationSetup()
5858
{
5959
MysqlDatabaseHelper.CleanupWriteTableAsync(_connectionString).GetAwaiter().GetResult();
60-
InvokeGarbageCollection();
60+
Helpers.InvokeGarbageCollection();
6161
}
6262

6363
[BenchmarkCategory("Write")]

benchmark/BenchmarkRunner/Benchmarks/PostgresqlReadBenchmark.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public class PostgresqlReadBenchmark : BaseReadBenchmark
2323
[GlobalSetup]
2424
public async Task GlobalSetup()
2525
{
26-
await InitializeOnceAsync(async () =>
26+
await Helpers.InitializeOnceAsync(async () =>
2727
{
2828
await PostgresqlDatabaseHelper.CleanupDatabaseAsync(_connectionString);
2929
var seeder = new PostgresqlDatabaseSeeder(_connectionString);

benchmark/BenchmarkRunner/Benchmarks/PostgresqlWriteBenchmark.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public class PostgresqlWriteBenchmark : BaseWriteBenchmark
2828
[GlobalSetup]
2929
public async Task GlobalSetup()
3030
{
31-
await InitializeOnceAsync(async () =>
31+
await Helpers.InitializeOnceAsync(async () =>
3232
{
3333
PostgresqlDatabaseHelper.CleanupDatabaseAsync(_connectionString).GetAwaiter().GetResult();
3434
var seeder = new PostgresqlDatabaseSeeder(_connectionString);
@@ -55,7 +55,7 @@ await seeder.SeedAsync(
5555
public static void IterationSetup()
5656
{
5757
PostgresqlDatabaseHelper.CleanupWriteTableAsync(_connectionString).GetAwaiter().GetResult();
58-
InvokeGarbageCollection();
58+
Helpers.InvokeGarbageCollection();
5959
}
6060

6161
[BenchmarkCategory("Write")]

benchmark/BenchmarkRunner/Benchmarks/SqliteReadBenchmark.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public class SqliteReadBenchmark : BaseReadBenchmark
2626
[GlobalSetup]
2727
public async Task GlobalSetup()
2828
{
29-
await InitializeOnceAsync(async () =>
29+
await Helpers.InitializeOnceAsync(async () =>
3030
{
3131
SqliteDatabaseHelper.CleanupDatabase(_connectionString);
3232
await SqliteDatabaseHelper.InitializeDatabaseAsync(_connectionString);

benchmark/BenchmarkRunner/Benchmarks/SqliteWriteBenchmark.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public class SqliteWriteBenchmark : BaseWriteBenchmark
3030
[GlobalSetup]
3131
public async Task GlobalSetup()
3232
{
33-
await InitializeOnceAsync(async () =>
33+
await Helpers.InitializeOnceAsync(async () =>
3434
{
3535
SqliteDatabaseHelper.CleanupDatabase(_connectionString);
3636
await SqliteDatabaseHelper.InitializeDatabaseAsync(_connectionString);
@@ -58,7 +58,7 @@ await seeder.SeedAsync(
5858
public static void IterationSetup()
5959
{
6060
SqliteDatabaseHelper.CleanupWriteTableAsync(_connectionString).GetAwaiter().GetResult();
61-
InvokeGarbageCollection();
61+
Helpers.InvokeGarbageCollection();
6262
}
6363

6464
[BenchmarkCategory("Write")]

benchmark/BenchmarkRunner/Utils/Helpers.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,39 @@ namespace BenchmarkRunner.Utils;
22

33
public static class Helpers
44
{
5+
/*
6+
InitializeOnceAsync is a helper method to ensure that a task is only executed once.
7+
_initLock is a semaphore to ensure that only one task is executed at a time.
8+
isInitialized is a flag to check if the task has been executed.
9+
*/
10+
public static bool _isInitialized = false;
11+
public static SemaphoreSlim _initLock = new(1, 1);
12+
public static async Task InitializeOnceAsync(Func<Task> task)
13+
{
14+
if (_isInitialized) return;
15+
await _initLock.WaitAsync();
16+
try
17+
{
18+
if (_isInitialized) return;
19+
await task.Invoke();
20+
_isInitialized = true;
21+
}
22+
finally
23+
{
24+
_initLock.Release();
25+
}
26+
}
27+
528
public static async Task InsertInBatchesAsync<T>(List<T> items, int batchSize, Func<List<T>, Task> insertBatch)
629
{
730
var batches = items.Chunk(batchSize);
831
foreach (var batch in batches)
932
await insertBatch([.. batch]);
1033
}
34+
public static void InvokeGarbageCollection()
35+
{
36+
GC.Collect();
37+
GC.WaitForPendingFinalizers();
38+
GC.Collect();
39+
}
1140
}

0 commit comments

Comments
 (0)