mirror of
https://github.com/postgres/postgres.git
synced 2025-06-16 06:01:02 +03:00
Transfer state pertaining to pending REINDEX operations to workers.
This will allow the pending patch for parallel CREATE INDEX to work on system catalogs, and to provide the same level of protection against use of user indexes while they are being rebuilt that we have for non-parallel CREATE INDEX. Patch by me, reviewed by Peter Geoghegan. Discussion: http://postgr.es/m/CA+TgmoYN-YQU9JsGQcqFLovZ-C+Xgp1_xhJQad=cunGG-_p5gg@mail.gmail.com Discussion: http://postgr.es/m/CAH2-Wzkv4UNkXYhqQRqk-u9rS7h5c-4cCW+EqQ8K_WSeS43aZg@mail.gmail.com
This commit is contained in:
@ -18,6 +18,7 @@
|
||||
#include "access/session.h"
|
||||
#include "access/xact.h"
|
||||
#include "access/xlog.h"
|
||||
#include "catalog/index.h"
|
||||
#include "catalog/namespace.h"
|
||||
#include "commands/async.h"
|
||||
#include "executor/execParallel.h"
|
||||
@ -67,6 +68,7 @@
|
||||
#define PARALLEL_KEY_TRANSACTION_STATE UINT64CONST(0xFFFFFFFFFFFF0008)
|
||||
#define PARALLEL_KEY_ENTRYPOINT UINT64CONST(0xFFFFFFFFFFFF0009)
|
||||
#define PARALLEL_KEY_SESSION_DSM UINT64CONST(0xFFFFFFFFFFFF000A)
|
||||
#define PARALLEL_KEY_REINDEX_STATE UINT64CONST(0xFFFFFFFFFFFF000B)
|
||||
|
||||
/* Fixed-size parallel state. */
|
||||
typedef struct FixedParallelState
|
||||
@ -200,6 +202,7 @@ InitializeParallelDSM(ParallelContext *pcxt)
|
||||
Size tsnaplen = 0;
|
||||
Size asnaplen = 0;
|
||||
Size tstatelen = 0;
|
||||
Size reindexlen = 0;
|
||||
Size segsize = 0;
|
||||
int i;
|
||||
FixedParallelState *fps;
|
||||
@ -249,8 +252,10 @@ InitializeParallelDSM(ParallelContext *pcxt)
|
||||
tstatelen = EstimateTransactionStateSpace();
|
||||
shm_toc_estimate_chunk(&pcxt->estimator, tstatelen);
|
||||
shm_toc_estimate_chunk(&pcxt->estimator, sizeof(dsm_handle));
|
||||
reindexlen = EstimateReindexStateSpace();
|
||||
shm_toc_estimate_chunk(&pcxt->estimator, reindexlen);
|
||||
/* If you add more chunks here, you probably need to add keys. */
|
||||
shm_toc_estimate_keys(&pcxt->estimator, 7);
|
||||
shm_toc_estimate_keys(&pcxt->estimator, 8);
|
||||
|
||||
/* Estimate space need for error queues. */
|
||||
StaticAssertStmt(BUFFERALIGN(PARALLEL_ERROR_QUEUE_SIZE) ==
|
||||
@ -319,6 +324,7 @@ InitializeParallelDSM(ParallelContext *pcxt)
|
||||
char *tsnapspace;
|
||||
char *asnapspace;
|
||||
char *tstatespace;
|
||||
char *reindexspace;
|
||||
char *error_queue_space;
|
||||
char *session_dsm_handle_space;
|
||||
char *entrypointstate;
|
||||
@ -360,6 +366,11 @@ InitializeParallelDSM(ParallelContext *pcxt)
|
||||
SerializeTransactionState(tstatelen, tstatespace);
|
||||
shm_toc_insert(pcxt->toc, PARALLEL_KEY_TRANSACTION_STATE, tstatespace);
|
||||
|
||||
/* Serialize reindex state. */
|
||||
reindexspace = shm_toc_allocate(pcxt->toc, reindexlen);
|
||||
SerializeReindexState(reindexlen, reindexspace);
|
||||
shm_toc_insert(pcxt->toc, PARALLEL_KEY_REINDEX_STATE, reindexspace);
|
||||
|
||||
/* Allocate space for worker information. */
|
||||
pcxt->worker = palloc0(sizeof(ParallelWorkerInfo) * pcxt->nworkers);
|
||||
|
||||
@ -972,6 +983,7 @@ ParallelWorkerMain(Datum main_arg)
|
||||
char *tsnapspace;
|
||||
char *asnapspace;
|
||||
char *tstatespace;
|
||||
char *reindexspace;
|
||||
StringInfoData msgbuf;
|
||||
char *session_dsm_handle_space;
|
||||
|
||||
@ -1137,6 +1149,10 @@ ParallelWorkerMain(Datum main_arg)
|
||||
/* Set ParallelMasterBackendId so we know how to address temp relations. */
|
||||
ParallelMasterBackendId = fps->parallel_master_backend_id;
|
||||
|
||||
/* Restore reindex state. */
|
||||
reindexspace = shm_toc_lookup(toc, PARALLEL_KEY_REINDEX_STATE, false);
|
||||
RestoreReindexState(reindexspace);
|
||||
|
||||
/*
|
||||
* We've initialized all of our state now; nothing should change
|
||||
* hereafter.
|
||||
|
Reference in New Issue
Block a user