aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/access/nbtree/nbtxlog.c34
-rw-r--r--src/backend/storage/ipc/procarray.c5
-rw-r--r--src/backend/storage/ipc/standby.c6
3 files changed, 22 insertions, 23 deletions
diff --git a/src/backend/access/nbtree/nbtxlog.c b/src/backend/access/nbtree/nbtxlog.c
index 0d342eeb85f..7b5b27315e5 100644
--- a/src/backend/access/nbtree/nbtxlog.c
+++ b/src/backend/access/nbtree/nbtxlog.c
@@ -8,7 +8,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/access/nbtree/nbtxlog.c,v 1.66 2010/04/19 17:54:48 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/access/nbtree/nbtxlog.c,v 1.67 2010/04/22 08:04:24 sriggs Exp $
*
*-------------------------------------------------------------------------
*/
@@ -578,10 +578,18 @@ btree_xlog_delete_get_latestRemovedXid(XLogRecord *record)
OffsetNumber hoffnum;
TransactionId latestRemovedXid = InvalidTransactionId;
TransactionId htupxid = InvalidTransactionId;
- int num_unused = 0, num_redirect = 0, num_dead = 0;
int i;
/*
+ * If there's nothing running on the standby we don't need to derive
+ * a full latestRemovedXid value, so use a fast path out of here.
+ * That returns InvalidTransactionId, and so will conflict with
+ * users, but since we just worked out that's zero people, its OK.
+ */
+ if (CountDBBackends(InvalidOid) == 0)
+ return latestRemovedXid;
+
+ /*
* Get index page
*/
ibuffer = XLogReadBuffer(xlrec->node, xlrec->block, false);
@@ -629,7 +637,6 @@ btree_xlog_delete_get_latestRemovedXid(XLogRecord *record)
*/
while (ItemIdIsRedirected(hitemid))
{
- num_redirect++;
hoffnum = ItemIdGetRedirect(hitemid);
hitemid = PageGetItemId(hpage, hoffnum);
CHECK_FOR_INTERRUPTS();
@@ -662,25 +669,23 @@ btree_xlog_delete_get_latestRemovedXid(XLogRecord *record)
* marked on LP_NORMAL items. So we just ignore this item and move
* onto the next, for the purposes of calculating latestRemovedxids.
*/
- num_dead++;
}
else
- {
Assert(!ItemIdIsUsed(hitemid));
- num_unused++;
- }
UnlockReleaseBuffer(hbuffer);
}
UnlockReleaseBuffer(ibuffer);
- Assert(num_unused == 0);
-
/*
* Note that if all heap tuples were LP_DEAD then we will be
- * returning InvalidTransactionId here. This seems very unlikely
- * in practice.
+ * returning InvalidTransactionId here. That can happen if we are
+ * re-replaying this record type, though that will be before the
+ * consistency point and will not cause problems. It should
+ * happen very rarely after the consistency point, though note
+ * that we can't tell the difference between this and the fast
+ * path exit above. May need to change that in future.
*/
return latestRemovedXid;
}
@@ -963,13 +968,6 @@ btree_redo(XLogRecPtr lsn, XLogRecord *record)
TransactionId latestRemovedXid = btree_xlog_delete_get_latestRemovedXid(record);
xl_btree_delete *xlrec = (xl_btree_delete *) XLogRecGetData(record);
- /*
- * XXX Currently we put everybody on death row, because
- * currently _bt_delitems() supplies InvalidTransactionId.
- * This can be fairly painful, so providing a better value
- * here is worth some thought and possibly some effort to
- * improve.
- */
ResolveRecoveryConflictWithSnapshot(latestRemovedXid, xlrec->node);
}
break;
diff --git a/src/backend/storage/ipc/procarray.c b/src/backend/storage/ipc/procarray.c
index 9aef06fca78..2dde056a979 100644
--- a/src/backend/storage/ipc/procarray.c
+++ b/src/backend/storage/ipc/procarray.c
@@ -37,7 +37,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/storage/ipc/procarray.c,v 1.65 2010/04/21 19:08:14 sriggs Exp $
+ * $PostgreSQL: pgsql/src/backend/storage/ipc/procarray.c,v 1.66 2010/04/22 08:04:25 sriggs Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1839,7 +1839,8 @@ CountDBBackends(Oid databaseid)
if (proc->pid == 0)
continue; /* do not count prepared xacts */
- if (proc->databaseId == databaseid)
+ if (!OidIsValid(databaseid) ||
+ proc->databaseId == databaseid)
count++;
}
diff --git a/src/backend/storage/ipc/standby.c b/src/backend/storage/ipc/standby.c
index 4d3cecb455b..029d8070791 100644
--- a/src/backend/storage/ipc/standby.c
+++ b/src/backend/storage/ipc/standby.c
@@ -11,7 +11,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/storage/ipc/standby.c,v 1.17 2010/04/21 19:08:14 sriggs Exp $
+ * $PostgreSQL: pgsql/src/backend/storage/ipc/standby.c,v 1.18 2010/04/22 08:04:25 sriggs Exp $
*
*-------------------------------------------------------------------------
*/
@@ -248,7 +248,7 @@ ResolveRecoveryConflictWithSnapshot(TransactionId latestRemovedXid, RelFileNode
/*
* If we get passed InvalidTransactionId then we are a little surprised,
- * but it is theoretically possible, so spit out a LOG message, but not
+ * but it is theoretically possible, so spit out a DEBUG1 message, but not
* one that needs translating.
*
* We grab latestCompletedXid instead because this is the very latest
@@ -256,7 +256,7 @@ ResolveRecoveryConflictWithSnapshot(TransactionId latestRemovedXid, RelFileNode
*/
if (!TransactionIdIsValid(latestRemovedXid))
{
- elog(LOG, "Invalid latestRemovedXid reported, using latestCompletedXid instead");
+ elog(DEBUG1, "Invalid latestremovexXid reported, using latestcompletedxid instead");
LWLockAcquire(ProcArrayLock, LW_SHARED);
latestRemovedXid = ShmemVariableCache->latestCompletedXid;