Skip to content

[Feature]: Support in-place major upgrades with Image Volume extensions #10049

Closed

Description

@NiccoloFei

Is there an existing issue already for this feature request/idea?

  • I have searched for an existing issue, and could not find anything. I believe this is a new feature request to be evaluated.

What problem is this feature going to solve? Why should it be added?

Add support for offline in-place major upgrades for Clusters using Image Volume Extensions.

This patch is a follow up of #7991 & #8495.
Given that Image Volume extensions are only usable on PostgreSQL 18 or greater, this patch won't be required until PostgreSQL 19 (or 19RC) is out.

This patch would be required to allow Clusters that utilize Image Volume Extensions to upgrade to a newer PG major version by using
offline in-place major upgrades (e.g via pg_upgrade).

Describe the solution you'd like

What's needed

From CloudNativePG

  1. Modify createMajorUpgradeJobDefinition() to properly define the upgrade job that runs pg_upgrade. In detail:

    • The upgrade prepare initContainer should mount ImageVolume extensions of the old major version
    • The upgrade execute container should mount ImageVolume extensions of both old and new major versions
  2. Modify the majorUpgradeCommand to support adding extra pg_upgrade options. pg_upgrade support passing configuration to either the new or old postgres command via --old-options and --new-options. This will be required to allow the instances that are being spun up by pg_upgrade to properly find extensions and libraries, configuring these options in the following way:

--old-options="-c extension_control_path='$system:/extensions/old-extension/share' -c dynamic_library_path='$libdir:/extensions/old-extension/lib'"
--new-options="-c extension_control_path='$system:/extensions/new-extension/share' -c dynamic_library_path='$libdir:/extensions/new-extension/lib'"

From core PostgreSQL

Links:

It appears that pg_upgrade is unable perform a major upgrade when the PostgreSQL instance has extensions that are being installed from a non-default path (via dynamic_library_path / extension_control_path).

The check_loadable_libraries() function tries to load each library by running LOAD <lib> (where <lib> equals to the value of the extension's module_pathname inside its control file), which in almost all cases is defined as '$libdir/<extname>' (for example '$libdir/vector').

As such, if the library in question is not present in the default $libdir, the upgrade will fail with:

Checking for presence of required libraries                   fatal

Your installation references loadable libraries that are missing from the
new installation.  You can add these libraries to the new installation,
or remove the functions using them from the old installation.  A list of
problem libraries is in the file:
    /var/lib/postgresql/data/pgdata-new/pg_upgrade_output.d/20260217T151616.481/loadable_libraries.txt
Failure, exiting
postgres@cluster-example-1-major-upgrade:~/data/pgdata-new$ cat /var/lib/postgresql/data/pgdata-new/pg_upgrade_output.d/20260217T151616.481/loadable_libraries.txt
could not load library "$libdir/vector": ERROR:  could not access file "$libdir/vector": No such file or directory
In database: app

The expected behavior is that, after configuring the pg_upgrade command with the proper GUCs to allow locating extensions from "extra" PATHs, pg_upgrade would be able to LOAD all extensions and properly perform the major upgrade.

Describe alternatives you've considered

Do not allow upgrading Clusters that use Image Volume Extensions via offline in-place major upgrades.
Users will have to rely on one of the other Major version upgrade methods, such as dump/restore or using logical replication.

Additional context

No response

Backport?

No

Are you willing to actively contribute to this feature?

Yes

Code of Conduct

  • I agree to follow this project's Code of Conduct

Activity

  1. github-actions commented on May 5, 2026

    @github-actions
    Contributor

    This issue is stale because it has been open for 60 days with no activity.

  2. AntonOfTheWoods commented on May 5, 2026

    @AntonOfTheWoods

    I definitely think this is still relevant

  3. moved this to In Progress in Roadmapon May 29, 2026
  4. added this to the 1.31.0 milestone on May 29, 2026
  5. moved this from In Progress to Done in Roadmapon Jun 16, 2026
  6. added a commit that references this issue on Jun 16, 2026
    12f0a32
  7. added a commit that references this issue on Jun 16, 2026
    ca62cc5
  8. modified the milestones: 1.31.0, 1.30.0 on Jul 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions