【源码阅读】1. 配置、VARIABLE与用户PROPERTY

发布时间 2023-06-25 18:17:45作者: xutao_ustc

 配置

初始化

在FE启动时:

● Config类ConfField注解标记的静态属性反射出Field存储到内存confFields,作为一个可读取和修改的属性列表(真正的值存储在Config类的静态属性中,反射出Field并存储到confFields只是一个读取和修改指针而已

● 读取配置文件,根据配置文件内容,设置Config类的静态属性

 

设置

confFields中根据要修改的key获取具体的Field,然后反射修改实际Config类中的值

# 设置
ADMIN SET FRONTEND CONFIG ("max_broker_concurrency" = "11"); 

注意临时的设置完后无法持久化,重启后又恢复原值

 

查看

遍历confFields中获取值并展示,根据反射字段Field从Config类中获取值 

# 展示
ADMIN SHOW FRONTEND CONFIG LIKE "max_broker_concurrency";

   

VARIABLE

通常表示在连接/Session范围内生效的变量。有几个关键对象:

● ConnectContext - 连接上下文,其中包含sessionVariable : SessionVariable属性

● SessionVariable - Session级别的变量(只是它在使用上也会作为SessionVariable的创建模板,故也有点全局设置的意思

● GlobalVariable - Global级别设置的变量

● VariableMgr - 管理全局/Session级别的变量

 

初始化

VariableMgr静态初始化时:

● 实例化静态变量defaultSessionVariable = new SessionVariable(),作为SessionVariable创建的模板

● getStringVarContextBuilder初始化ctxByVarName列表

○ 获取SessionVariable中以VarAttr注解标记的属性加入

○ 获取GlobalVariable中以VarAttr注解标记的属性加入

 

Session建立

在Session建立连接时,克隆defaultSessionVariable到ConnectContext.sessionVariable中

 

设置

对于每个SetStmt中要设置的值:

● 获取ConnectContext中SessionVariable

● 调用VariableMgr.setVar

○ 如果GLOBAL级别,将设置GlobalVariable中的静态变量值或者设置静态变量defaultSessionVariable的属性值,并同时设置ConnectContext中SessionVariable的属性值

○ 如果SESSION级别,将设置ConnectContext中SessionVariable的属性值

SET exec_mem_limit = 137438953472;
SET GLOBAL exec_mem_limit = 137438953472;

  

整体流程:

1.  上来初始化defaultSessionVariable : SessionVariable作为SessionVariable模板

2.  ConnectContext建立时,克隆defaultSessionVariable作为SessionVariable

3.  如果设置Session级别的variable,直接设置ConnectContext.SessionVariable

4.  如果设置Global级别的variable,则设置GlobalVariable或者defaultSessionVariable : SessionVariable模板

5.  下次ConnectContext建立时,克隆修改过的defaultSessionVariable作为SessionVariable

 

查看

● 查看SESSION级别变量 - 查看ConnectContext中SessionVariable的属性值

● 查看GLOBAL级别变量 - 查看GlobalVariable或者defaultSessionVariable : SessionVariable模板的属性值

SHOW [GLOBAL | SESSION] VARIABLES [LIKE 'pattern' | WHERE expr]

  

用户PROPERTY

设置

在最终设置UserProperty的时候,有如下值可以被设置:

● max_user_connections

● max_query_instances

● sql_block_rules

● cpu_resource_limit

● resource_tags.location

● exec_mem_limit

● query_timeout

● 【resource】

○ resource.cpu_share

○ resource.io_share

○ resource.ssd_read_iops

○ resource.ssd_write_iops

○ resource.ssd_read_mbps

○ resource.ssd_write_mbps

○ resource.hdd_read_iops

○ resource.hdd_write_iops

○ resource.hdd_read_mbps

○ resource.hdd_write_mbps

○ quota.low

○ quota.normal

○ quota.high

● DPP相关的设置

user property的设置若在SessionVariable中也有则优先于SessionVariable

SET PROPERTY FOR 'jack' 'max_user_connections' = '1000';

  

查看

 

SHOW PROPERTY [FOR user] [LIKE key]