diff --git a/src/backend/access/nbtree/nbtxlog.c b/src/backend/access/nbtree/nbtxlog.c index 0d342eeb85f6f300e05bfe2b636992da82b13091..7b5b27315e5556fa9bf9473216975b11ab09d8d3 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,9 +578,17 @@ 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 */ @@ -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 9aef06fca789db85f9113644962d1326522b3a15..2dde056a9792f9ec951ebfbabac60dc7dffdff16 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 4d3cecb455b5e32f5b658cd5817e5a5af8e61ac0..029d807079143b537eb75ec8bac6cb4bd428c854 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;