Fix race condition in statext_store().
Must hold some lock on the pg_statistic_ext_data catalog *before* we look up the tuple we aim to replace. Otherwise a concurrent VACUUM FULL or similar operation could move it to a different TID, leaving us trying to replace the wrong tuple. Back-patch to v12 where this got broken. Credit goes to Dean Rasheed; I'm just doing the clerical work. Discussion: https://postgr.es/m/CAEZATCU0zHMDiQV0g8P2U+YSP9C1idUPrn79DajsbonwkN0xvQ@mail.gmail.com
This commit is contained in:
parent
33cd0e5ea6
commit
fe3036527a
|
@ -493,12 +493,14 @@ statext_store(Oid statOid,
|
|||
MVNDistinct *ndistinct, MVDependencies *dependencies,
|
||||
MCVList *mcv, VacAttrStats **stats)
|
||||
{
|
||||
Relation pg_stextdata;
|
||||
HeapTuple stup,
|
||||
oldtup;
|
||||
Datum values[Natts_pg_statistic_ext_data];
|
||||
bool nulls[Natts_pg_statistic_ext_data];
|
||||
bool replaces[Natts_pg_statistic_ext_data];
|
||||
Relation pg_stextdata;
|
||||
|
||||
pg_stextdata = table_open(StatisticExtDataRelationId, RowExclusiveLock);
|
||||
|
||||
memset(nulls, true, sizeof(nulls));
|
||||
memset(replaces, false, sizeof(replaces));
|
||||
|
@ -542,8 +544,6 @@ statext_store(Oid statOid,
|
|||
elog(ERROR, "cache lookup failed for statistics object %u", statOid);
|
||||
|
||||
/* replace it */
|
||||
pg_stextdata = table_open(StatisticExtDataRelationId, RowExclusiveLock);
|
||||
|
||||
stup = heap_modify_tuple(oldtup,
|
||||
RelationGetDescr(pg_stextdata),
|
||||
values,
|
||||
|
|
Loading…
Reference in a new issue