Re: Collation version tracking for macOS - Mailing list pgsql-hackers
From | Jeff Davis |
---|---|
Subject | Re: Collation version tracking for macOS |
Date | |
Msg-id | 378df4dd8eac41fcfe78a552e5e08ebb7c041455.camel@j-davis.com Whole thread Raw |
In response to | Re: Collation version tracking for macOS (Robert Haas <robertmhaas@gmail.com>) |
Responses |
Re: Collation version tracking for macOS
Re: Collation version tracking for macOS |
List | pgsql-hackers |
On Sun, 2024-02-11 at 22:04 +0530, Robert Haas wrote: > 1. Here's what we think your OS package manager is probably going to > do. > 2. That's going to interact with PostgreSQL in this way that I will > now describe. > 3. See, that sucks, because of the stuff I said above about needing > stable collations! > 4. But if you installed this module instead, then you could prevent > the things I said under #2 from happening. > 5. Instead, you'd get this other behavior, which would make you > happy. I like that framing, thank you. I'll try to come up with something there. > I feel like I can almost piece together in my head how this is > supposed to work -- I think it's like "we expect the OS package > manager to drop all the ICU versions in the same directory via side > by > side installs, and that works well for other programs because ... for > some mysterious reason they can latch onto the specific version they > were linked against ... but we can't or don't do that because ... I > guess we're dumber than those other pieces of software or > something???? ... Postgres can and does latch on to the version of ICU it was compiled against. It's a normal shared library dependency. The problem is that databases -- and the file structures -- outlive a particular version of Postgres. So if Postgres 16 is compiled against ICU X and Postgres 17 is compiled against ICU Y, how do you upgrade from 16 to 17? Postgres 17 will try to access the old file structures using ICU Y, and they'll be corrupt. What we want is the file structures that depend on ICU X to continue to find ICU X even after you upgrade to Postgres 17, yet allow new structures to be created using ICU Y. In other words, "multi-lib", meaning that the same Postgres binary is linking to multiple versions of ICU and the different versions for different structures. That would allow users to recreate one index at a time to use ICU Y, until nothing depends on ICU X any longer. I should say this is not an easy process even if something like icu_multilib is available. We don't have all of the information needed in the catalog to track which structures depend on which versions of a collation library, collation library version is itself not easy to define, and it still involves rebuilding (or at least re-validating) a lot of structures. This is a "make hard things possible" tool, and I suspect only a handful of users would use it successfully to migrate to new ICU versions. More simply, some users might just want to lock down the version of ICU to X, and just use that forever until they have a reason to change it. icu_multilib can also facilitate that, though it's still not trivial. > "icu_multilib must be loaded via shared_preload_libraries. > icu_multilib ignores any ICU library with a major version greater > than > that with which PostgreSQL was built." > > It's not clear from reading this whether the second sentence here is > a > regrettable implementation restriction or design behavior. If it's > design behavior, what's the point of it? That restriction came from Thomas's (uncommitted) work on the same problem. I believe the reasoning was that we don't know whether future versions of ICU might break something that we're doing, though perhaps there's a better way. Regards, Jeff Davis
pgsql-hackers by date: