Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
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

+66-35
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)