mirror of
https://git.postgresql.org/git/postgresql.git
synced 2026-02-15 10:57:02 +08:00
Create a wrapper object, ParallelSlotArray, to encapsulate the number of slots and the slot array itself, plus some other relevant bits of information. This reduces the number of parameters we have to pass around all over the place. Allow for a ParallelSlotArray to contain slots connected to different databases within a single cluster. The current clients of this mechanism don't need this, but it is expected to be used by future patches. Defer connecting to databases until we actually need the connection for something. This is a slight behavior change for vacuumdb and reindexdb. If you specify a number of jobs that is larger than the number of objects, the extra connections will now not be used. But, on the other hand, if you specify a number of jobs that is so large that it's going to fail, the failure would previously have happened before any operations were actually started, and now it won't. Mark Dilger, reviewed by me. Discussion: http://postgr.es/m/12ED3DA8-25F0-4B68-937D-D907CFBF08E7@enterprisedb.com Discussion: http://postgr.es/m/BA592F2D-F928-46FF-9516-2B827F067F57@enterprisedb.com
78 lines
2.1 KiB
C
78 lines
2.1 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* parallel_slot.h
|
|
* Parallel support for bin/scripts/
|
|
*
|
|
* Copyright (c) 2003-2021, PostgreSQL Global Development Group
|
|
*
|
|
* src/include/fe_utils/parallel_slot.h
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef PARALLEL_SLOT_H
|
|
#define PARALLEL_SLOT_H
|
|
|
|
#include "fe_utils/connect_utils.h"
|
|
#include "libpq-fe.h"
|
|
|
|
typedef bool (*ParallelSlotResultHandler) (PGresult *res, PGconn *conn,
|
|
void *context);
|
|
|
|
typedef struct ParallelSlot
|
|
{
|
|
PGconn *connection; /* One connection */
|
|
bool inUse; /* Is the slot being used? */
|
|
|
|
/*
|
|
* Prior to issuing a command or query on 'connection', a handler callback
|
|
* function may optionally be registered to be invoked to process the
|
|
* results, and context information may optionally be registered for use
|
|
* by the handler. If unset, these fields should be NULL.
|
|
*/
|
|
ParallelSlotResultHandler handler;
|
|
void *handler_context;
|
|
} ParallelSlot;
|
|
|
|
typedef struct ParallelSlotArray
|
|
{
|
|
int numslots;
|
|
ConnParams *cparams;
|
|
const char *progname;
|
|
bool echo;
|
|
const char *initcmd;
|
|
ParallelSlot slots[FLEXIBLE_ARRAY_MEMBER];
|
|
} ParallelSlotArray;
|
|
|
|
static inline void
|
|
ParallelSlotSetHandler(ParallelSlot *slot, ParallelSlotResultHandler handler,
|
|
void *context)
|
|
{
|
|
slot->handler = handler;
|
|
slot->handler_context = context;
|
|
}
|
|
|
|
static inline void
|
|
ParallelSlotClearHandler(ParallelSlot *slot)
|
|
{
|
|
slot->handler = NULL;
|
|
slot->handler_context = NULL;
|
|
}
|
|
|
|
extern ParallelSlot *ParallelSlotsGetIdle(ParallelSlotArray *slots,
|
|
const char *dbname);
|
|
|
|
extern ParallelSlotArray *ParallelSlotsSetup(int numslots, ConnParams *cparams,
|
|
const char *progname, bool echo,
|
|
const char *initcmd);
|
|
|
|
extern void ParallelSlotsAdoptConn(ParallelSlotArray *sa, PGconn *conn);
|
|
|
|
extern void ParallelSlotsTerminate(ParallelSlotArray *sa);
|
|
|
|
extern bool ParallelSlotsWaitCompletion(ParallelSlotArray *sa);
|
|
|
|
extern bool TableCommandResultHandler(PGresult *res, PGconn *conn,
|
|
void *context);
|
|
|
|
#endif /* PARALLEL_SLOT_H */
|