From: | "David E(dot) Wheeler" <david(at)justatheory(dot)com> |
---|---|
To: | PostgreSQL Hackers <pgsql-hackers(at)postgresql(dot)org> |
Cc: | Gabriele Bartolini <gabriele(dot)bartolini(at)enterprisedb(dot)com>, Peter Eisentraut <peter(at)eisentraut(dot)org>, Christoph Berg <myon(at)debian(dot)org>, Andres Freund <andres(at)anarazel(dot)de> |
Subject: | Re: RFC: Extension Packaging & Lookup |
Date: | 2024-10-31 19:41:27 |
Message-ID: | 0ADD494C-83D3-42DA-B2F6-E6E435181B3D@justatheory.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
Fellow Humans,
I’m working on an updated proposal with more detail, and more comprehensive. But I keep getting a bit caught up on this bit:
On Oct 28, 2024, at 18:19, David E. Wheeler <david(at)justatheory(dot)com> wrote:
>> * Binary-only extensions might also be installed here; the difference is they have no control file. The LOAD command and shared_preload_libraries would need to know to look here, too.
>
> Or perhaps we should require a control file for these, too, but add a “type” key or some such? Maybe such a shared module could be supported by CREATE EXTENSION, as well as, but not include SQL files?
I’m trying to imagine how this ought to work. The challenge is that, with the layout I propose here, shared module files will no longer always be in `$dynamic_library_path`, but in any `$extension/pkglib` subdirectory of each subdirectory of `extension_path`, as well. Is that desirable?
Let’s say we want to load a module named “semver” that’s included in the semver extension. With the proposed organization up-thread, the module would be installed in:
```
$extdir_user/semver/pkglib/semver.(so|dylib|dll|etc)
```
What should be passed to preload/LOAD to load it? A few options:
Option 1
--------
* Specify the module name “semver” in the `LOAD` command or in
`*_preload_libraries` (same as in 17 and earlier)
* Teach the preload/LOAD code to search for the module file in `*/pkglib/`
under each extension path
Pros:
* Follows the existing module name specification in preload/LOAD
Cons:
* Potentially huge number of directories to search, when lots of extension
are installed.
* Depending on search order, the wrong module may be loaded if two
extensions have a module file with the same name
Option 2
--------
* Specify the module name to include the extension name. Perhaps something
like `$extension:$module`.
* Teach the preload/LOAD code to detect the extension name as part of the
command and only look for the DSO in that extension's `pkglibdir`.
Pros:
* Searches at most the list of directories in the `extension_path`.
* No conflicts with any other module files from other extensions.
Cons:
* Overloads the meaning of preload/LOAD strings, which might be confusing to
some.
* Upgrades might need these values to change from the old to the new syntax.
Other Options?
--------------
I kind of like Option 2, as it would allow us to eventually support non-`CREATE EXTENSION` modules as extensions, too. I imagine distributing, say `auto_explain` in an extension directory of its own, with a `auto_explain.control` file that identifies it as a LOAD-only extension. Then specifying `auto_explain:auto_explain` would work as expected. Or perhaps just `auto_explain:` could load *all* the modules included in the auto_explain "extension".
But then maybe I'm starting to talk myself into arguing that `LOAD` ought to be deprecated, `CREATE EXTENSION` could support non-SQL extensions, and the `*preload*` GUCs would contain a list of extensions rather than module files.
But I digress. Any ideas about other options to address this design challenge?
Thanks,
David
From | Date | Subject | |
---|---|---|---|
Next Message | Nathan Bossart | 2024-10-31 19:45:02 | Re: Time to add a Git .mailmap? |
Previous Message | Thom Brown | 2024-10-31 19:25:11 | Re: MultiXact\SLRU buffers configuration |