From c246d9758f44e36562a4100df1f7fc60f58e0693 Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Tue, 28 Oct 2025 09:58:26 -0400 Subject: [PATCH 1/5] fix: covering migrations for wrappers across all versions` --- ansible/vars.yml | 6 ++-- nix/ext/wrappers/default.nix | 65 +++++++++++++++++++++++++++++++----- 2 files changed, 60 insertions(+), 11 deletions(-) diff --git a/ansible/vars.yml b/ansible/vars.yml index 8dd127ae3..e7a4f4650 100644 --- a/ansible/vars.yml +++ b/ansible/vars.yml @@ -10,9 +10,9 @@ postgres_major: # Full version strings for each major version postgres_release: - postgresorioledb-17: "17.5.1.051-orioledb" - postgres17: "17.6.1.030" - postgres15: "15.14.1.030" + postgresorioledb-17: "17.5.1.052-orioledb-wmig-1" + postgres17: "17.6.1.031-wmig-1" + postgres15: "15.14.1.031-wmig-1" # Non Postgres Extensions pgbouncer_release: 1.19.0 diff --git a/nix/ext/wrappers/default.nix b/nix/ext/wrappers/default.nix index 620f3cba4..cd30d00ff 100644 --- a/nix/ext/wrappers/default.nix +++ b/nix/ext/wrappers/default.nix @@ -171,7 +171,12 @@ let }; } ); - previouslyPackagedVersions = [ + # All versions that were previously packaged (historical list) + allPreviouslyPackagedVersions = [ + "0.4.3" + "0.4.2" + "0.4.1" + "0.3.0" "0.2.0" "0.1.19" "0.1.18" @@ -191,7 +196,6 @@ let "0.1.1" "0.1.0" ]; - numberOfPreviouslyPackagedVersions = builtins.length previouslyPackagedVersions; allVersions = (builtins.fromJSON (builtins.readFile ../versions.json)).wrappers; supportedVersions = lib.filterAttrs ( _: value: builtins.elem (lib.versions.major postgresql.version) value.postgresql @@ -199,6 +203,12 @@ let versions = lib.naturalSort (lib.attrNames supportedVersions); latestVersion = lib.last versions; numberOfVersions = builtins.length versions; + # Filter out previously packaged versions that are actually built for this PG version + # This prevents double-counting when a version appears in both lists + previouslyPackagedVersions = builtins.filter ( + v: !(builtins.elem v versions) + ) allPreviouslyPackagedVersions; + numberOfPreviouslyPackagedVersions = builtins.length previouslyPackagedVersions; packages = builtins.attrValues ( lib.mapAttrs (name: value: build name value.hash value.rust value.pgrx) supportedVersions ); @@ -231,26 +241,64 @@ buildEnv { } create_migration_sql_files() { + # buildEnv creates symlinks in $out/share/postgresql/extension + # But we need to write new migration files there + # The Nix store is immutable at the path level, so we need to: + # 1. Save all the symlinked files to a temporary location + # 2. Remove the entire symlinked share/postgresql/extension tree + # 3. Recreate it as real directories with actual files (not symlinks) + # 4. Then we can add our migration files + + TEMP_DIR=$(mktemp -d) + + # Copy all existing SQL and control files, dereferencing symlinks + if [ -d "$out/share/postgresql/extension" ]; then + cp -rL $out/share/postgresql/extension/* $TEMP_DIR/ 2>/dev/null || true + # Need to remove from parent and recreate to avoid immutable symlinked structure + chmod -R u+w $out/share/postgresql 2>/dev/null || true + rm -rf $out/share/postgresql/extension + fi + + # Recreate the entire path as real directories + mkdir -p $out/share/postgresql/extension + + # Copy everything back + if [ "$(ls -A $TEMP_DIR 2>/dev/null)" ]; then + cp -r $TEMP_DIR/* $out/share/postgresql/extension/ + fi + PREVIOUS_VERSION="" while IFS= read -r i; do FILENAME=$(basename "$i") - DIRNAME=$(dirname "$i") VERSION="$(grep -oE '[0-9]+\.[0-9]+\.[0-9]+' <<< $FILENAME)" if [[ "$PREVIOUS_VERSION" != "" ]]; then - echo "Processing $i" - MIGRATION_FILENAME="$DIRNAME/''${FILENAME/$VERSION/$PREVIOUS_VERSION--$VERSION}" - cp "$i" "$MIGRATION_FILENAME" + # Always write to $out/share/postgresql/extension, not $DIRNAME + # because $DIRNAME might be a symlinked read-only path from the Nix store + # We use -L with cp to dereference symlinks (copy the actual file content, not the symlink) + MIGRATION_FILENAME="$out/share/postgresql/extension/''${FILENAME/$VERSION/$PREVIOUS_VERSION--$VERSION}" + cp -L "$i" "$MIGRATION_FILENAME" fi PREVIOUS_VERSION="$VERSION" done < <(find $out -name '*.sql' | sort -V) + # Create empty SQL files for previously packaged versions that don't exist + # This compensates for versions that failed to produce SQL files in the past + for prev_version in ${lib.concatStringsSep " " previouslyPackagedVersions}; do + sql_file="$out/share/postgresql/extension/wrappers--$prev_version.sql" + if [ ! -f "$sql_file" ]; then + echo "-- Empty migration file for previously packaged version $prev_version" > "$sql_file" + fi + done + # Create migration SQL files from previous versions to newer versions + # Skip if the migration file already exists (to avoid conflicts with the first loop) for prev_version in ${lib.concatStringsSep " " previouslyPackagedVersions}; do for curr_version in ${lib.concatStringsSep " " versions}; do if [[ "$(printf '%s\n%s' "$prev_version" "$curr_version" | sort -V | head -n1)" == "$prev_version" ]] && [[ "$prev_version" != "$curr_version" ]]; then main_sql_file="$out/share/postgresql/extension/wrappers--$curr_version.sql" - if [ -f "$main_sql_file" ]; then - new_file="$out/share/postgresql/extension/wrappers--$prev_version--$curr_version.sql" + new_file="$out/share/postgresql/extension/wrappers--$prev_version--$curr_version.sql" + # Only create if it doesn't already exist (first loop may have created it) + if [ -f "$main_sql_file" ] && [ ! -f "$new_file" ]; then cp "$main_sql_file" "$new_file" sed -i 's|$libdir/wrappers-[0-9.]*|$libdir/wrappers|g' "$new_file" fi @@ -263,6 +311,7 @@ buildEnv { create_lib_files create_migration_sql_files + # Verify library count matches expected (test "$(ls -A $out/lib/${pname}*${postgresql.dlSuffix} | wc -l)" = "${ toString (numberOfVersions + numberOfPreviouslyPackagedVersions + 1) }") From f6befeee3b643625acfbc285fba8c03d0eca0f58 Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Tue, 28 Oct 2025 10:18:32 -0400 Subject: [PATCH 2/5] chore: remove comment --- nix/ext/wrappers/default.nix | 7 ------- 1 file changed, 7 deletions(-) diff --git a/nix/ext/wrappers/default.nix b/nix/ext/wrappers/default.nix index cd30d00ff..f24af58de 100644 --- a/nix/ext/wrappers/default.nix +++ b/nix/ext/wrappers/default.nix @@ -241,13 +241,6 @@ buildEnv { } create_migration_sql_files() { - # buildEnv creates symlinks in $out/share/postgresql/extension - # But we need to write new migration files there - # The Nix store is immutable at the path level, so we need to: - # 1. Save all the symlinked files to a temporary location - # 2. Remove the entire symlinked share/postgresql/extension tree - # 3. Recreate it as real directories with actual files (not symlinks) - # 4. Then we can add our migration files TEMP_DIR=$(mktemp -d) From ab89448fbe4a44566e5ee3d48bd2475622bdf67f Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Tue, 28 Oct 2025 10:23:47 -0400 Subject: [PATCH 3/5] fix: remove copy and deref --- nix/ext/wrappers/default.nix | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/nix/ext/wrappers/default.nix b/nix/ext/wrappers/default.nix index f24af58de..4b6f6ab8b 100644 --- a/nix/ext/wrappers/default.nix +++ b/nix/ext/wrappers/default.nix @@ -242,23 +242,6 @@ buildEnv { create_migration_sql_files() { - TEMP_DIR=$(mktemp -d) - - # Copy all existing SQL and control files, dereferencing symlinks - if [ -d "$out/share/postgresql/extension" ]; then - cp -rL $out/share/postgresql/extension/* $TEMP_DIR/ 2>/dev/null || true - # Need to remove from parent and recreate to avoid immutable symlinked structure - chmod -R u+w $out/share/postgresql 2>/dev/null || true - rm -rf $out/share/postgresql/extension - fi - - # Recreate the entire path as real directories - mkdir -p $out/share/postgresql/extension - - # Copy everything back - if [ "$(ls -A $TEMP_DIR 2>/dev/null)" ]; then - cp -r $TEMP_DIR/* $out/share/postgresql/extension/ - fi PREVIOUS_VERSION="" while IFS= read -r i; do From d409783178839cb949c6808501a744486181142b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Roche?= Date: Tue, 28 Oct 2025 16:09:08 +0100 Subject: [PATCH 4/5] Always run in-place upgrade extension in default nixos tests We do not want to uninstall and install the extension during an upgrade test. --- nix/ext/tests/default.nix | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/nix/ext/tests/default.nix b/nix/ext/tests/default.nix index 51c22ff0e..523b1d351 100644 --- a/nix/ext/tests/default.nix +++ b/nix/ext/tests/default.nix @@ -131,7 +131,6 @@ let "17": [${lib.concatStringsSep ", " (map (s: ''"${s}"'') (versions "17"))}], } extension_name = "${pname}" - support_upgrade = False pg17_configuration = "${pg17-configuration}" ext_has_background_worker = ${ if (installedExtension "15") ? hasBackgroundWorker then "True" else "False" @@ -146,7 +145,7 @@ let server.wait_for_unit("multi-user.target") server.wait_for_unit("postgresql.service") - test = PostgresExtensionTest(server, extension_name, versions, sql_test_directory, support_upgrade) + test = PostgresExtensionTest(server, extension_name, versions, sql_test_directory) with subtest("Check upgrade path with postgresql 15"): test.check_upgrade_path("15") From efb4325b460b21421ce87d2d916624625fccd7c8 Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Tue, 28 Oct 2025 11:46:47 -0400 Subject: [PATCH 5/5] chore: bump to release --- ansible/vars.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ansible/vars.yml b/ansible/vars.yml index e7a4f4650..f4d939a82 100644 --- a/ansible/vars.yml +++ b/ansible/vars.yml @@ -10,9 +10,9 @@ postgres_major: # Full version strings for each major version postgres_release: - postgresorioledb-17: "17.5.1.052-orioledb-wmig-1" - postgres17: "17.6.1.031-wmig-1" - postgres15: "15.14.1.031-wmig-1" + postgresorioledb-17: "17.5.1.052-orioledb" + postgres17: "17.6.1.031" + postgres15: "15.14.1.031" # Non Postgres Extensions pgbouncer_release: 1.19.0