diff options
| author | Tom Lane <tgl@sss.pgh.pa.us> | 2001-09-29 15:29:48 +0000 |
|---|---|---|
| committer | Tom Lane <tgl@sss.pgh.pa.us> | 2001-09-29 15:29:48 +0000 |
| commit | 2a314add00c2d78d0fcf21a144292407b8652613 (patch) | |
| tree | 0175270eb3214c9c46e1e2b7392de11892efee65 /src/backend/storage/ipc/sinval.c | |
| parent | 6fdf7bed60cc87567c1f5f99a63b511715efa839 (diff) | |
Whoops, I was a tad too enthusiastic about using shared lock mode for
SInvalLock. GetSnapshotData(true) has to use exclusive lock, since
it sets MyProc->xmin.
Diffstat (limited to 'src/backend/storage/ipc/sinval.c')
| -rw-r--r-- | src/backend/storage/ipc/sinval.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/src/backend/storage/ipc/sinval.c b/src/backend/storage/ipc/sinval.c index 24506b9729a..4a3b1114a90 100644 --- a/src/backend/storage/ipc/sinval.c +++ b/src/backend/storage/ipc/sinval.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/storage/ipc/sinval.c,v 1.41 2001/09/29 04:02:24 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/storage/ipc/sinval.c,v 1.42 2001/09/29 15:29:48 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -310,19 +310,24 @@ GetSnapshotData(bool serializable) if (snapshot == NULL) elog(ERROR, "Memory exhausted in GetSnapshotData"); - snapshot->xmin = GetCurrentTransactionId(); - - LWLockAcquire(SInvalLock, LW_SHARED); - /* - * There can be no more than lastBackend active transactions, so this - * is enough space: + * Allocating space for MaxBackends xids is usually overkill; + * lastBackend would be sufficient. But it seems better to do the + * malloc while not holding the lock, so we can't look at lastBackend. */ snapshot->xip = (TransactionId *) - malloc(segP->lastBackend * sizeof(TransactionId)); + malloc(MaxBackends * sizeof(TransactionId)); if (snapshot->xip == NULL) elog(ERROR, "Memory exhausted in GetSnapshotData"); + snapshot->xmin = GetCurrentTransactionId(); + + /* + * If we are going to set MyProc->xmin then we'd better get exclusive + * lock; if not, this is a read-only operation so it can be shared. + */ + LWLockAcquire(SInvalLock, serializable ? LW_EXCLUSIVE : LW_SHARED); + /*-------------------- * Unfortunately, we have to call ReadNewTransactionId() after acquiring * SInvalLock above. It's not good because ReadNewTransactionId() does |
