DdengxuyueMisc bugfixes
3d79c591创建于 2021年3月6日历史提交
/* ---------------------------------------------------------------------------------------
 * 
 * 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 */