Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 65 additions & 0 deletions Darling/Darling.Tests/ManagedConfMigrationRunnerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -562,4 +562,69 @@ public async Task RunStepA_DroppedProductKey_CarriedIntoManagedConf_Verifies()
var managedText = File.ReadAllText(Path.Combine(_dataDir, ManagedConfFile.FileName));
Assert.Contains("min_wal_size = '2048MB'", managedText, StringComparison.Ordinal);
}

/// <summary>Pin (#4336): a carried <c>maintenance_work_mem</c> — present in the BEFORE
/// snapshot at a pre-#3909 <c>2048MB</c>, which this render does not itself derive (v7's own value is
/// smaller here) — goes through the same <c>NeedsLegacyMaintenanceWorkMemCap</c> predicate
/// <see cref="ManagedConfFile.RenderBody"/>'s v14 block uses, so PostgreSQL 17 never receives an
/// uncapped value it rejects on start.</summary>
[Fact]
public async Task RunStepA_CarriedMaintenanceWorkMemOver2047_Postgres17_Caps()
{
WriteConf("# base conf\nmaintenance_work_mem = '2048MB'\n");

var inputs = SampleInputs() with { PostgresMajor = 17 };
var derived = DerivedValues(inputs);

var beforeRows = new List<FileSettingRow>();
foreach (var kvp in derived)
{
var value = kvp.Key == DarlingManagedPostgres.MaintenanceWorkMemSetting ? "2048MB" : kvp.Value;
beforeRows.Add(Applied(kvp.Key, value));
}

Func<CancellationToken, Task<IReadOnlyList<FileSettingRow>>> snapshot = _ =>
Task.FromResult<IReadOnlyList<FileSettingRow>>(beforeRows);

var logger = new CapturingTestLogger();
var outcome = await ManagedConfMigrationRunner.RunStepA(
_dataDir, snapshot, derived, inputs, inputs.Port, UtcNow, logger, CancellationToken.None);

Assert.Equal(ManagedConfVerificationStatus.Verified, outcome.Status);

var managedText = File.ReadAllText(Path.Combine(_dataDir, ManagedConfFile.FileName));
Assert.Contains(
$"maintenance_work_mem = '{DarlingManagedPostgres.MaintenanceWorkMemCapMb}MB'", managedText, StringComparison.Ordinal);
Assert.DoesNotContain("maintenance_work_mem = '2048MB'", managedText, StringComparison.Ordinal);
}

/// <summary>Pin: the same carried <c>2048MB</c> on PostgreSQL 18 is kept exactly — the cap is major-aware,
/// same as <see cref="DarlingManagedPostgres.NeedsLegacyMaintenanceWorkMemCap"/> itself.</summary>
[Fact]
public async Task RunStepA_CarriedMaintenanceWorkMemOver2047_Postgres18_KeepsIt()
{
WriteConf("# base conf\nmaintenance_work_mem = '2048MB'\n");

var inputs = SampleInputs() with { PostgresMajor = 18 };
var derived = DerivedValues(inputs);

var beforeRows = new List<FileSettingRow>();
foreach (var kvp in derived)
{
var value = kvp.Key == DarlingManagedPostgres.MaintenanceWorkMemSetting ? "2048MB" : kvp.Value;
beforeRows.Add(Applied(kvp.Key, value));
}

Func<CancellationToken, Task<IReadOnlyList<FileSettingRow>>> snapshot = _ =>
Task.FromResult<IReadOnlyList<FileSettingRow>>(beforeRows);

var logger = new CapturingTestLogger();
var outcome = await ManagedConfMigrationRunner.RunStepA(
_dataDir, snapshot, derived, inputs, inputs.Port, UtcNow, logger, CancellationToken.None);

Assert.Equal(ManagedConfVerificationStatus.Verified, outcome.Status);

var managedText = File.ReadAllText(Path.Combine(_dataDir, ManagedConfFile.FileName));
Assert.Contains("maintenance_work_mem = '2048MB'", managedText, StringComparison.Ordinal);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,18 @@ internal static async Task<ManagedConfMigrationOutcome> RunStepA(
}
}

/* #4336: a carried maintenance_work_mem goes through the SAME cap ManagedConfFile.RenderBody's
v14 block uses for a freshly derived value — NeedsLegacyMaintenanceWorkMemCap over this running major,
MaintenanceWorkMemCapMb as the ceiling — so a pre-#3909 2048MB BEFORE snapshot lands in
darling-managed.conf capped, not carried verbatim into a value PostgreSQL 17 and earlier reject. */
var postgresMajorForCap = inputs.PostgresMajor > 0 ? inputs.PostgresMajor : (int?)null;
if (beforeValues.TryGetValue(DarlingManagedPostgres.MaintenanceWorkMemSetting, out var maintenanceWorkMemBefore)
&& DarlingManagedPostgres.NeedsLegacyMaintenanceWorkMemCap(postgresMajorForCap, maintenanceWorkMemBefore))
{
beforeValues[DarlingManagedPostgres.MaintenanceWorkMemSetting] =
FormattableString.Invariant($"{DarlingManagedPostgres.MaintenanceWorkMemCapMb}MB");
}

var postgresqlConfText = File.ReadAllText(postgresqlConfPath);
var rewrite = ManagedConfMigration.Rewrite(postgresqlConfText, derived, port);

Expand Down
Loading