* Copyright (c) 2020 Huawei Technologies Co.,Ltd.
*
* openGauss is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
*
* http://license.coscl.org.cn/MulanPSL2
*
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
* ---------------------------------------------------------------------------------------
*
* parctl.h
* definitions for parallel control functions
*
* IDENTIFICATION
* src/include/workload/parctl.h
*
* ---------------------------------------------------------------------------------------
*/
#ifndef PARCTLS_H
#define PARCTLS_H
#define MAX_PARCTL_MEMORY ((unsigned int)maxChunksPerProcess << (chunkSizeInBits - BITS_IN_MB))
#define PARCTL_PROCESS_MEMORY 32
#define PARCTL_MEMORY_UNIT 3
#define PARCTL_ACTIVE_PERCENT 80
#define PARCTL_ALL_PERCENT 100
typedef enum ParctlType {
PARCTL_NONE = 0,
PARCTL_RESERVE,
PARCTL_GLOBAL,
PARCTL_RESPOOL,
PARCTL_ACTIVE,
PARCTL_RELEASE,
PARCTL_CANCEL,
PARCTL_CLEAN,
PARCTL_SYNC,
PARCTL_TRANSACT,
PARCTL_MVNODE,
PARCTL_JPQUEUE,
PARCTL_TYPES,
} ParctlType;
typedef enum EnqueueType {
ENQUEUE_NONE = 0,
ENQUEUE_BLOCK,
ENQUEUE_ERROR,
ENQUEUE_NORESPOOL,
ENQUEUE_MEMERR,
ENQUEUE_RECOVERY,
ENQUEUE_CONNERR,
ENQUEUE_PRIVILEGE,
ENQUEUE_GROUPERR,
ENQUEUE_UNKNOWN
} EnqueueType;
typedef struct RespoolData {
Oid rpoid;
int max_pts;
int max_stmt_simple;
int max_dop;
int mem_size;
int act_pts;
int max_act_pts;
int min_act_pts;
int iops_limits;
int io_priority;
bool superuser;
bool cgchange;
char rpname[NAMEDATALEN];
char* cgroup;
} RespoolData;
typedef struct TmpResourcePool
{
Oid rpoid;
Oid parentoid;
int32 iops_limits;
int io_priority;
int mempct;
bool is_foreign;
char cgroup[NAMEDATALEN];
char ngroup[NAMEDATALEN];
} TmpResourcePool;
typedef struct ParctlManager {
int max_active_statements;
int statements_waiting_count;
int statements_runtime_count;
int statements_runtime_plus;
int max_statements;
int max_support_statements;
int current_support_statements;
int respool_waiting_count;
List* statements_waiting_list;
HTAB* resource_pool_hashtbl;
pthread_mutex_t statements_list_mutex;
} ParctlManager;
typedef struct WLMListNode {
int data;
List* request_list;
bool equals(const int* data)
{
return this->data == *data;
}
int compare(const int* data)
{
if (this->data == *data)
return 0;
return ((this->data < *data) ? 1 : -1);
}
} WLMListNode;
extern bool IsQueuedSubquery(void);
extern void WLMParctlReady(const char*);
extern void WLMParctlReserve(ParctlType);
extern void WLMParctlRelease(ParctlState*);
extern void WLMHandleDywlmSimpleExcept(bool proc_exit);
extern void InitializeUserResourcePoolHashTable();
extern void WLMSwitchQNodeList(ParctlManager*, int priority_old, int priority_new);
extern void WLMCreateResourcePoolInHash(Oid);
extern bool WLMCheckResourcePoolIsIdle(Oid);
extern int WLMJumpQueue(ParctlManager*, ThreadId);
extern void WLMSetMaxStatements(int);
extern int WLMGetActiveStatments();
extern void* WLMGetResourcePoolDataInfo(int* num);
extern ListCell* WLMSearchAndCheckMaxNode(const List* list);
extern int WLMGetMaxDop();
extern void WLMVerifyGlobalParallelControl(ParctlManager*);
extern int WLMGetMaxStatements(int active_statements);
extern void WLMCheckResourcePool();
extern void WLMProcReleaseActiveStatement(void);
extern int WLMReleaseGroupActiveStatement(void);
void WLMCheckDefaultXactReadOnly(void);
#endif