mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-12 18:34:36 +08:00
Fix bogus initialization of KnownAssignedXids shared memory state ---
didn't work in EXEC_BACKEND case.
This commit is contained in:
parent
8bfd1a8848
commit
e319e6799a
@ -37,7 +37,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/storage/ipc/procarray.c,v 1.56 2010/01/16 10:05:50 sriggs Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/storage/ipc/procarray.c,v 1.57 2010/01/16 17:17:26 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -135,8 +135,6 @@ static void DisplayXidCache(void);
|
||||
#endif /* XIDCACHE_DEBUG */
|
||||
|
||||
/* Primitives for KnownAssignedXids array handling for standby */
|
||||
static Size KnownAssignedXidsShmemSize(int size);
|
||||
static void KnownAssignedXidsInit(int size);
|
||||
static int KnownAssignedXidsGet(TransactionId *xarray, TransactionId xmax);
|
||||
static int KnownAssignedXidsGetAndSetXmin(TransactionId *xarray, TransactionId *xmin,
|
||||
TransactionId xmax);
|
||||
@ -161,16 +159,19 @@ ProcArrayShmemSize(void)
|
||||
size = add_size(size, mul_size(sizeof(PGPROC *), PROCARRAY_MAXPROCS));
|
||||
|
||||
/*
|
||||
* During recovery processing we have a data structure called KnownAssignedXids,
|
||||
* created in shared memory. Local data structures are also created in various
|
||||
* backends during GetSnapshotData(), TransactionIdIsInProgress() and
|
||||
* GetRunningTransactionData(). All of the main structures created in those
|
||||
* functions must be identically sized, since we may at times copy the whole
|
||||
* of the data structures around. We refer to this as TOTAL_MAX_CACHED_SUBXIDS.
|
||||
* During recovery processing we have a data structure called
|
||||
* KnownAssignedXids, created in shared memory. Local data structures are
|
||||
* also created in various backends during GetSnapshotData(),
|
||||
* TransactionIdIsInProgress() and GetRunningTransactionData(). All of the
|
||||
* main structures created in those functions must be identically sized,
|
||||
* since we may at times copy the whole of the data structures around. We
|
||||
* refer to this size as TOTAL_MAX_CACHED_SUBXIDS.
|
||||
*/
|
||||
#define TOTAL_MAX_CACHED_SUBXIDS ((PGPROC_MAX_CACHED_SUBXIDS + 1) * PROCARRAY_MAXPROCS)
|
||||
if (XLogRequestRecoveryConnections)
|
||||
size = add_size(size, KnownAssignedXidsShmemSize(TOTAL_MAX_CACHED_SUBXIDS));
|
||||
size = add_size(size,
|
||||
hash_estimate_size(TOTAL_MAX_CACHED_SUBXIDS,
|
||||
sizeof(TransactionId)));
|
||||
|
||||
return size;
|
||||
}
|
||||
@ -186,8 +187,8 @@ CreateSharedProcArray(void)
|
||||
/* Create or attach to the ProcArray shared structure */
|
||||
procArray = (ProcArrayStruct *)
|
||||
ShmemInitStruct("Proc Array",
|
||||
mul_size(sizeof(PGPROC *), PROCARRAY_MAXPROCS),
|
||||
&found);
|
||||
mul_size(sizeof(PGPROC *), PROCARRAY_MAXPROCS),
|
||||
&found);
|
||||
|
||||
if (!found)
|
||||
{
|
||||
@ -197,9 +198,28 @@ CreateSharedProcArray(void)
|
||||
/* Normal processing */
|
||||
procArray->numProcs = 0;
|
||||
procArray->maxProcs = PROCARRAY_MAXPROCS;
|
||||
procArray->numKnownAssignedXids = 0;
|
||||
procArray->maxKnownAssignedXids = TOTAL_MAX_CACHED_SUBXIDS;
|
||||
procArray->lastOverflowedXid = InvalidTransactionId;
|
||||
}
|
||||
|
||||
if (XLogRequestRecoveryConnections)
|
||||
KnownAssignedXidsInit(TOTAL_MAX_CACHED_SUBXIDS);
|
||||
if (XLogRequestRecoveryConnections)
|
||||
{
|
||||
/* Create or attach to the KnownAssignedXids hash table */
|
||||
HASHCTL info;
|
||||
|
||||
MemSet(&info, 0, sizeof(info));
|
||||
info.keysize = sizeof(TransactionId);
|
||||
info.entrysize = sizeof(TransactionId);
|
||||
info.hash = tag_hash;
|
||||
|
||||
KnownAssignedXidsHash = ShmemInitHash("KnownAssignedXids Hash",
|
||||
TOTAL_MAX_CACHED_SUBXIDS,
|
||||
TOTAL_MAX_CACHED_SUBXIDS,
|
||||
&info,
|
||||
HASH_ELEM | HASH_FUNCTION);
|
||||
if (!KnownAssignedXidsHash)
|
||||
elog(FATAL, "could not initialize known assigned xids hash table");
|
||||
}
|
||||
}
|
||||
|
||||
@ -2291,36 +2311,6 @@ ExpireOldKnownAssignedTransactionIds(TransactionId xid)
|
||||
* high availability. So we choose to implement as a hash table.
|
||||
*/
|
||||
|
||||
static Size
|
||||
KnownAssignedXidsShmemSize(int size)
|
||||
{
|
||||
return hash_estimate_size(size, sizeof(TransactionId));
|
||||
}
|
||||
|
||||
static void
|
||||
KnownAssignedXidsInit(int size)
|
||||
{
|
||||
HASHCTL info;
|
||||
|
||||
/* assume no locking is needed yet */
|
||||
|
||||
info.keysize = sizeof(TransactionId);
|
||||
info.entrysize = sizeof(TransactionId);
|
||||
info.hash = tag_hash;
|
||||
|
||||
KnownAssignedXidsHash = ShmemInitHash("KnownAssignedXids Hash",
|
||||
size, size,
|
||||
&info,
|
||||
HASH_ELEM | HASH_FUNCTION);
|
||||
|
||||
if (!KnownAssignedXidsHash)
|
||||
elog(FATAL, "could not initialize known assigned xids hash table");
|
||||
|
||||
procArray->numKnownAssignedXids = 0;
|
||||
procArray->maxKnownAssignedXids = TOTAL_MAX_CACHED_SUBXIDS;
|
||||
procArray->lastOverflowedXid = InvalidTransactionId;
|
||||
}
|
||||
|
||||
/*
|
||||
* Add xids into KnownAssignedXids.
|
||||
*
|
||||
|
Loading…
Reference in New Issue
Block a user