Fix bogus initialization of KnownAssignedXids shared memory state ---

didn't work in EXEC_BACKEND case.
This commit is contained in:
Tom Lane 2010-01-16 17:17:26 +00:00
parent 8bfd1a8848
commit e319e6799a
1 changed files with 34 additions and 44 deletions

View File

@ -37,7 +37,7 @@
* *
* *
* IDENTIFICATION * 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 */ #endif /* XIDCACHE_DEBUG */
/* Primitives for KnownAssignedXids array handling for standby */ /* 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 KnownAssignedXidsGet(TransactionId *xarray, TransactionId xmax);
static int KnownAssignedXidsGetAndSetXmin(TransactionId *xarray, TransactionId *xmin, static int KnownAssignedXidsGetAndSetXmin(TransactionId *xarray, TransactionId *xmin,
TransactionId xmax); TransactionId xmax);
@ -161,16 +159,19 @@ ProcArrayShmemSize(void)
size = add_size(size, mul_size(sizeof(PGPROC *), PROCARRAY_MAXPROCS)); size = add_size(size, mul_size(sizeof(PGPROC *), PROCARRAY_MAXPROCS));
/* /*
* During recovery processing we have a data structure called KnownAssignedXids, * During recovery processing we have a data structure called
* created in shared memory. Local data structures are also created in various * KnownAssignedXids, created in shared memory. Local data structures are
* backends during GetSnapshotData(), TransactionIdIsInProgress() and * also created in various backends during GetSnapshotData(),
* GetRunningTransactionData(). All of the main structures created in those * TransactionIdIsInProgress() and GetRunningTransactionData(). All of the
* functions must be identically sized, since we may at times copy the whole * main structures created in those functions must be identically sized,
* of the data structures around. We refer to this as TOTAL_MAX_CACHED_SUBXIDS. * 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) #define TOTAL_MAX_CACHED_SUBXIDS ((PGPROC_MAX_CACHED_SUBXIDS + 1) * PROCARRAY_MAXPROCS)
if (XLogRequestRecoveryConnections) 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; return size;
} }
@ -186,8 +187,8 @@ CreateSharedProcArray(void)
/* Create or attach to the ProcArray shared structure */ /* Create or attach to the ProcArray shared structure */
procArray = (ProcArrayStruct *) procArray = (ProcArrayStruct *)
ShmemInitStruct("Proc Array", ShmemInitStruct("Proc Array",
mul_size(sizeof(PGPROC *), PROCARRAY_MAXPROCS), mul_size(sizeof(PGPROC *), PROCARRAY_MAXPROCS),
&found); &found);
if (!found) if (!found)
{ {
@ -197,9 +198,28 @@ CreateSharedProcArray(void)
/* Normal processing */ /* Normal processing */
procArray->numProcs = 0; procArray->numProcs = 0;
procArray->maxProcs = PROCARRAY_MAXPROCS; procArray->maxProcs = PROCARRAY_MAXPROCS;
procArray->numKnownAssignedXids = 0;
procArray->maxKnownAssignedXids = TOTAL_MAX_CACHED_SUBXIDS;
procArray->lastOverflowedXid = InvalidTransactionId;
}
if (XLogRequestRecoveryConnections) if (XLogRequestRecoveryConnections)
KnownAssignedXidsInit(TOTAL_MAX_CACHED_SUBXIDS); {
/* 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. * 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. * Add xids into KnownAssignedXids.
* *