175 lines
7.6 KiB
C
175 lines
7.6 KiB
C
/* ---------------------------------------------------------------------------------------
|
|
*
|
|
* distribute_test.h
|
|
* Routines for distributed test framework.
|
|
*
|
|
* Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
*
|
|
* IDENTIFICATION
|
|
* src/include/utils/distribute_test.h
|
|
*
|
|
* ---------------------------------------------------------------------------------------
|
|
*/
|
|
#ifndef DISTRIBUTE_TEST_H
|
|
#define DISTRIBUTE_TEST_H
|
|
|
|
#include "utils/guc.h"
|
|
#include "utils/elog.h"
|
|
|
|
// work as a switch to enable the macro TEST_STUB
|
|
#ifdef USE_ASSERT_CHECKING
|
|
#ifdef ENABLE_MULTIPLE_NODES
|
|
#define ENABLE_DISTRIBUTE_TEST
|
|
#endif
|
|
|
|
#define MAX_GID_STR_LEN (1024)
|
|
#define MAX_NAME_STR_LEN (256)
|
|
#define DEFAULT_PROBABILITY (0.004)
|
|
|
|
/* white-box log handle */
|
|
#define ereport_whitebox_domain(elevel, file, line, func, domain, rest) \
|
|
(errstart(elevel, file, line, func, domain) ? (errfinish rest) : (void)0)
|
|
|
|
#define ereport_whitebox(elevel, file, line, func, rest) \
|
|
ereport_whitebox_domain(elevel, file, line, func, TEXTDOMAIN, rest)
|
|
|
|
#define WHITEBOX_LOC __FILE__, __LINE__, PG_FUNCNAME_MACRO
|
|
|
|
typedef struct DistributeTestParam {
|
|
/* use as the guc-control white-box-fault probability
|
|
* range [0, 100000], probability 0, 1/100000 -> 1
|
|
*/
|
|
int guc_probability;
|
|
|
|
/* act as the white-box checkpoint tag,
|
|
* eg. "WHITE_BOX_ALL_RANDOM_FAILED"
|
|
*/
|
|
char test_stub_name[MAX_NAME_STR_LEN];
|
|
|
|
/* fault level, support ERROR and PANIC */
|
|
int elevel;
|
|
|
|
/* when white-box fault is WHITEBOX_WAIT, guc can provide "sleep_time"
|
|
* for sleep time control, if guc not contain this field, use the default value 30s
|
|
*/
|
|
int sleep_time;
|
|
} DistributeTestParam;
|
|
|
|
/* white-box failure injection type definition */
|
|
typedef enum WhiteboxFaillueType {
|
|
WHITEBOX_DEFAULT = 0,
|
|
WHITEBOX_WAIT,
|
|
WHITEBOX_REPEAT,
|
|
WHITEBOX_USERDEFINE,
|
|
WHITEBOX_BUTT
|
|
} WhiteboxFaillueType;
|
|
|
|
/* struct created for white-box tesing, support expansion */
|
|
typedef struct WhiteBoxInjectStruct {
|
|
/* test location record */
|
|
char filename[MAX_NAME_STR_LEN];
|
|
int lineno;
|
|
char funcname[MAX_NAME_STR_LEN];
|
|
|
|
/* failure type, defined above */
|
|
int failureType;
|
|
|
|
/* trigger as the probability, 0 -1, if set as 1, definitely trigger */
|
|
double triggerProbability;
|
|
|
|
/* white box test info needed */
|
|
TransactionId currentXid;
|
|
char currentGid[MAX_GID_STR_LEN];
|
|
} WhiteBoxInjectStruct;
|
|
|
|
typedef void (*on_whitebox_callback)(WhiteBoxInjectStruct* wbinfo);
|
|
typedef void (*on_add_stub_callback)(void);
|
|
|
|
extern bool check_distribute_test_param(char** newval, void** extra, GucSource source);
|
|
extern void assign_distribute_test_param(const char* newval, void* extra);
|
|
extern bool distribute_test_stub_activator(const char* name, on_add_stub_callback function);
|
|
extern void default_error_emit(void);
|
|
extern void twophase_default_error_emit(void);
|
|
extern bool distribute_whitebox_activator(
|
|
const char* name, WhiteBoxInjectStruct* wbinfo, on_whitebox_callback WbCallbackFunc);
|
|
extern void default_whitebox_emit(WhiteBoxInjectStruct* wbinfo);
|
|
extern bool execute_whitebox(
|
|
const char* filename, int lineno, const char* funcname, const char* gid, int failureType, double probability);
|
|
extern DistributeTestParam* get_distribute_test_param();
|
|
extern void stub_sleep_emit(void);
|
|
|
|
#define TEST_WHITEBOX(_stub_name, _white_box_info, _call_back_func) \
|
|
distribute_whitebox_activator((_stub_name), (_white_box_info), (_call_back_func))
|
|
#define TEST_STUB(_stub_name, _call_back_func) distribute_test_stub_activator((_stub_name), (_call_back_func))
|
|
|
|
/* White-Box Handle Definition */
|
|
#define WHITE_BOX_ALL_RANDOM_FAILED "WHITE_BOX_ALL_RANDOM_FAILED"
|
|
|
|
/* GTM exception scenes */
|
|
#define CN_LOCAL_PREPARED_FAILED_A "CN_LOCAL_PREPARED_FAILED_A"
|
|
#define CN_LOCAL_PREPARED_FAILED_B "CN_LOCAL_PREPARED_FAILED_B"
|
|
#define CN_LOCAL_PREPARED_XLOG_FAILED "CN_LOCAL_PREPARED_XLOG_FAILED"
|
|
#define CN_LOCAL_PREPARED_CLOG_FAILED "CN_LOCAL_PREPARED_CLOG_FAILED"
|
|
#define CN_PREPARED_SEND_ALL_FAILED "CN_PREPARED_SEND_ALL_FAILED"
|
|
#define CN_PREPARED_SEND_PART_FAILED "CN_PREPARED_SEND_PART_FAILED"
|
|
#define CN_PREPARED_RESPONSE_FAILED "CN_PREPARED_RESPONSE_FAILED"
|
|
#define DN_PREPARED_FAILED "DN_PREPARED_FAILED"
|
|
#define CN_PREPARED_MESSAGE_REPEAT "CN_PREPARED_MESSAGE_REPEAT"
|
|
#define CN_COMMIT_PREPARED_FAILED "CN_COMMIT_PREPARED_FAILED"
|
|
#define DN_COMMIT_PREPARED_FAILED "DN_COMMIT_PREPARED_FAILED"
|
|
#define CN_COMMIT_PREPARED_SEND_ALL_FAILED "CN_COMMIT_PREPARED_SEND_ALL_FAILED"
|
|
#define CN_COMMIT_PREPARED_SEND_PART_FAILED "CN_COMMIT_PREPARED_SEND_PART_FAILED"
|
|
#define CN_COMMIT_PREPARED_RESPONSE_FAILED "CN_COMMIT_PREPARED_RESPONSE_FAILED"
|
|
#define CN_COMMIT_PREPARED_MESSAGE_REPEAT "CN_COMMIT_PREPARED_MESSAGE_REPEAT"
|
|
#define CN_ABORT_AFTER_ALL_COMMITTED "CN_ABORT_AFTER_ALL_COMMITTED"
|
|
|
|
#define CN_ABORT_PREPARED_FAILED "CN_ABORT_PREPARED_FAILED"
|
|
#define CN_ABORT_PREPARED_SEND_ALL_FAILED "CN_ABORT_PREPARED_SEND_ALL_FAILED"
|
|
#define CN_ABORT_PREPARED_SEND_PART_FAILED "CN_ABORT_PREPARED_SEND_PART_FAILED"
|
|
#define CN_ABORT_PREPARED_RESPONSE_FAILED "CN_ABORT_PREPARED_RESPONSE_FAILED"
|
|
#define DN_ABORT_PREPARED_FAILED "DN_ABORT_PREPARED_FAILED"
|
|
|
|
#define CN_COMMIT_PREPARED_SLEEP "CN_COMMIT_PREPARED_SLEEP"
|
|
#define CN_PREPARED_SLEEP "CN_PREPARED_SLEEP"
|
|
#define DN_COMMIT_PREPARED_SLEEP "DN_COMMIT_PREPARED_SLEEP"
|
|
|
|
/* Exception during subTransaction process */
|
|
#define NON_EXEC_CN_IS_DOWN "NON_EXEC_CN_IS_DOWN"
|
|
#define CN_SAVEPOINT_SEND_ALL_FAILED "CN_SAVEPOINT_SEND_ALL_FAILED"
|
|
#define CN_SAVEPOINT_SEND_PART_FAILED "CN_SAVEPOINT_SEND_PART_FAILED"
|
|
#define CN_SAVEPOINT_RESPONSE_ALL_FAILED "CN_SAVEPOINT_RESPONSE_ALL_FAILED"
|
|
#define CN_SAVEPOINT_RESPONSE_PART_FAILED "CN_SAVEPOINT_RESPONSE_PART_FAILED"
|
|
#define CN_SAVEPOINT_BEFORE_DEFINE_LOCAL_FAILED "CN_SAVEPOINT_BEFORE_DEFINE_LOCAL_FAILED"
|
|
#define DN_SAVEPOINT_BEFORE_DEFINE_LOCAL_FAILED "DN_SAVEPOINT_BEFORE_DEFINE_LOCAL_FAILED"
|
|
#define CN_SAVEPOINT_BEFORE_PUSHXACT_FAILED "CN_SAVEPOINT_BEFORE_PUSHXACT_FAILED"
|
|
#define DN_SAVEPOINT_BEFORE_PUSHXACT_FAILED "DN_SAVEPOINT_BEFORE_PUSHXACT_FAILED"
|
|
#define CN_SAVEPOINT_AFTER_PUSHXACT_FAILED "CN_SAVEPOINT_AFTER_PUSHXACT_FAILED"
|
|
#define DN_SAVEPOINT_AFTER_PUSHXACT_FAILED "DN_SAVEPOINT_AFTER_PUSHXACT_FAILED"
|
|
|
|
#define CN_ROLLBACKTOSAVEPOINT_BEFORE_SEND_FAILED "CN_ROLLBACKTOSAVEPOINT_BEFORE_SEND_FAILED"
|
|
#define DN_ROLLBACKTOSAVEPOINT_AFTER_LOCAL_DEAL_FAILED "DN_ROLLBACKTOSAVEPOINT_AFTER_LOCAL_DEAL_FAILED"
|
|
|
|
#define CN_RELEASESAVEPOINT_BEFORE_SEND_FAILED "CN_RELEASESAVEPOINT_BEFORE_SEND_FAILED"
|
|
#define DN_RELEASESAVEPOINT_AFTER_LOCAL_DEAL_FAILED "DN_RELEASESAVEPOINT_AFTER_LOCAL_DEAL_FAILED"
|
|
#define CN_RELEASESAVEPOINT_BEFORE_LOCAL_DEAL_FAILED "CN_RELEASESAVEPOINT_BEFORE_LOCAL_DEAL_FAILED"
|
|
#define DN_RELEASESAVEPOINT_BEFORE_LOCAL_DEAL_FAILED "DN_RELEASESAVEPOINT_BEFORE_LOCAL_DEAL_FAILED"
|
|
|
|
#define CN_COMMIT_SUBXACT_BEFORE_SEND_GTM_FAILED "CN_COMMIT_SUBXACT_BEFORE_SEND_GTM_FAILED"
|
|
#define CN_COMMIT_SUBXACT_AFTER_SEND_GTM_FAILED "CN_COMMIT_SUBXACT_AFTER_SEND_GTM_FAILED"
|
|
|
|
#define CN_CANCEL_SUBQUERY_FLUSH_FAILED "CN_CANCEL_SUBQUERY_FLUSH_FAILED"
|
|
#define CN_COMMIT_BEFORE_GTM_FAILED_AND_CANCEL_FLUSH_FAILED "CN_COMMIT_BEFORE_GTM_FAILED_AND_CANCEL_FLUSH_FAILED"
|
|
|
|
#define DN_STANDBY_SLEEPIN_SYNCCOMMIT "DN_STANDBY_SLEEPIN_SYNCCOMMIT"
|
|
#define DN_XLOGFLUSH "DN_XLOGFLUSH"
|
|
#define DN_WALSEND_MAINLOOP "DN_WALSEND_MAINLOOP"
|
|
#define DN_WALRECEIVE_MAINLOOP "DN_WALRECEIVE_MAINLOOP"
|
|
#define DN_CM_NEW_CONN "DN_CM_NEW_CONN"
|
|
#define DN_PRIMARY_CHECKPOINT_KEEPXLOG "DN_PRIMARY_CHECKPOINT_KEEPXLOG"
|
|
#define DN_SLAVE_CHECKPOINT_KEEPXLOG "DN_SLAVE_CHECKPOINT_KEEPXLOG"
|
|
|
|
#endif /* DEBUG */
|
|
#endif /* DISTRIBUTE_TEST_H */
|