diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/access/heap/tuptoaster.c | 8 | ||||
-rw-r--r-- | src/backend/catalog/catalog.c | 15 |
2 files changed, 12 insertions, 11 deletions
diff --git a/src/backend/access/heap/tuptoaster.c b/src/backend/access/heap/tuptoaster.c index 546f80f05ca..cd42c50b09c 100644 --- a/src/backend/access/heap/tuptoaster.c +++ b/src/backend/access/heap/tuptoaster.c @@ -1794,7 +1794,9 @@ toast_delete_datum(Relation rel, Datum value, bool is_speculative) /* ---------- * toastrel_valueid_exists - * - * Test whether a toast value with the given ID exists in the toast relation + * Test whether a toast value with the given ID exists in the toast relation. + * For safety, we consider a value to exist if there are either live or dead + * toast rows with that ID; see notes for GetNewOid(). * ---------- */ static bool @@ -1806,7 +1808,6 @@ toastrel_valueid_exists(Relation toastrel, Oid valueid) int num_indexes; int validIndex; Relation *toastidxs; - SnapshotData SnapshotToast; /* Fetch a valid index relation */ validIndex = toast_open_indexes(toastrel, @@ -1825,10 +1826,9 @@ toastrel_valueid_exists(Relation toastrel, Oid valueid) /* * Is there any such chunk? */ - init_toast_snapshot(&SnapshotToast); toastscan = systable_beginscan(toastrel, RelationGetRelid(toastidxs[validIndex]), - true, &SnapshotToast, 1, &toastkey); + true, SnapshotAny, 1, &toastkey); if (systable_getnext(toastscan) != NULL) result = true; diff --git a/src/backend/catalog/catalog.c b/src/backend/catalog/catalog.c index 809749add90..2292deb703a 100644 --- a/src/backend/catalog/catalog.c +++ b/src/backend/catalog/catalog.c @@ -282,8 +282,12 @@ IsSharedRelation(Oid relationId) * managed to cycle through 2^32 OIDs and generate the same OID before we * finish inserting our row. This seems unlikely to be a problem. Note * that if we had to *commit* the row to end the race condition, the risk - * would be rather higher; therefore we use SnapshotDirty in the test, - * so that we will see uncommitted rows. + * would be rather higher; therefore we use SnapshotAny in the test, so that + * we will see uncommitted rows. (We used to use SnapshotDirty, but that has + * the disadvantage that it ignores recently-deleted rows, creating a risk + * of transient conflicts for as long as our own MVCC snapshots think a + * recently-deleted row is live. The risk is far higher when selecting TOAST + * OIDs, because SnapshotToast considers dead rows as active indefinitely.) */ Oid GetNewOid(Relation relation) @@ -336,7 +340,6 @@ Oid GetNewOidWithIndex(Relation relation, Oid indexId, AttrNumber oidcolumn) { Oid newOid; - SnapshotData SnapshotDirty; SysScanDesc scan; ScanKeyData key; bool collides; @@ -349,8 +352,6 @@ GetNewOidWithIndex(Relation relation, Oid indexId, AttrNumber oidcolumn) */ Assert(!IsBinaryUpgrade || RelationGetRelid(relation) != TypeRelationId); - InitDirtySnapshot(SnapshotDirty); - /* Generate new OIDs until we find one not in the table */ do { @@ -363,9 +364,9 @@ GetNewOidWithIndex(Relation relation, Oid indexId, AttrNumber oidcolumn) BTEqualStrategyNumber, F_OIDEQ, ObjectIdGetDatum(newOid)); - /* see notes above about using SnapshotDirty */ + /* see notes above about using SnapshotAny */ scan = systable_beginscan(relation, indexId, true, - &SnapshotDirty, 1, &key); + SnapshotAny, 1, &key); collides = HeapTupleIsValid(systable_getnext(scan)); |