Skip to content

Commit d9d8aa9

Browse files
committed
Deduplicate choice of horizon for a relation procarray.c.
5a1e1d8 was a minimal bug fix for dc7420c. To avoid future bugs of that kind, deduplicate the choice of a relation's horizon into a new helper, GlobalVisHorizonKindForRel(). As the code in question was only introduced in dc7420c it seems worth backpatching this change as well, otherwise 14 will look different from all other branches. A different approach to this was suggested by Matthias van de Meent. Author: Andres Freund Discussion: https://postgr.es/m/20210621122919.2qhu3pfugxxp3cji@alap3.anarazel.de Backpatch: 14, like 5a1e1d8
1 parent 6310809 commit d9d8aa9

File tree

1 file changed

+66
-35
lines changed

1 file changed

+66
-35
lines changed

src/backend/storage/ipc/procarray.c

Lines changed: 66 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,17 @@ typedef struct ComputeXidHorizonsResult
246246

247247
} ComputeXidHorizonsResult;
248248

249+
/*
250+
* Return value for GlobalVisHorizonKindForRel().
251+
*/
252+
typedef enum GlobalVisHorizonKind
253+
{
254+
VISHORIZON_SHARED,
255+
VISHORIZON_CATALOG,
256+
VISHORIZON_DATA,
257+
VISHORIZON_TEMP
258+
} GlobalVisHorizonKind;
259+
249260

250261
static ProcArrayStruct *procArray;
251262

@@ -1952,6 +1963,33 @@ ComputeXidHorizons(ComputeXidHorizonsResult *h)
19521963
GlobalVisUpdateApply(h);
19531964
}
19541965

1966+
/*
1967+
* Determine what kind of visibility horizon needs to be used for a
1968+
* relation. If rel is NULL, the most conservative horizon is used.
1969+
*/
1970+
static inline GlobalVisHorizonKind
1971+
GlobalVisHorizonKindForRel(Relation rel)
1972+
{
1973+
/*
1974+
* Other relkkinds currently don't contain xids, nor always the necessary
1975+
* logical decoding markers.
1976+
*/
1977+
Assert(!rel ||
1978+
rel->rd_rel->relkind == RELKIND_RELATION ||
1979+
rel->rd_rel->relkind == RELKIND_MATVIEW ||
1980+
rel->rd_rel->relkind == RELKIND_TOASTVALUE);
1981+
1982+
if (rel == NULL || rel->rd_rel->relisshared || RecoveryInProgress())
1983+
return VISHORIZON_SHARED;
1984+
else if (IsCatalogRelation(rel) ||
1985+
RelationIsAccessibleInLogicalDecoding(rel))
1986+
return VISHORIZON_CATALOG;
1987+
else if (!RELATION_IS_LOCAL(rel))
1988+
return VISHORIZON_DATA;
1989+
else
1990+
return VISHORIZON_TEMP;
1991+
}
1992+
19551993
/*
19561994
* Return the oldest XID for which deleted tuples must be preserved in the
19571995
* passed table.
@@ -1970,16 +2008,20 @@ GetOldestNonRemovableTransactionId(Relation rel)
19702008

19712009
ComputeXidHorizons(&horizons);
19722010

1973-
/* select horizon appropriate for relation */
1974-
if (rel == NULL || rel->rd_rel->relisshared || RecoveryInProgress())
1975-
return horizons.shared_oldest_nonremovable;
1976-
else if (IsCatalogRelation(rel) ||
1977-
RelationIsAccessibleInLogicalDecoding(rel))
1978-
return horizons.catalog_oldest_nonremovable;
1979-
else if (RELATION_IS_LOCAL(rel))
1980-
return horizons.temp_oldest_nonremovable;
1981-
else
1982-
return horizons.data_oldest_nonremovable;
2011+
switch (GlobalVisHorizonKindForRel(rel))
2012+
{
2013+
case VISHORIZON_SHARED:
2014+
return horizons.shared_oldest_nonremovable;
2015+
case VISHORIZON_CATALOG:
2016+
return horizons.catalog_oldest_nonremovable;
2017+
case VISHORIZON_DATA:
2018+
return horizons.data_oldest_nonremovable;
2019+
case VISHORIZON_TEMP:
2020+
return horizons.temp_oldest_nonremovable;
2021+
}
2022+
2023+
/* just to prevent compiler warnings */
2024+
return InvalidTransactionId;
19832025
}
19842026

19852027
/*
@@ -3986,38 +4028,27 @@ DisplayXidCache(void)
39864028
GlobalVisState *
39874029
GlobalVisTestFor(Relation rel)
39884030
{
3989-
bool need_shared;
3990-
bool need_catalog;
3991-
GlobalVisState *state;
4031+
GlobalVisState *state = NULL;
39924032

39934033
/* XXX: we should assert that a snapshot is pushed or registered */
39944034
Assert(RecentXmin);
39954035

3996-
if (!rel)
3997-
need_shared = need_catalog = true;
3998-
else
4036+
switch (GlobalVisHorizonKindForRel(rel))
39994037
{
4000-
/*
4001-
* Other kinds currently don't contain xids, nor always the necessary
4002-
* logical decoding markers.
4003-
*/
4004-
Assert(rel->rd_rel->relkind == RELKIND_RELATION ||
4005-
rel->rd_rel->relkind == RELKIND_MATVIEW ||
4006-
rel->rd_rel->relkind == RELKIND_TOASTVALUE);
4007-
4008-
need_shared = rel->rd_rel->relisshared || RecoveryInProgress();
4009-
need_catalog = IsCatalogRelation(rel) || RelationIsAccessibleInLogicalDecoding(rel);
4038+
case VISHORIZON_SHARED:
4039+
state = &GlobalVisSharedRels;
4040+
break;
4041+
case VISHORIZON_CATALOG:
4042+
state = &GlobalVisCatalogRels;
4043+
break;
4044+
case VISHORIZON_DATA:
4045+
state = &GlobalVisDataRels;
4046+
break;
4047+
case VISHORIZON_TEMP:
4048+
state = &GlobalVisTempRels;
4049+
break;
40104050
}
40114051

4012-
if (need_shared)
4013-
state = &GlobalVisSharedRels;
4014-
else if (need_catalog)
4015-
state = &GlobalVisCatalogRels;
4016-
else if (RELATION_IS_LOCAL(rel))
4017-
state = &GlobalVisTempRels;
4018-
else
4019-
state = &GlobalVisDataRels;
4020-
40214052
Assert(FullTransactionIdIsValid(state->definitely_needed) &&
40224053
FullTransactionIdIsValid(state->maybe_needed));
40234054

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy