mirror of
https://github.com/postgres/postgres.git
synced 2025-07-08 11:42:09 +03:00
Create an infrastructure for parallel computation in PostgreSQL.
This does four basic things. First, it provides convenience routines to coordinate the startup and shutdown of parallel workers. Second, it synchronizes various pieces of state (e.g. GUCs, combo CID mappings, transaction snapshot) from the parallel group leader to the worker processes. Third, it prohibits various operations that would result in unsafe changes to that state while parallelism is active. Finally, it propagates events that would result in an ErrorResponse, NoticeResponse, or NotifyResponse message being sent to the client from the parallel workers back to the master, from which they can then be sent on to the client. Robert Haas, Amit Kapila, Noah Misch, Rushabh Lathia, Jeevan Chalke. Suggestions and review from Andres Freund, Heikki Linnakangas, Noah Misch, Simon Riggs, Euler Taveira, and Jim Nasby.
This commit is contained in:
@ -44,6 +44,7 @@
|
||||
#include "miscadmin.h"
|
||||
#include "access/htup_details.h"
|
||||
#include "access/xact.h"
|
||||
#include "storage/shmem.h"
|
||||
#include "utils/combocid.h"
|
||||
#include "utils/hsearch.h"
|
||||
#include "utils/memutils.h"
|
||||
@ -286,3 +287,76 @@ GetRealCmax(CommandId combocid)
|
||||
Assert(combocid < usedComboCids);
|
||||
return comboCids[combocid].cmax;
|
||||
}
|
||||
|
||||
/*
|
||||
* Estimate the amount of space required to serialize the current ComboCID
|
||||
* state.
|
||||
*/
|
||||
Size
|
||||
EstimateComboCIDStateSpace(void)
|
||||
{
|
||||
Size size;
|
||||
|
||||
/* Add space required for saving usedComboCids */
|
||||
size = sizeof(int);
|
||||
|
||||
/* Add space required for saving the combocids key */
|
||||
size = add_size(size, mul_size(sizeof(ComboCidKeyData), usedComboCids));
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
/*
|
||||
* Serialize the ComboCID state into the memory, beginning at start_address.
|
||||
* maxsize should be at least as large as the value returned by
|
||||
* EstimateComboCIDStateSpace.
|
||||
*/
|
||||
void
|
||||
SerializeComboCIDState(Size maxsize, char *start_address)
|
||||
{
|
||||
char *endptr;
|
||||
|
||||
/* First, we store the number of currently-existing ComboCIDs. */
|
||||
* (int *) start_address = usedComboCids;
|
||||
|
||||
/* If maxsize is too small, throw an error. */
|
||||
endptr = start_address + sizeof(int) +
|
||||
(sizeof(ComboCidKeyData) * usedComboCids);
|
||||
if (endptr < start_address || endptr > start_address + maxsize)
|
||||
elog(ERROR, "not enough space to serialize ComboCID state");
|
||||
|
||||
/* Now, copy the actual cmin/cmax pairs. */
|
||||
memcpy(start_address + sizeof(int), comboCids,
|
||||
(sizeof(ComboCidKeyData) * usedComboCids));
|
||||
}
|
||||
|
||||
/*
|
||||
* Read the ComboCID state at the specified address and initialize this
|
||||
* backend with the same ComboCIDs. This is only valid in a backend that
|
||||
* currently has no ComboCIDs (and only makes sense if the transaction state
|
||||
* is serialized and restored as well).
|
||||
*/
|
||||
void
|
||||
RestoreComboCIDState(char *comboCIDstate)
|
||||
{
|
||||
int num_elements;
|
||||
ComboCidKeyData *keydata;
|
||||
int i;
|
||||
CommandId cid;
|
||||
|
||||
Assert(!comboCids && !comboHash);
|
||||
|
||||
/* First, we retrieve the number of ComboCIDs that were serialized. */
|
||||
num_elements = * (int *) comboCIDstate;
|
||||
keydata = (ComboCidKeyData *) (comboCIDstate + sizeof(int));
|
||||
|
||||
/* Use GetComboCommandId to restore each ComboCID. */
|
||||
for (i = 0; i < num_elements; i++)
|
||||
{
|
||||
cid = GetComboCommandId(keydata[i].cmin, keydata[i].cmax);
|
||||
|
||||
/* Verify that we got the expected answer. */
|
||||
if (cid != i)
|
||||
elog(ERROR, "unexpected command ID while restoring combo CIDs");
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user