aboutsummaryrefslogtreecommitdiff
path: root/src/backend/storage/large_object/inv_api.c
diff options
context:
space:
mode:
authorAlvaro Herrera <alvherre@alvh.no-ip.org>2008-12-04 14:51:02 +0000
committerAlvaro Herrera <alvherre@alvh.no-ip.org>2008-12-04 14:51:02 +0000
commit7b640b0345dc4fbd39ff568700985b432f6afa07 (patch)
treebf19fbefd12623fd923cc9fcfc51e41767ad50b2 /src/backend/storage/large_object/inv_api.c
parent30c52532d2fe9dfc915ae1292f03adf7d033816b (diff)
downloadpostgresql-7b640b0345dc4fbd39ff568700985b432f6afa07.tar.gz
postgresql-7b640b0345dc4fbd39ff568700985b432f6afa07.zip
Fix a couple of snapshot management bugs in the new ResourceOwner world:
non-writable large objects need to have their snapshots registered on the transaction resowner, not the current portal's, because it must persist until the large object is closed (which the portal does not). Also, ensure that the serializable snapshot is recorded by the transaction resource owner too, even when a subtransaction has changed the current resource owner before serializable is taken. Per bug reports from Pavan Deolasee.
Diffstat (limited to 'src/backend/storage/large_object/inv_api.c')
-rw-r--r--src/backend/storage/large_object/inv_api.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/backend/storage/large_object/inv_api.c b/src/backend/storage/large_object/inv_api.c
index 3936260e6cf..14f101adb34 100644
--- a/src/backend/storage/large_object/inv_api.c
+++ b/src/backend/storage/large_object/inv_api.c
@@ -24,7 +24,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/storage/large_object/inv_api.c,v 1.135 2008/11/02 01:45:28 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/storage/large_object/inv_api.c,v 1.136 2008/12/04 14:51:02 alvherre Exp $
*
*-------------------------------------------------------------------------
*/
@@ -247,7 +247,13 @@ inv_open(Oid lobjId, int flags, MemoryContext mcxt)
}
else if (flags & INV_READ)
{
- retval->snapshot = RegisterSnapshot(GetActiveSnapshot());
+ /*
+ * We must register the snapshot in TopTransaction's resowner,
+ * because it must stay alive until the LO is closed rather than until
+ * the current portal shuts down.
+ */
+ retval->snapshot = RegisterSnapshotOnOwner(GetActiveSnapshot(),
+ TopTransactionResourceOwner);
retval->flags = IFS_RDLOCK;
}
else
@@ -270,8 +276,11 @@ void
inv_close(LargeObjectDesc *obj_desc)
{
Assert(PointerIsValid(obj_desc));
+
if (obj_desc->snapshot != SnapshotNow)
- UnregisterSnapshot(obj_desc->snapshot);
+ UnregisterSnapshotFromOwner(obj_desc->snapshot,
+ TopTransactionResourceOwner);
+
pfree(obj_desc);
}