From 8634839fbd94299c4958d44567224fc1fc09fcbe Mon Sep 17 00:00:00 2001 From: "Jeremy D. Miller" Date: Mon, 7 Oct 2024 10:34:51 -0500 Subject: [PATCH] Making the managed list partitions better able to do migrations across process restarts. Bumps to 7.11.3 --- Directory.Build.props | 2 +- .../partitioning/managed_list_partitions.cs | 29 +++++++++++++++++++ .../Partitioning/ManagedListPartitions.cs | 3 ++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/Directory.Build.props b/Directory.Build.props index c13718b8..0d6cb27f 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,7 +1,7 @@ - 7.11.2 + 7.11.3 12.0 enable enable diff --git a/src/Weasel.Postgresql.Tests/Tables/partitioning/managed_list_partitions.cs b/src/Weasel.Postgresql.Tests/Tables/partitioning/managed_list_partitions.cs index b880aaa5..28b9aa60 100644 --- a/src/Weasel.Postgresql.Tests/Tables/partitioning/managed_list_partitions.cs +++ b/src/Weasel.Postgresql.Tests/Tables/partitioning/managed_list_partitions.cs @@ -119,6 +119,35 @@ public async Task apply_additive_migration() partitioning.Partitions.Select(x => x.Suffix).OrderBy(x => x) .ShouldBe(new []{"blue", "green", "purple", "red"}); } + + [Fact] + public async Task apply_additive_migration_2() + { + var database = new ManagedListDatabase(); + var partitions = new Dictionary { { "red", "red" }, { "green", "green" }, { "blue", "blue" }, }; + await database.Partitions.ResetValues(database, partitions, CancellationToken.None); + + await database.ApplyAllConfiguredChangesToDatabaseAsync(); + + // RECREATE a new instance of the database + database = new ManagedListDatabase(); + + await database.Partitions.AddPartitionToAllTables(database, "purple", "purple", CancellationToken.None); + + var tables = await database.FetchExistingTablesAsync(); + + var teams = tables.Single(x => x.Identifier.Name == "teams"); + var partitioning = teams.Partitioning.ShouldBeOfType(); + partitioning.HasExistingDefault.ShouldBeFalse(); + partitioning.Partitions.Select(x => x.Suffix).OrderBy(x => x) + .ShouldBe(new []{"blue", "green", "purple", "red"}); + + var players = tables.Single(x => x.Identifier.Name == "players"); + partitioning = players.Partitioning.ShouldBeOfType(); + partitioning.HasExistingDefault.ShouldBeFalse(); + partitioning.Partitions.Select(x => x.Suffix).OrderBy(x => x) + .ShouldBe(new []{"blue", "green", "purple", "red"}); + } } public class ManagedListDatabase: PostgresqlDatabase diff --git a/src/Weasel.Postgresql/Tables/Partitioning/ManagedListPartitions.cs b/src/Weasel.Postgresql/Tables/Partitioning/ManagedListPartitions.cs index 752154e2..024ff9c2 100644 --- a/src/Weasel.Postgresql/Tables/Partitioning/ManagedListPartitions.cs +++ b/src/Weasel.Postgresql/Tables/Partitioning/ManagedListPartitions.cs @@ -83,6 +83,9 @@ public async Task AddPartitionToAllTables(PostgresqlDatabase database, string va await using var conn = database.CreateConnection(); await conn.OpenAsync(token).ConfigureAwait(false); + // This is idempotent, so just do it here + await InitializeAsync(conn, token).ConfigureAwait(false); + await AddPartitionToAllTables(conn, token, value, suffix).ConfigureAwait(false); var tables = database