cdbdisp.h 5.9 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13
/*-------------------------------------------------------------------------
 *
 * cdbdisp.h
 * routines for dispatching commands from the dispatcher process
 * to the qExec processes.
 *
 * Copyright (c) 2005-2008, Greenplum inc
 *
 *-------------------------------------------------------------------------
 */
#ifndef CDBDISP_H
#define CDBDISP_H

14
#include "lib/stringinfo.h" /* StringInfo */
15 16 17 18 19

#include "cdb/cdbtm.h"

#define CDB_MOTION_LOST_CONTACT_STRING "Interconnect error master lost contact with segment."

20 21
struct CdbDispatchResults; /* #include "cdb/cdbdispatchresult.h" */
struct Gang; /* #include "cdb/cdbgang.h" */
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44

/*
 * Types of message to QE when we wait for it.
 */
typedef enum DispatchWaitMode
{
	DISPATCH_WAIT_NONE = 0,			/* wait until QE fully completes */
	DISPATCH_WAIT_FINISH,			/* send query finish */
	DISPATCH_WAIT_CANCEL			/* send query cancel */
} DispatchWaitMode;

typedef struct CdbDispatchDirectDesc
{
	bool directed_dispatch;
	uint16 count;
	uint16 content[1];
} CdbDispatchDirectDesc;

extern CdbDispatchDirectDesc default_dispatch_direct_desc;
#define DEFAULT_DISP_DIRECT (&default_dispatch_direct_desc)

typedef struct CdbDispatcherState
{
45
	struct CdbDispatchResults *primaryResults;
46
	void *dispatchParams;
G
Gang Xiong 已提交
47
	MemoryContext dispatchStateContext;
48 49
} CdbDispatcherState;

50 51 52 53 54 55 56 57 58
typedef struct DispatcherInternalFuncs
{
	void (*procExitCallBack)(void);
	bool (*checkForCancel)(struct CdbDispatcherState *ds);
	void* (*makeDispatchParams)(int maxSlices, char *queryText, int queryTextLen);
	void (*checkResults)(struct CdbDispatcherState *ds, DispatchWaitMode waitMode);
	void (*dispatchToGang)(struct CdbDispatcherState *ds, struct Gang *gp,
			int sliceIndex, CdbDispatchDirectDesc *direct);
}DispatcherInternalFuncs;
59

60 61 62 63
/*--------------------------------------------------------------------*/
/*
 * cdbdisp_dispatchToGang:
 * Send the strCommand SQL statement to the subset of all segdbs in the cluster
64
 * specified by the gang parameter. cancelOnError indicates whether an error
65
 * occurring on one of the qExec segdbs should cause all still-executing commands to cancel
66 67
 * on other qExecs. Normally this would be true. The commands are sent over the libpq
 * connections that were established during cdblink_setup. They are run inside of threads.
68 69 70 71 72
 * The number of segdbs handled by any one thread is determined by the
 * guc variable gp_connections_per_thread.
 *
 * The caller must provide a CdbDispatchResults object having available
 * resultArray slots sufficient for the number of QEs to be dispatched:
73
 * i.e., resultCapacity - resultCount >= gp->size. This function will
74
 * assign one resultArray slot per QE of the Gang, paralleling the Gang's
75
 * db_descriptors array. Success or failure of each QE will be noted in
76 77 78 79
 * the QE's CdbDispatchResult entry; but before examining the results, the
 * caller must wait for execution to end by calling CdbCheckDispatchResult().
 *
 * The CdbDispatchResults object owns some malloc'ed storage, so the caller
80
 * must make certain to free it by calling cdbdisp_destroyDispatcherState().
81 82 83 84 85 86 87 88 89 90 91
 *
 * When dispatchResults->cancelOnError is false, strCommand is to be
 * dispatched to every connected gang member if possible, despite any
 * cancellation requests, QE errors, connection failures, etc.
 *
 * NB: This function should return normally even if there is an error.
 * It should not longjmp out via elog(ERROR, ...), ereport(ERROR, ...),
 * PG_THROW, CHECK_FOR_INTERRUPTS, etc.
 */
void
cdbdisp_dispatchToGang(struct CdbDispatcherState *ds,
92 93 94
					   struct Gang *gp,
					   int sliceIndex,
					   CdbDispatchDirectDesc *direct);
95 96 97 98 99 100 101 102 103 104 105 106

/*
 * CdbCheckDispatchResult:
 *
 * Waits for completion of threads launched by cdbdisp_dispatchToGang().
 *
 * QEs that were dispatched with 'cancelOnError' true and are not yet idle
 * will be canceled/finished according to waitMode.
 */
void
CdbCheckDispatchResult(struct CdbDispatcherState *ds, DispatchWaitMode waitMode);

107 108 109 110 111 112 113 114 115 116 117 118
/*
 * cdbdisp_getDispatchResults:
 *
 * Block until all QEs return results or report errors.
 *
 * Return Values:
 *   Return NULL If one or more QEs got Error in which case qeErrorMsg contain
 *   QE error messages.
 */
struct CdbDispatchResults *
cdbdisp_getDispatchResults(struct CdbDispatcherState *ds, StringInfoData *qeErrorMsg);

119
/*
120
 * Wait for all QEs to finish, then report any errors from the given
121 122 123 124 125 126 127
 * CdbDispatchResults objects and free them.  If not all QEs in the
 * associated gang(s) executed the command successfully, throws an
 * error and does not return.  No-op if both CdbDispatchResults ptrs are NULL.
 * This is a convenience function; callers with unusual requirements may
 * instead call CdbCheckDispatchResult(), etc., directly.
 */
void
128
cdbdisp_finishCommand(struct CdbDispatcherState *ds);
129 130

/*
131
 * CdbDispatchHandleError
132 133 134 135 136 137 138 139 140 141 142 143 144
 *
 * When caller catches an error, the PG_CATCH handler can use this
 * function instead of cdbdisp_finishCommand to wait for all QEs
 * to finish, clean up, and report QE errors if appropriate.
 * This function should be called only from PG_CATCH handlers.
 *
 * This function destroys and frees the given CdbDispatchResults objects.
 * It is a no-op if both CdbDispatchResults ptrs are NULL.
 *
 * On return, the caller is expected to finish its own cleanup and
 * exit via PG_RE_THROW().
 */
void
145
CdbDispatchHandleError(struct CdbDispatcherState *ds);
146

147 148 149
void
cdbdisp_cancelDispatch(CdbDispatcherState *ds);

150
/*
151
 * Allocate memory and initialize CdbDispatcherState.
152
 *
153
 * Call cdbdisp_destroyDispatcherState to free it.
154
 *
155
 *   maxSlices: max number of slices of the query/command.
156 157
 */
void
158 159
cdbdisp_makeDispatcherState(CdbDispatcherState *ds,
							int maxSlices,
160 161 162
							bool cancelOnError,
							char *queryText,
							int queryTextLen);
163

164 165
/*
 * Free memory in CdbDispatcherState
166
 *
167 168
 * Free the PQExpBufferData allocated in libpq.
 * Free dispatcher memory context.
169
 */
170
void cdbdisp_destroyDispatcherState(CdbDispatcherState *ds);
171

172 173 174 175
bool cdbdisp_checkForCancel(CdbDispatcherState * ds);

void cdbdisp_onProcExit(void);

176
void cdbdisp_setAsync(bool async);
177

178
#endif   /* CDBDISP_H */