Re: Potential ABI breakage in upcoming minor releases
Mats Kindahl <mats@timescale.com>
From: Mats Kindahl <mats@timescale.com>
To: Noah Misch <noah@leadboat.com>
Cc: Alvaro Herrera <alvherre@alvh.no-ip.org>, Tom Lane <tgl@sss.pgh.pa.us>, Christoph Berg <myon@debian.org>, Pavan Deolasee <pavan.deolasee@gmail.com>, pgsql-hackers <pgsql-hackers@postgresql.org>
Date: 2024-11-15T13:21:40Z
Lists: pgsql-hackers
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Undo unintentional ABI break in struct ResultRelInfo.
- ee33d58471de 16.6 landed
- 6bfacd368bb4 17.2 landed
- 17db248f318f 15.10 landed
- 099e711b77b8 14.15 landed
-
For inplace update durability, make heap_update() callers wait.
- 51ff46de29f6 16.5 cited
-
Fix btmarkpos/btrestrpos array key wraparound bug.
- 3fa81b62e09b 16.1 cited
-
Fix calculation of which GENERATED columns need to be updated.
- 8cd190e13a22 14.7 cited
On Thu, Nov 14, 2024 at 11:41 PM Noah Misch <noah@leadboat.com> wrote:
> On Thu, Nov 14, 2024 at 09:33:32PM +0100, Alvaro Herrera wrote:
> > On 2024-Nov-14, Tom Lane wrote:
> > > Alvaro Herrera <alvherre@alvh.no-ip.org> writes:
> > > > But timescale did crash:
> > >
> > > So what is timescale doing differently?
>
> > src/ts_catalog/catalog.c-extern TSDLLEXPORT ResultRelInfo *
> > src/ts_catalog/catalog.c-ts_catalog_open_indexes(Relation heapRel)
> > src/ts_catalog/catalog.c-{
> > src/ts_catalog/catalog.c- ResultRelInfo *resultRelInfo;
> > src/ts_catalog/catalog.c-
> > src/ts_catalog/catalog.c: resultRelInfo = makeNode(ResultRelInfo);
> > src/ts_catalog/catalog.c- resultRelInfo->ri_RangeTableIndex = 0; /*
> dummy */
> > src/ts_catalog/catalog.c- resultRelInfo->ri_RelationDesc = heapRel;
> > src/ts_catalog/catalog.c- resultRelInfo->ri_TrigDesc = NULL; /* we
> don't fire triggers */
> > src/ts_catalog/catalog.c-
> > src/ts_catalog/catalog.c- ExecOpenIndices(resultRelInfo, false);
>
> This is a copy of PostgreSQL's CatalogOpenIndexes(). Assuming timescaledb
> uses it like PostgreSQL uses CatalogOpenIndexes(), it's fine.
> Specifically,
> CatalogOpenIndexes() is fine since PostgreSQL does not pass the
> ResultRelInfo
> to ModifyTable.
>
This seems to be old code, so I have replaced it with CatalogOpenIndexes
(and friends) and it seems to work fine.
>
> > Oh, hmm, there's this bit which uses struct assignment into a stack
> > element:
>
> Yes, stack allocation of a ResultRelInfo sounds relevant to the crash. It
> qualifies as a "very unusual code pattern" in the postgr.es/c/e54a42a
> sense.
>
This is a lesson for us to make sure that we have better checks for these
kinds of situations. We should be able to deal with the extension by
allocating, e.g., twice the needed memory for the struct (and make sure to
zero it out). Then there is no risk of stepping on other object's data.
>
>
> I'm hearing the only confirmed impact on non-assert builds is the need to
> recompile timescaledb. (It's unknown whether recompiling will suffice for
> timescaledb. For assert builds, six PGXN extensions need recompilation.)
I re-compiled and ran with the same version on the server and extension and
that seems to work fine. Nothing that stands out. (We have a few other
things that behave strange, so might have to take that back.)
> I don't see us issuing another set of back branch releases for the purpose
> of
> making a v16.4-built timescaledb avoid a rebuild. The target audience
> would
> be someone who can get a new PostgreSQL build but can't get a new
> timescaledb
> build. That feels like a small audience. What's missing in that analysis?
>
> Going forward, for struct field additions, I plan to make my own patches
> more
> ABI-breakage-averse than the postgr.es/c/e54a42a standard.
>
>
>
--
Best wishes,
Mats Kindahl, Timescale