Config.java

// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.

package org.apache.doris.common;

import java.io.File;

public class Config extends ConfigBase {

    @ConfField(description = {"��������������������������������������������������� fe_custom.conf��������������������������������� fe.conf ������������",
            "The path of the user-defined configuration file, used to store fe_custom.conf. "
                    + "The configuration in this file will override the configuration in fe.conf"})
    public static String custom_config_dir = EnvUtils.getDorisHome() + "/conf";

    @ConfField(description = {"fe.log ��� fe.audit.log ������������������������������������������������������������������������",
            "The maximum file size of fe.log and fe.audit.log. After exceeding this size, the log file will be split"})
    public static int log_roll_size_mb = 1024; // 1 GB

    /**
     * sys_log_dir:
     *      This specifies FE log dir. FE will produces 2 log files:
     *      fe.log:      all logs of FE process.
     *      fe.warn.log  all WARN and ERROR log of FE process.
     *
     * sys_log_level:
     *      INFO, WARN, ERROR, FATAL
     *
     * sys_log_roll_num:
     *      Maximal FE log files to be kept within an sys_log_roll_interval.
     *      default is 10, which means there will be at most 10 log files in a day
     *
     * sys_log_verbose_modules:
     *      Verbose modules. VERBOSE level is implemented by log4j DEBUG level.
     *      eg:
     *          sys_log_verbose_modules = org.apache.doris.catalog
     *      This will only print debug log of files in package org.apache.doris.catalog and all its sub packages.
     *
     * sys_log_roll_interval:
     *      DAY:  log suffix is yyyyMMdd
     *      HOUR: log suffix is yyyyMMddHH
     *
     * sys_log_delete_age:
     *      default is 7 days, if log's last modify time is 7 days ago, it will be deleted.
     *      support format:
     *          7d      7 days
     *          10h     10 hours
     *          60m     60 mins
     *          120s    120 seconds
     *
     * sys_log_enable_compress:
     *      default is false. if true, will compress fe.log & fe.warn.log by gzip
     */
    @Deprecated // use env var LOG_DIR instead
    @ConfField(description = {"FE ������������������������������������������ fe.log���",
            "The path of the FE log file, used to store fe.log"})
    public static String sys_log_dir = "";

    @ConfField(description = {"FE ���������������", "The level of FE log"}, options = {"INFO", "WARN", "ERROR", "FATAL"})
    public static String sys_log_level = "INFO";

    @ConfField(description = {"FE ������������������������������ NORMAL ���������������������������������������������������ASYNC ������������������������������������������"
            + "������������������������BRIEF ���������������������������������������������������������������������������������������������",
            "The output mode of FE log. NORMAL mode is synchronous output with location information; "
                    + "ASYNC mode is the default mode, asynchronous output with location information; "
                    + "BRIEF is asynchronous output without location information. "
                    + "The performance of the three log output modes increases in turn"},
            options = {"NORMAL", "ASYNC", "BRIEF"})
    public static String sys_log_mode = "ASYNC";

    @ConfField(description = {"FE ��� sys_log_roll_interval������������������������������������������������������������������"
            + "������������ 10������������������������������������������������������������������ 10 ������������������",
            "This parameter defines the maximum number of FE log files that can be retained within the "
            + "sys_log_roll_interval (log roll interval). The default value is 10, which means the system"
            + " will keep up to 10 log files during each log roll interval."})
    public static int sys_log_roll_num = 10;

    @ConfField(description = {
            "Verbose ���������VERBOSE ������������������������ log4j ��� DEBUG ������������������"
                    + "������������ `org.apache.doris.catalog`��������������������� package ������������ DEBUG ���������",
            "Verbose module. The VERBOSE level log is implemented by the DEBUG level of log4j. "
                    + "If set to `org.apache.doris.catalog`, "
                    + "the DEBUG log of the class under this package will be printed."})
    public static String[] sys_log_verbose_modules = {};
    @ConfField(description = {"FE ���������������������������", "The split cycle of the FE log file"}, options = {"DAY", "HOUR"})
    public static String sys_log_roll_interval = "DAY";
    @ConfField(description = {
            "FE ���������������������������������������������������������������������������������������������������������������7d, 10h, 60m, 120s",
            "The maximum survival time of the FE log file. After exceeding this time, the log file will be deleted. "
                    + "Supported formats include: 7d, 10h, 60m, 120s"})
    public static String sys_log_delete_age = "7d";
    @ConfField(description = {"������������ FE ���������������", "enable compression for FE log file"})
    public static boolean sys_log_enable_compress = false;

    @ConfField(description = {"FE ������������������������������������������������ fe.audit.log���",
            "The path of the FE audit log file, used to store fe.audit.log"})
    public static String audit_log_dir = System.getenv("LOG_DIR");
    @ConfField(description = {"FE ���������������������������������������������������������������������������������������������",
            "The maximum number of FE audit log files. "
                    + "After exceeding this number, the oldest log file will be deleted"})
    public static int audit_log_roll_num = 90;
    @ConfField(description = {"FE ���������������������������", "The type of FE audit log file"},
            options = {"slow_query", "query", "load", "stream_load"})
    public static String[] audit_log_modules = {"slow_query", "query", "load", "stream_load"};
    @ConfField(mutable = true, description = {"���������������������������������������������������������������������������������������������"
            + "������������������ audit log ������",
            "The threshold of slow query, in milliseconds. "
                    + "If the response time of a query exceeds this threshold, it will be recorded in audit log."})
    public static long qe_slow_log_ms = 5000;
    @ConfField(mutable = true, description = {"sql_digest ������������������������������������������������������������������������������������������������"
            + "������������������ sql_digest���",
            "The threshold of sql_digest generation, in milliseconds. "
                    + "If the response time of a query exceeds this threshold, "
                    + "sql_digest will be generated for it."})
    public static long sql_digest_generation_threshold_ms = 5000;
    @ConfField(description = {"FE ���������������������������������", "The split cycle of the FE audit log file"},
            options = {"DAY", "HOUR"})
    public static String audit_log_roll_interval = "DAY";
    @ConfField(description = {
            "FE ���������������������������������������������������������������������������������������������������������������������7d, 10h, 60m, 120s",
            "The maximum survival time of the FE audit log file. "
                    + "After exceeding this time, the log file will be deleted. "
                    + "Supported formats include: 7d, 10h, 60m, 120s"})
    public static String audit_log_delete_age = "30d";
    @ConfField(description = {"������������ FE ��� Audit ������", "enable compression for FE audit log file"})
    public static boolean audit_log_enable_compress = false;

    @ConfField(description = {"������������������������������������������������ LineagePlugin.name() ������������������",
            "Active lineage plugins, need to fill in the name returned by LineagePlugin.name()"})
    public static String[] activate_lineage_plugin = {};

    @ConfField(description = {"������������������������������������������ --console ������ FE ���������������������������������������������������������"
            + "������������������������������������������������������������",
            "Whether to use file to record log. When starting FE with --console, "
                    + "all logs will be written to both standard output and file. "
                    + "Close this option will no longer use file to record log."})
    public static boolean enable_file_logger = true;

    @ConfField(mutable = false, masterOnly = false,
            description = {"������������ table ���������", "Whether to check table lock leaky"})
    public static boolean check_table_lock_leaky = false;

    @ConfField(mutable = true, masterOnly = false,
            description = {"PreparedStatement stmtId ������������������������������",
                    "PreparedStatement stmtId starting position, used for testing onl"})
    public static long prepared_stmt_start_id = -1;

    @ConfField(description = {"���������������������", "The installation directory of the plugin"})
    public static String plugin_dir =  EnvUtils.getDorisHome() + "/plugins";

    @ConfField(mutable = true, masterOnly = true, description = {"������������������", "Whether to enable the plugin"})
    public static boolean plugin_enable = true;

    @ConfField(description = {
            "JDBC ��������������������������������� JDBC Catalog ������������������������������������������������������������������������������������������",
            "The path to save jdbc drivers. When creating JDBC Catalog,"
                    + "if the specified driver file path is not an absolute path, Doris will find jars from this path"})
    public static String jdbc_drivers_dir = EnvUtils.getDorisHome() + "/plugins/jdbc_drivers";

    @ConfField(description = {"JDBC ��������������������������������� JDBC Catalog ������������������������������������������������������������������������������������"
            + "��������� * ������������������������������������������������������������",
            "The safe path of the JDBC driver. When creating a JDBC Catalog,"
                    + "you can configure multiple files or network paths that are allowed to be used,"
                    + "separated by semicolons"
                    + "The default is * to allow all, if set to empty, also means to allow all"})
    public static String jdbc_driver_secure_path = "*";

    @ConfField(description = {"MySQL Jdbc Catalog mysql ������������������������",
            "MySQL Jdbc Catalog mysql does not support pushdown functions"})
    public static String[] jdbc_mysql_unsupported_pushdown_functions = {"date_trunc", "money_format", "negative"};

    @ConfField(mutable = true, description = {
            "MySQL ������������������������������������������ SET ������������������������������������������������������"
                    + "������������������ MySQL ��������������������� phpMyAdmin, mysqldump������"
                    + "Doris ���������������������������������������������������������������������������������",
            "MySQL compatibility variable whitelist. These variables will be silently ignored in SET statements "
                    + "instead of throwing an error. This is mainly used for compatibility with MySQL client tools "
                    + "(such as phpMyAdmin, mysqldump). Doris does not need to understand the specific meaning of "
                    + "these variables, it just needs to accept them without error."})
    public static String[] mysql_compat_var_whitelist = {};

    @ConfField(mutable = true, masterOnly = true, description = {"������ SQLServer Jdbc Catalog ��������� false",
            "Force SQLServer Jdbc Catalog encrypt to false"})
    public static boolean force_sqlserver_jdbc_encrypt_false = false;

    @ConfField(mutable = true, masterOnly = true, description = {"broker load ��������������������� load ������������������������������",
            "The default parallelism of the load execution plan on a single node when the broker load is submitted"})
    public static int default_load_parallelism = 8;

    @ConfField(mutable = true, masterOnly = true, description = {
            "������������������������������������������ label ��������������������������������������������� label ������������������",
            "Labels of finished or cancelled load jobs will be removed after this time"
                    + "The removed labels can be reused."})
    public static int label_keep_max_second = 3 * 24 * 3600; // 3 days

    @ConfField(mutable = true, masterOnly = true, description = {
            "������������������������������������������ INSERT, STREAMING LOAD, ROUTINE_LOAD_TASK, DELETE"
                    + "���������������������������������������������������������������������������������������������������������������������������������������",
            "For some high frequency load jobs such as INSERT, STREAMING LOAD, ROUTINE_LOAD_TASK, DELETE"
                    + "Remove the finished job or task if expired. The removed job or task can be reused."})
    public static int streaming_label_keep_max_second = 43200; // 12 hour

    @ConfField(mutable = true, masterOnly = true, description = {
            "������ ALTER, EXPORT ������������������������������������������������������������������������������",
            "For ALTER, EXPORT jobs, remove the finished job if expired."})
    public static int history_job_keep_max_second = 7 * 24 * 3600; // 7 days

    @ConfField(mutable = true, masterOnly = true, description = {
            "������ EXPORT ������������������������ EXPORT ������������������������������������������������������������",
            "For EXPORT jobs, If the number of EXPORT jobs in the system exceeds this value, "
                    + "the oldest records will be deleted."})
    public static int max_export_history_job_num = 1000;

    @ConfField(description = {"���������������������������������������������������������������������������������������������������������������������",
            "The clean interval of transaction, in seconds. "
                    + "In each cycle, the expired history transaction will be cleaned"})
    public static int transaction_clean_interval_second = 30;

    @ConfField(description = {"���������������������������������������������������������������������������������������������������������������������",
            "The clean interval of load job, in seconds. "
                    + "In each cycle, the expired history load job will be cleaned"})
    public static int label_clean_interval_second = 1 * 3600; // 1 hours

    @ConfField(mutable = true, masterOnly = true, description = {
            "Insert Overwrite ������������������������������������������������������������������������",
            "Time interval for cleaning up discarded temporary "
                    + "partitions after Insert Overwrite task fails, in milliseconds"})
    public static int overwrite_clean_interval_ms = 10000;

    @ConfField(description = {"������������������������", "The directory to save Doris meta data"})
    public static String meta_dir =  EnvUtils.getDorisHome() + "/doris-meta";

    @ConfField(description = {"���������������������������", "The directory to save Doris temp data"})
    public static String tmp_dir =  EnvUtils.getDorisHome() + "/temp_dir";

    @ConfField(description = {"���������������������������������BDB: ��������������� BDBJE ������LOCAL������������������������������������������������������",
            "The storage type of the metadata log. BDB: Logs are stored in BDBJE. "
                    + "LOCAL: logs are stored in a local file (for testing only)"}, options = {"BDB", "LOCAL"})
    public static String edit_log_type = "bdb";

    @ConfField(description = {"BDBJE ������������", "The port of BDBJE"})
    public static int edit_log_port = 9010;

    @ConfField(mutable = true, masterOnly = true, description = {
            "BDBJE ������������������������������������������������������������������������������������",
            "The log roll size of BDBJE. When the number of log entries exceeds this value, the log will be rolled"})
    public static int edit_log_roll_num = 50000;

    @ConfField(mutable = true, masterOnly = true, description = {
            "������ BDBJE ������������������������������", "The max number of log entries for batching BDBJE"})
    public static int batch_edit_log_max_item_num = 100;

    @ConfField(mutable = true, masterOnly = true, description = {
            "������ BDBJE ���������������������������", "The max size for batching BDBJE"})
    public static long batch_edit_log_max_byte_size = 640 * 1024L;

    @ConfField(mutable = true, masterOnly = true, description = {
            "��������������� BDBJE ������������������������", "The sleep time after writting multiple batching BDBJE continuously"})
    public static long batch_edit_log_rest_time_ms = 10;

    @ConfField(mutable = true, masterOnly = true, description = {
            "��������������� BDBJE ������������������������������������������������������������",
            "After writting multiple batching BDBJE continuously, need a short rest. "
                    + "Indicates the writting count before a rest"})
    public static long batch_edit_log_continuous_count_for_rest = 1000;

    @ConfField(description = {
            "��������� EditLog���", "Batch EditLog writing"})
    public static boolean enable_batch_editlog = true;

    @ConfField(description = {"������������������������������������������������������������������������������������������������������ FE ���������������������",
            "The toleration delay time of meta data synchronization, in seconds. "
                    + "If the delay of meta data exceeds this value, non-master FE will stop offering service"})
    public static int meta_delay_toleration_second = 300;    // 5 min

    @ConfField(description = {"��������������������������������������������������������� Follower FE���"
            + "������������������ `SYNC`������������������ Follower FE��������������������� `WRITE_NO_SYNC`���"
            + "������������http://docs.oracle.com/cd/E17277_02/html/java/com/sleepycat/je/Durability.SyncPolicy.html",
            "The sync policy of meta data log. If you only deploy one Follower FE, "
                    + "set this to `SYNC`. If you deploy more than 3 Follower FE, "
                    + "you can set this and the following `replica_sync_policy` to `WRITE_NO_SYNC`. "
                    + "See: http://docs.oracle.com/cd/E17277_02/html/java/com/sleepycat/je/Durability.SyncPolicy.html"},
            options = {"SYNC", "NO_SYNC", "WRITE_NO_SYNC"})
    public static String master_sync_policy = "SYNC"; // SYNC, NO_SYNC, WRITE_NO_SYNC

    @ConfField(description = {"��� `master_sync_policy`", "Same as `master_sync_policy`"},
            options = {"SYNC", "NO_SYNC", "WRITE_NO_SYNC"})
    public static String replica_sync_policy = "SYNC"; // SYNC, NO_SYNC, WRITE_NO_SYNC

    @ConfField(description = {"BDBJE ������������������������"
            + "������������http://docs.oracle.com/cd/E17277_02/html/java/com/sleepycat/je/Durability.ReplicaAckPolicy.html",
            "The replica ack policy of bdbje. "
                    + "See: http://docs.oracle.com/cd/E17277_02/html/java/com/sleepycat/je/Durability.ReplicaAckPolicy.html"},
            options = {"ALL", "NONE", "SIMPLE_MAJORITY"})
    public static String replica_ack_policy = "SIMPLE_MAJORITY"; // ALL, NONE, SIMPLE_MAJORITY

    @ConfField(description = {"BDBJE ��������������������������������������������������������������� 30 ��������� BDBJE ���������������������"
            + "������������������������������ Java GC ������������������������������������������������������������������������������������������",
            "The heartbeat timeout of bdbje between master and follower, in seconds. "
                    + "The default is 30 seconds, which is same as default value in bdbje. "
                    + "If the network is experiencing transient problems, "
                    + "of some unexpected long java GC annoying you, "
                    + "you can try to increase this value to decrease the chances of false timeouts"})
    public static int bdbje_heartbeat_timeout_second = 30;

    @ConfField(description = {"BDBJE ������������������������������������������������ FE ��� WARN ������������������������ LockTimeoutException���"
            + "���������������������������",
            "The lock timeout of bdbje operation, in seconds. "
                    + "If there are many LockTimeoutException in FE WARN log, you can try to increase this value"})
    public static int bdbje_lock_timeout_second = 5;

    @ConfField(description = {"BDBJE ��������������������������������������������������������������������������� ReplicaWriteException���"
            + "���������������������������",
            "The replica ack timeout of bdbje between master and follower, in seconds. "
                    + "If there are many ReplicaWriteException in FE WARN log, you can try to increase this value"})
    public static int bdbje_replica_ack_timeout_second = 10;

    @ConfField(description = {"��� HA ������������BDBJE ������������������������������������������������������ HA ���������������",
            "The desired upper limit on the number of bytes of reserved space to retain "
                    + "in a replicated JE Environment. "
                    + "This parameter is ignored in a non-replicated JE Environment."})
    public static long bdbje_reserved_disk_bytes = 1 * 1024 * 1024 * 1024; // 1G

    @ConfField(description = {"BDBJE ��������������������������������������������������������������������������������� BDBJE ������������������",
            "Amount of free disk space required by BDBJE. "
                    + "If the free disk space is less than this value, BDBJE will not be able to write."})
    public static long bdbje_free_disk_bytes = 1 * 1024 * 1024 * 1024; // 1G

    @ConfField(description = {"BDBJE Cache ��������������������������� 96KB���", "Amount of memory used by by BDBJE as cache. "})
    public static long bdbje_cache_size_bytes = 10 * 1024 * 1024; // 10 MB

    @ConfField(description = {"BDBJE Message ���������������", "Max message size of BDBJE. "})
    public static long bdbje_max_message_size_bytes = Integer.MAX_VALUE; // 2 GB

    @ConfField(masterOnly = true, description = {"���������������������������",
            "Num of thread to handle heartbeat events"})
    public static int heartbeat_mgr_threads_num = 8;

    @ConfField(masterOnly = true, description = {"������������������������������",
            "Queue size to store heartbeat task in heartbeat_mgr"})
    public static int heartbeat_mgr_blocking_queue_size = 1024;

    @ConfField(masterOnly = true, description = {"TabletStatMgr ���������",
            "Num of thread to update tablet stat"})
    public static int tablet_stat_mgr_threads_num = -1;

    @ConfField(masterOnly = true, description = {"Agent ���������������������������",
            "Num of thread to handle agent task in agent task thread-pool"})
    public static int max_agent_task_threads_num = 4096;

    @ConfField(description = {"BDBJE ������������������������������������������������������������������������������������������"
            + "��� BDBJE ��������������������������������������������� BDBJE ������������",
            "The max txn number which bdbje can rollback when trying to rejoin the group. "
                    + "If the number of rollback txn is larger than this value, "
                    + "bdbje will not be able to rejoin the group, and you need to clean up bdbje data manually."})
    public static int txn_rollback_limit = 100;

    @ConfField(description = {"������������������������������������ FE ������������������������"
            + "���������������������������������������������������������������"
            + "��������������������������������������������������������� CIDR ���������������������",
            "The preferred network address. If FE has multiple network addresses, "
                    + "this configuration can be used to specify the preferred network address. "
                    + "This is a semicolon-separated list, "
                    + "each element is a CIDR representation of the network address"})
    public static String priority_networks = "";

    @ConfField(mutable = true, description = {"������������������������������������ FE ���������������������������������������"
            + "������ Master FE ��������������������������������������������������� Master FE ������������������������������������������"
            + "��������������������� Master FE ������������������������",
            "If true, non-master FE will ignore the meta data delay gap between Master FE and its self, "
                    + "even if the metadata delay gap exceeds this threshold. "
                    + "Non-master FE will still offer read service. "
                    + "This is helpful when you try to stop the Master FE for a relatively long time for some reason, "
                    + "but still wish the non-master FE can offer read service."})
    public static boolean ignore_meta_check = false;

    @ConfField(description = {"��� Master FE ��� Master FE ������������������������������������������"
            + "������������������������ Master FE ��� Master FE ������������ BDBJE ������������������������������"
            + "������������������������������������������ BDBJE ���������������������",
            "The maximum clock skew between non-master FE to Master FE host, in milliseconds. "
                    + "This value is checked whenever a non-master FE establishes a connection to master FE via BDBJE. "
                    + "The connection is abandoned if the clock skew is larger than this value."})
    public static long max_bdbje_clock_delta_ms = 5000; // 5s

    @ConfField(mutable = true, description = {"������������������ http ���������������",
            "Whether to enable all http interface authentication"}, varType = VariableAnnotation.EXPERIMENTAL)
    public static boolean enable_all_http_auth = false;

    @ConfField(description = {"FE http ��������������������� FE ��� http ������������������",
            "Fe http port, currently all FE's http port must be same"})
    public static int http_port = 8030;

    @ConfField(description = {"FE https ��������������������� FE ��� https ������������������",
            "Fe https port, currently all FE's https port must be same"})
    public static int https_port = 8050;

    @ConfField(description = {"FE https ��������� key store ������",
            "The key store path of FE https service"})
    public static String key_store_path =  EnvUtils.getDorisHome()
            + "/conf/ssl/doris_ssl_certificate.keystore";

    @ConfField(description = {"FE https ��������� key store ������",
            "The key store password of FE https service"})
    public static String key_store_password = "";

    @ConfField(description = {"FE https ��������� key store ������",
            "The key store type of FE https service"})
    public static String key_store_type = "JKS";

    @ConfField(description = {"FE https ��������� key store ������",
            "The key store alias of FE https service"})
    public static String key_store_alias = "doris_ssl_certificate";

    @ConfField(description = {"������������ https������������������http ������������������",
            "Whether to enable https, if enabled, http port will not be available"},
            varType = VariableAnnotation.EXPERIMENTAL)
    public static boolean enable_https = false;

    @ConfField(description = {"Jetty ��� acceptor ������������Jetty ���������������������������������������������������������acceptor���selector ��� worker���"
            + "acceptor ��������������������������������������� selector ������ HTTP ��������������������������������� worker ���������������"
            + "������������������������������������������������������������������������������ socket ������������������������������������������"
            + "��������������������������������� 1-2 ��� acceptor ���������2 ��� 4 ������������������Worker ��������������������������� QPS ��� IO ������������������"
            + "������ QPS��������� IO ���������������������������������������������������������������������",
            "The number of acceptor threads for Jetty. Jetty's thread architecture model is very simple, "
                    + "divided into three thread pools: acceptor, selector and worker. "
                    + "The acceptor is responsible for accepting new connections, "
                    + "and then handing it over to the selector to process the unpacking of the HTTP message protocol, "
                    + "and finally the worker processes the request. "
                    + "The first two thread pools adopt a non-blocking model, "
                    + "and one thread can handle many socket reads and writes, "
                    + "so the number of thread pools is small. For most projects, "
                    + "only 1-2 acceptor threads are needed, 2 to 4 should be enough. "
                    + "The number of workers depends on the ratio of QPS and IO events of the application. "
                    + "The higher the QPS, or the higher the IO ratio, the more threads are waiting, "
                    + "and the more threads are required."})
    public static int jetty_server_acceptors = 2;
    @ConfField(description = {"Jetty ��� selector ������������", "The number of selector threads for Jetty."})
    public static int jetty_server_selectors = 4;
    @ConfField(description = {"Jetty ��� worker ������������0 ������������������������������",
            "The number of worker threads for Jetty. 0 means using the default thread pool."})
    public static int jetty_server_workers = 0;

    @ConfField(description = {"Jetty ���������������������������������������",
            "The default minimum number of threads for jetty."})
    public static int jetty_threadPool_minThreads = 20;
    @ConfField(description = {"Jetty ���������������������������������������",
            "The default maximum number of threads for jetty."})
    public static int jetty_threadPool_maxThreads = 400;

    @ConfField(description = {"Jetty ��������� HTTP POST ��������������������������������������� 100MB���",
            "The maximum HTTP POST size of Jetty, in bytes, the default value is 100MB."})
    public static int jetty_server_max_http_post_size = 100 * 1024 * 1024;

    @ConfField(description = {"Jetty ��������� HTTP header ��������������������������������������� 1MB���",
            "The maximum HTTP header size of Jetty, in bytes, the default value is 1MB."})
    public static int jetty_server_max_http_header_size = 1048576;

    @ConfField(description = {"������������ mini load���������������",
            "Whether to disable mini load, disabled by default"})
    public static boolean disable_mini_load = true;

    @ConfField(description = {"mysql nio server ��� backlog ���������"
            + "������������������������������������������ /proc/sys/net/core/somaxconn ������",
            "The backlog number of mysql nio server. "
                    + "If you enlarge this value, you should enlarge the value in "
                    + "`/proc/sys/net/core/somaxconn` at the same time"})
    public static int mysql_nio_backlog_num = 1024;

    @ConfField(description = {"������������ mysql ������������ TCP keep alive���������������",
            "Whether to enable TCP Keep-Alive for MySQL connections, disabled by default"})
    public static boolean mysql_nio_enable_keep_alive = false;

    @ConfField(description = {"thrift client ������������������������������������������0 ������������������������������",
            "The connection timeout of thrift client, in milliseconds. 0 means no timeout."})
    public static int thrift_client_timeout_ms = 0;

    @ConfField(mutable = true, masterOnly = false,
            description = {"Thrift RPC ������������������������������������������������ TCP connect ������������ TLS ���������"
                    + "������������ reopen() ������������������������������������0 ������������������",
                    "Timeout in milliseconds for the connect phase of Thrift RPC connections, "
                    + "including TCP connect and potential TLS handshake. "
                    + "Prevents long blocking during reopen() when network is unreachable. "
                    + "0 means no timeout."})
    public static int thrift_rpc_connect_timeout_ms = 10000;

    // The default value is inherited from org.apache.thrift.TConfiguration
    @ConfField(description = {"thrift server ���������������������������",
            "The maximum size of a (received) message of the thrift server, in bytes"})
    public static int thrift_max_message_size = 100 * 1024 * 1024;

    // The default value is inherited from org.apache.thrift.TConfiguration
    @ConfField(description = {"thrift server transport ������������������������������������",
            "The limits of the size of one frame of thrift server transport"})
    public static int thrift_max_frame_size = 16384000;

    @ConfField(description = {"thrift server ��� backlog ���������"
            + "������������������������������������������ /proc/sys/net/core/somaxconn ������",
            "The backlog number of thrift server. "
                    + "If you enlarge this value, you should enlarge the value in "
                    + "`/proc/sys/net/core/somaxconn` at the same time"})
    public static int thrift_backlog_num = 1024;

    @ConfField(description = {"FE thrift server ������������", "The port of FE thrift server"})
    public static int rpc_port = 9020;

    @ConfField(description = {"FE MySQL server ������������", "The port of FE MySQL server"})
    public static int query_port = 9030;

    @ConfField(description = {"FE Arrow-Flight-SQL server ������������", "The port of FE Arrow-Flight-SQL server"})
    public static int arrow_flight_sql_port = 8070;

    @ConfField(description = {"MySQL ��������� IO ���������", "The number of IO threads in MySQL service"})
    public static int mysql_service_io_threads_num = 4;

    @ConfField(description = {"MySQL ������������������������������", "The max number of task threads in MySQL service"})
    public static int max_mysql_service_task_threads_num = 4096;

    @ConfField(description = {"BackendServiceProxy ��������������������� GRPC channel",
            "BackendServiceProxy pool size for pooling GRPC channels."})
    public static int backend_proxy_num = 48;

    @ConfField(description = {
            "������ ID��������������������������������������������������������������������������������� cluster id. ������������������������������",
            "Cluster id used for internal authentication. Usually a random integer generated when master FE "
                    + "start at first time. You can also specify one."})
    public static int cluster_id = -1;

    @ConfField(description = {"������ token������������������������",
            "Cluster token used for internal authentication."})
    public static String auth_token = "";

    @ConfField(mutable = true, masterOnly = true,
            description = {"������������ Replica ��������������������������������������������������������� m ��� tablet��������� tablet ��� n ��� replica���"
                    + "������������������������ `m * n * tablet_create_timeout_second`",
                    "Maximal waiting time for creating a single replica, in seconds. "
                            + "eg. if you create a table with #m tablets and #n replicas for each tablet, "
                            + "the create table request will run at most "
                            + "(m * n * tablet_create_timeout_second) before timeout"})
    public static int tablet_create_timeout_second = 2;

    @ConfField(mutable = true, masterOnly = true, description = {"������������������������������������������������",
            "Minimal waiting time for creating a table, in seconds."})
    public static int min_create_table_timeout_second = 30;

    @ConfField(mutable = true, masterOnly = true, description = {"������������������������������������������������",
            "Maximal waiting time for creating a table, in seconds."})
    public static int max_create_table_timeout_second = 3600;

    @ConfField(mutable = true, masterOnly = true, description = {"������ Publish ���������������������������������������������",
            "Maximal waiting time for all publish version tasks of one transaction to be finished, in seconds."})
    public static int publish_version_timeout_second = 30; // 30 seconds

    @ConfField(mutable = true, masterOnly = true, description = {"������ Publish ���������������������������������������������������������"
            + "��������������� tablet ��������������������������������������������������� -1 ���������������������������",
            "Waiting time for one transaction changing to \"at least one replica success\", in seconds."
            + "If time exceeds this, and for each tablet it has at least one replica publish successful, "
            + "then the load task will be successful." })
    public static int publish_wait_time_second = 300;

    @ConfField(mutable = true, masterOnly = true, description = {"������ Publish ��������������������������� Schema ������������������"
            + "��������������������������������������������������������������������������������� Schema ���������������������������������������������������",
            "Check the replicas which are doing schema change when publish transaction. Do not turn off this check "
            + " under normal circumstances. It's only temporarily skip check if publish version and schema change have"
            + " dead lock" })
    public static boolean publish_version_check_alter_replica = true;

    @ConfField(mutable = true, masterOnly = true, description = {"������������ publish ���������������������",
            "print log interval for publish transaction failed interval"})
    public static long publish_fail_log_interval_second = 5 * 60;

    @ConfField(mutable = true, masterOnly = true, description = {"������ PUBLISH_VERSION ���������������������������������������",
            "the upper limit of failure logs of PUBLISH_VERSION task"})
    public static long publish_version_task_failed_log_threshold = 80;

    @ConfField(masterOnly = true, description = {"Publish ������������������",
            "Num of thread to handle publish task"})
    public static int publish_thread_pool_num = 128;

    @ConfField(masterOnly = true, description = {"Publish ������������������������",
            "Queue size to store publish task in publish thread pool"})
    public static int publish_queue_size = 128;

    @ConfField(mutable = true, description = {"������������������������������",
            "Whether to enable parallel publish version"})
    public static boolean enable_parallel_publish_version = true;


    @ConfField(masterOnly = true, description = {"Tablet report ������������������",
        "Num of thread to handle tablet report task"})
    public static int tablet_report_thread_pool_num = 10;

    @ConfField(masterOnly = true, description = {"Tablet report ������������������������",
        "Queue size to store tablet report task in publish thread pool"})
    public static int tablet_report_queue_size = 1024;

    @ConfField(mutable = true, masterOnly = true, description = {"���������������������������������������������������"
            + "��������������������������� insert ������������",
            "Maximal waiting time for all data inserted before one transaction to be committed, in seconds. "
                    + "This parameter is only used for transactional insert operation"})
    public static int commit_timeout_second = 30; // 30 seconds

    @ConfField(masterOnly = true, description = {"Publish ������������������������������������������������������",
            "The interval of publish task trigger thread, in milliseconds"})
    public static int publish_version_interval_ms = 10;

    @ConfField(mutable = true, masterOnly = true, description = {
            "If the number of publishing transactions of a table exceeds this value, new transactions will "
            + "be rejected. Set to -1 to disable this limit.",
            "��������������������������������������������������������������������������������������� -1 ������������������"})
    public static long max_publishing_txn_num_per_table = 500;

    @ConfField(description = {"thrift server ��������� worker ���������", "The max worker threads of thrift server"})
    public static int thrift_server_max_worker_threads = 4096;

    @ConfField(mutable = true, masterOnly = true, description = {"Delete ���������������������������������������������",
            "Maximal timeout for delete job, in seconds."})
    public static int delete_job_max_timeout_second = 300;

    @ConfField(mutable = true, masterOnly = true, description = {"Load ���������������������������������������",
            "Minimal number of write successful replicas for load job."})
    public static short min_load_replica_num = -1;

    @ConfField(description = {"load job ������������������������������������������",
            "The interval of load job scheduler, in seconds."})
    public static int load_checker_interval_second = 5;

    @ConfField(description = {"ingestion load job ������������������������������������������",
            "The interval of ingestion load job scheduler, in seconds."})
    public static int ingestion_load_checker_interval_second = 60;

    @ConfField(mutable = true, masterOnly = true, description = {"Broker load ���������������������������������������",
            "Default timeout for broker load job, in seconds."})
    public static int broker_load_default_timeout_second = 14400; // 4 hour

    @ConfField(description = {"��� Broker ��������������� RPC ������������������������������������",
            "The timeout of RPC between FE and Broker, in milliseconds"})
    public static int broker_timeout_ms = 10000; // 10s

    @ConfField(description = {"���������������������������������������������",
            "The timeout of RPC for high concurrenty short circuit query"})
    public static int point_query_timeout_ms = 10000; // 10s

    @ConfField(mutable = true, masterOnly = true, description = {"Insert load ���������������������������������������",
            "Default timeout for insert load job, in seconds."})
    public static int insert_load_default_timeout_second = 14400; // 4 hour

    @ConfField(mutable = true, masterOnly = true, description = {"��� mow ��������������� order by keys���������������",
            "random set order by keys for mow table for test"})
    public static boolean random_add_order_by_keys_for_mow = false;

    @ConfField(mutable = true, masterOnly = true, description = {
            "��� fuzzy ������������������������������������ V3 storage_format���ext_meta������������������������",
            "Randomly use V3 storage_format (ext_meta) for some tables in fuzzy tests to increase coverage"})
    public static boolean random_use_v3_storage_format = true;

    @ConfField(mutable = true, masterOnly = true, description = {
            "���������������������������������������������insert into ��� stream load ������������������",
            "Wait for the internal batch to be written before returning; "
                    + "insert into and stream load use group commit by default."})
    public static boolean wait_internal_group_commit_finish = false;

    @ConfField(mutable = true, masterOnly = true, description = {
            "The stale threshold of checkpoint image file in cloud mode (in seconds). "
                    + "If the image file is older than this threshold, a new checkpoint will be triggered "
                    + "even if there are no new journals. This helps keep table version, partition version, "
                    + "and tablet stats in the image up-to-date. If the value is less than or equal to 0, "
                    + "this feature is disabled."})
    public static long cloud_checkpoint_image_stale_threshold_seconds = 3600;

    @ConfField(mutable = false, masterOnly = true, description = {"���������������������������������������������",
            "Default commit interval in ms for group commit"})
    public static int group_commit_interval_ms_default_value = 10000;

    @ConfField(mutable = false, masterOnly = true, description = {"��������������������������������������������������������� 128M",
            "Default commit data bytes for group commit"})
    public static int group_commit_data_bytes_default_value = 134217728;

    @ConfField(mutable = true, masterOnly = true, description = {
            "������������������������������ table ��� group_commit_interval_ms ���������",
            "The internal group commit timeout is the multiple of table's group_commit_interval_ms"})
    public static int group_commit_timeout_multipler = 10;

    @ConfField(mutable = true, masterOnly = true, description = {"Stream load ���������������������������������������",
            "Default timeout for stream load job, in seconds."})
    public static int stream_load_default_timeout_second = 86400 * 3; // 3days

    @ConfField(mutable = true, masterOnly = true, description = {"Stream load ������������������������������������������������",
            "Default pre-commit timeout for stream load job, in seconds."})
    public static int stream_load_default_precommit_timeout_second = 3600; // 3600s

    @ConfField(mutable = true, masterOnly = true, description = {"Stream Load ������������������ memtable ������",
            "Whether to enable memtable on sink node by default in stream load"})
    public static boolean stream_load_default_memtable_on_sink_node = false;

    @ConfField(mutable = true, masterOnly = true, description = {"Load ���������������������������������������",
            "Maximal timeout for load job, in seconds."})
    public static int max_load_timeout_second = 259200; // 3days

    @ConfField(mutable = true, masterOnly = true, description = {"Stream load ���������������������������������������",
            "Maximal timeout for stream load job, in seconds."})
    public static int max_stream_load_timeout_second = 259200; // 3days

    @ConfField(mutable = true, masterOnly = true, description = {"Load ���������������������������������������",
            "Minimal timeout for load job, in seconds."})
    public static int min_load_timeout_second = 1; // 1s

    @ConfField(mutable = true, masterOnly = true, description = {"Ingestion load ���������������������������������������",
            "Default timeout for ingestion load job, in seconds."})
    public static int ingestion_load_default_timeout_second = 86400; // 1 day

    @ConfField(mutable = true, masterOnly = true, description = {"Broker Load ��������������� job ���������"
            + "��������������������������������������������������������������� master������������������ job ���������������������������������",
            "Maximal number of waiting jobs for Broker Load. This is a desired number. "
                    + "In some situation, such as switch the master, "
                    + "the current number is maybe more than this value."})
    public static int desired_max_waiting_jobs = 100;

    @ConfField(mutable = true, masterOnly = true, description = {"FE ��� BE ������ Stream Load ������������������������",
            "The interval of FE fetch stream load record from BE."})
    public static int fetch_stream_load_record_interval_second = 120;

    @ConfField(mutable = true, masterOnly = true, description = {"Stream load ���������������������������",
            "Default max number of recent stream load record that can be stored in memory."})
    public static int max_stream_load_record_size = 5000;

    @ConfField(mutable = true, masterOnly = true, description = {
            "������������ show stream load ��� clear stream load ��������������������������������������� stream load ���������",
            "Whether to disable show stream load and clear stream load records in memory."})
    public static boolean disable_show_stream_load = false;

    @ConfField(mutable = true, description = {
            "������������ stream load profile",
            "Whether to enable stream load profile"
    })
    public static boolean enable_stream_load_profile = false;

    @ConfField(mutable = true, masterOnly = true, description = {
            "������������ stream load ��� broker load ���������������������",
            "Whether to enable to write single replica for stream load and broker load."},
            varType = VariableAnnotation.EXPERIMENTAL)
    public static boolean enable_single_replica_load = false;

    @ConfField(mutable = true, masterOnly = true, description = {
            "������ tablet ������������������������ DUPLICATE KEY ��������������������� shuffle",
            "Shuffle won't be enabled for DUPLICATE KEY tables if its tablet num is lower than this number"},
            varType = VariableAnnotation.EXPERIMENTAL)
    public static int min_tablets_for_dup_table_shuffle = 64;

    @ConfField(mutable = true, masterOnly = true, description = {
            "������������������������������������������������������ prepare ��� commit ���������",
            "Maximum concurrent running txn num including prepare, commit txns under a single db.",
            "Txn manager will reject coming txns."})
    public static int max_running_txn_num_per_db = 10000;

    @ConfField(masterOnly = true, description = {"pending load task ���������������������������������������������������������������������������"
            + "��������������� `max_running_txn_num_per_db`���",
            "The pending load task executor pool size. "
                    + "This pool size limits the max running pending load tasks.",
            "Currently, it only limits the pending load task of broker load and ingestion load.",
            "It should be less than `max_running_txn_num_per_db`"})
    public static int async_pending_load_task_pool_size = 10;

    @ConfField(masterOnly = true, description = {"loading load task ���������������������������������������������������������������������������",
            "The loading load task executor pool size. "
                    + "This pool size limits the max running loading load tasks.",
            "Currently, it only limits the loading load task of broker load."})
    public static int async_loading_load_task_pool_size = 10;

    @ConfField(mutable = true, masterOnly = true, description = {
            "��� `tablet_create_timeout_second` ������������������������������ Delete ������������",
            "The same meaning as `tablet_create_timeout_second`, but used when delete a tablet."})
    public static int tablet_delete_timeout_second = 2;

    @ConfField(mutable = true, masterOnly = true, description = {
            "��������������������������������������������� BE ������������������",
            "The high water of disk capacity used percent. This is used for calculating load score of a backend."})
    public static double capacity_used_percent_high_water = 0.75;

    @ConfField(mutable = true, masterOnly = true, description = {
            "������������������������������������������������",
            "The max diff of disk capacity used percent between BE. "
                    + "It is used for calculating load score of a backend."})
    public static double used_capacity_percent_max_diff = 0.30;

    @ConfField(mutable = true, masterOnly = true, description = {
            "��������������� BE ���������������������������������������BE ��������������������������������������������������������������������������� [0, 1]���"
                    + "���������������������������������������������������������������������",
            "Sets a fixed disk usage factor in the BE load fraction. The BE load score is a combination of disk usage "
                    + "and replica count. The valid value range is [0, 1]. When it is out of this range, other "
                    + "methods are used to automatically calculate this coefficient."})
    public static double backend_load_capacity_coeficient = -1.0;

    @ConfField(mutable = true, masterOnly = true, description = {
            "ALTER TABLE ���������������������������������������������������������������������������",
            "Maximal timeout of ALTER TABLE request. Set long enough to fit your table data size."})
    public static int alter_table_timeout_second = 86400 * 30; // 1month

    @ConfField(mutable = true, masterOnly = true, description = {
            "������������������������������������������������ReportHandler ��������������� tablet ������������������"
                    + "��������������������������������������������������� false���",
            "When disable_storage_medium_check is true, ReportHandler would not check tablet's storage medium "
                    + "and disable storage cool down function."})
    public static boolean disable_storage_medium_check = false;

    @ConfField(description = {"������������������������������������������������ (HDD ��� SSD)���������������������"
            + "������������������������������������������",
            "When create a table(or partition), you can specify its storage medium(HDD or SSD)."})
    public static String default_storage_medium = "HDD";

    @ConfField(mutable = true, masterOnly = true, description = {
            "��������������� (���/������) ������������������ RECOVER ���������������������������������������������������������������"
                    + "���������������������������������������������",
            "After dropping database(table/partition), you can recover it by using RECOVER stmt.",
            "And this specifies the maximal data retention time. After time, the data will be deleted permanently."})
    public static long catalog_trash_expire_second = 86400L; // 1day

    @ConfField
    public static boolean catalog_trash_ignore_min_erase_latency = false;

    @ConfField(mutable = true, masterOnly = true, description = {
            "������ broker scanner ���������������������������Broker Load ������������������"
                    + "���������������������������������������������������������������",
            "Minimal bytes that a single broker scanner will read. When splitting file in broker load, "
                    + "if the size of split file is less than this value, it will not be split."})
    public static long min_bytes_per_broker_scanner = 67108864L; // 64MB

    @ConfField(mutable = true, masterOnly = true, description = {
            "������ broker scanner ���������������������", "Maximal concurrency of broker scanners."})
    public static int max_broker_concurrency = 100;

    // TODO(cmy): Disable by default because current checksum logic has some bugs.
    @ConfField(mutable = true, masterOnly = true, description = {
            "������������������������������������ `consistency_check_end_time` ������������������������������������������������������"
                    + "������������������������������������������������������������������������������������",
            "Start time of consistency check. Used with `consistency_check_end_time` "
                    + "to decide the start and end time of consistency check. "
                    + "If set to the same value, consistency check will not be scheduled."})
    public static String consistency_check_start_time = "23";
    @ConfField(mutable = true, masterOnly = true, description = {
            "������������������������������������ `consistency_check_start_time` ������������������������������������������������������"
                    + "������������������������������������������������������������������������������������",
            "End time of consistency check. Used with `consistency_check_start_time` "
                    + "to decide the start and end time of consistency check. "
                    + "If set to the same value, consistency check will not be scheduled."})
    public static String consistency_check_end_time = "23";

    @ConfField(mutable = true, masterOnly = true, description = {
            "������������������������������������������������������������������������������������������������",
            "Default timeout of a single consistency check task. Set long enough to fit your tablet size."})
    public static long check_consistency_default_timeout_second = 600; // 10 min

    @ConfField(description = {"������ FE ��� MySQL Server ���������������������",
            "Maximal number of connections of MySQL server per FE."})
    public static int qe_max_connection = 1024;

    @ConfField(mutable = true, description = {"Colocate join ������ instance ��������� penalty ���������"
            + "���������������`exec_mem_limit / min (query_colocate_join_memory_limit_penalty_factor, instance_num)`",
            "Colocate join PlanFragment instance memory limit penalty factor.",
            "The memory_limit for colocote join PlanFragment instance = "
                    + "`exec_mem_limit / min (query_colocate_join_memory_limit_penalty_factor, instance_num)`"})
    public static int query_colocate_join_memory_limit_penalty_factor = 1;

    /**
     * This configs can set to true to disable the automatic colocate tables's relocate and balance.
     * If 'disable_colocate_balance' is set to true,
     *   ColocateTableBalancer will not relocate and balance colocate tables.
     * Attention:
     *   Under normal circumstances, there is no need to turn off balance at all.
     *   Because once the balance is turned off, the unstable colocate table may not be restored
     *   Eventually the colocate plan cannot be used when querying.
     */
    @ConfField(mutable = true, masterOnly = true) public static boolean disable_colocate_balance = false;

    @ConfField(mutable = true, masterOnly = true, description = {"������������ group ������������",
            "is allow colocate balance between all groups"})
    public static boolean disable_colocate_balance_between_groups = false;

    /**
     * The default user resource publishing timeout.
     */
    @Deprecated
    @ConfField public static int meta_publish_timeout_ms = 1000;
    @ConfField public static boolean proxy_auth_enable = false;
    @ConfField public static String proxy_auth_magic_prefix = "x@8";
    /**
     * Limit on the number of expr children of an expr tree.
     * Exceed this limit may cause long analysis time while holding database read lock.
     * Do not set this if you know what you are doing.
     */
    @ConfField(mutable = true)
    public static int expr_children_limit = 10000;
    /**
     * Limit on the depth of an expr tree.
     * Exceed this limit may cause long analysis time while holding db read lock.
     * Do not set this if you know what you are doing.
     */
    @ConfField(mutable = true)
    public static int expr_depth_limit = 3000;

    // Configurations for backup and restore
    /**
     * Plugins' path for BACKUP and RESTORE operations. Currently deprecated.
     */
    @Deprecated
    @ConfField public static String backup_plugin_path = "/tools/trans_file_tool/trans_files.sh";

    // For forward compatibility, will be removed later.
    // check token when download image file.
    @ConfField public static boolean enable_token_check = true;

    /**
     * Set to true if you deploy Palo using thirdparty deploy manager
     * Valid options are:
     *      disable:    no deploy manager
     *      k8s:        Kubernetes NB:Support removed starting from version 3.1.X
     *      ambari:     Ambari NB: Support removed starting from version 3.1.X
     *      local:      Local File (for test or Boxer2 BCC version)
     */
    @ConfField public static String enable_deploy_manager = "disable";

    // Set runtime locale when exec some cmds
    @ConfField public static String locale = "zh_CN.UTF-8";

    // default timeout of backup job
    @ConfField(mutable = true, masterOnly = true)
    public static int backup_job_default_timeout_ms = 86400 * 1000; // 1 day

    /**
     * 'storage_high_watermark_usage_percent' limit the max capacity usage percent of a Backend storage path.
     * 'storage_min_left_capacity_bytes' limit the minimum left capacity of a Backend storage path.
     * If both limitations are reached, this storage path can not be chose as tablet balance destination.
     * But for tablet recovery, we may exceed these limit for keeping data integrity as much as possible.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static int storage_high_watermark_usage_percent = 85;
    @ConfField(mutable = true, masterOnly = true)
    public static long storage_min_left_capacity_bytes = 2 * 1024 * 1024 * 1024L; // 2G

    /**
     * If capacity of disk reach the 'storage_flood_stage_usage_percent' and 'storage_flood_stage_left_capacity_bytes',
     * the following operation will be rejected:
     * 1. load job
     * 2. restore job
     */
    @ConfField(mutable = true, masterOnly = true)
    public static int storage_flood_stage_usage_percent = 95;
    @ConfField(mutable = true, masterOnly = true)
    public static long storage_flood_stage_left_capacity_bytes = 1 * 1024 * 1024 * 1024; // 1GB

    // update interval of tablet stat
    // All frontends will get tablet stat from all backends at each interval
    @ConfField(mutable = true)
    public static int tablet_stat_update_interval_second = 60;  // 1 min

    // update interval of alive session
    // Only master FE collect this info from all frontends at each interval
    @ConfField public static int alive_session_update_interval_second = 5;

    @ConfField public static int fe_session_mgr_threads_num = 1;

    @ConfField public static int fe_session_mgr_blocking_queue_size = 1024;

    @ConfField(mutable = true, masterOnly = true)
    public static int loss_conn_fe_temp_table_keep_second = 60;

    /**
     * Max bytes a broker scanner can process in one broker load job.
     * Commonly, each Backends has one broker scanner.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static long max_bytes_per_broker_scanner = 500 * 1024 * 1024 * 1024L; // 500G

    /**
     * Max number of load jobs, include PENDING���ETL���LOADING���QUORUM_FINISHED.
     * If exceed this number, load job is not allowed to be submitted.
     */
    @Deprecated
    @ConfField(mutable = true, masterOnly = true)
    public static long max_unfinished_load_job = 1000;

    /**
     * If set to true, Planner will try to select replica of tablet on same host as this Frontend.
     * This may reduce network transmission in following case:
     * 1. N hosts with N Backends and N Frontends deployed.
     * 2. The data has N replicas.
     * 3. High concurrency queries are sent to all Frontends evenly
     * In this case, all Frontends can only use local replicas to do the query.
     * If you want to allow fallback to nonlocal replicas when no local replicas available,
     * set enable_local_replica_selection_fallback to true.
     */
    @ConfField(mutable = true)
    public static boolean enable_local_replica_selection = false;

    /**
     * Used with enable_local_replica_selection.
     * If the local replicas is not available, fallback to the nonlocal replicas.
     * */
    @ConfField(mutable = true)
    public static boolean enable_local_replica_selection_fallback = false;

    /**
     * The number of query retries.
     * A query may retry if we encounter RPC exception and no result has been sent to user.
     * You may reduce this number to avoid Avalanche disaster.
     */
    @ConfField(mutable = true)
    public static int max_query_retry_time = 3;

    /**
     * The number of point query retries in executor.
     * A query may retry if we encounter RPC exception and no result has been sent to user.
     * You may reduce this number to avoid Avalanche disaster.
     */
    @ConfField(mutable = true)
    public static int max_point_query_retry_time = 2;

    /**
     * If set to true, FE may omit heavy reusable parameters (desc_tbl/output_expr/query_options)
     * in point lookup requests (PTabletKeyLookupRequest) when executing prepared statements.
     * BE will first try to find reusable context from LookupConnectionCache by uuid; if missing,
     * BE asks FE to resend a full request with these parameters via
     * response.need_resend_query_context.
     *
     * This can greatly reduce FE outbound network throughput when cache hit rate is high.
     */
    @ConfField(mutable = true, description = {
            "������������ point query ���������������������������FE ��� PreparedStatement ���������������������������"
                    + " desc_tbl/output_expr/query_options���BE ��������������������������������������� FE ���������������������"
                    + "��� BE ������������������������������������������������ FE ������������������",
            "Whether to enable lightweight point-query requests. When enabled, FE will omit"
                    + " desc_tbl/output_expr/query_options on the first PreparedStatement execute"
                    + " request, and BE will ask FE to resend the full request if reusable cache"
                    + " is missing. This can significantly reduce FE outbound bandwidth when the"
                    + " BE-side reusable cache hit rate is high."
    })
    public static boolean enable_lightweight_lookup_request = false;

    /**
     * The tryLock timeout configuration of catalog lock.
     * Normally it does not need to change, unless you need to test something.
     */
    @ConfField(mutable = true)
    public static long catalog_try_lock_timeout_ms = 5000; // 5 sec

    /**
     * if this is set to true
     *    all pending load job will failed when call begin txn api
     *    all prepare load job will failed when call commit txn api
     *    all committed load job will waiting to be published
     */
    @ConfField(mutable = true, masterOnly = true)
    public static boolean disable_load_job = false;

    /*
     * One master daemon thread will update database used data quota for db txn manager
     * every db_used_data_quota_update_interval_secs
     */
    @ConfField(mutable = false, masterOnly = true)
    public static int db_used_data_quota_update_interval_secs = 300;

    /**
     * fe will call es api to get es index shard info every es_state_sync_interval_secs
     */
    @ConfField
    public static long es_state_sync_interval_second = 10;

    /**
     * the factor of delay time before deciding to repair tablet.
     * if priority is VERY_HIGH, repair it immediately.
     * HIGH, delay tablet_repair_delay_factor_second * 1;
     * NORMAL: delay tablet_repair_delay_factor_second * 2;
     * LOW: delay tablet_repair_delay_factor_second * 3;
     */
    @ConfField(mutable = true, masterOnly = true)
    public static long tablet_repair_delay_factor_second = 60;

    /**
     * clone a tablet, further repair timeout.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static long tablet_further_repair_timeout_second = 20 * 60;

    /**
     * clone a tablet, further repair max times.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static int tablet_further_repair_max_times = 5;

    /**
     * if tablet loaded txn failed recently, it will get higher priority to repair.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static long tablet_recent_load_failed_second = 30 * 60;

    /**
     * base time for higher tablet scheduler task,
     * set this config value bigger if want the high priority effect last longer.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static long tablet_schedule_high_priority_second = 30 * 60;

    /**
     * publish version queue's size in be, report it to fe,
     * if publish task in be exceed direct_publish_limit_number,
     * fe will direct publish task
     */
    @ConfField(mutable = true, masterOnly = true)
    public static int publish_version_queued_limit_number = 1000;

    /**
     * the default slot number per path for hdd in tablet scheduler
     * TODO(cmy): remove this config and dynamically adjust it by clone task statistic
     */
    @ConfField(mutable = true, masterOnly = true)
    public static int schedule_slot_num_per_hdd_path = 4;


    /**
     * the default slot number per path for ssd in tablet scheduler
     * TODO(cmy): remove this config and dynamically adjust it by clone task statistic
     */
    @ConfField(mutable = true, masterOnly = true)
    public static int schedule_slot_num_per_ssd_path = 8;

    /**
     * the default batch size in tablet scheduler for a single schedule.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static int schedule_batch_size = 50;

    /**
     * tablet health check interval. Do not modify it in production environment.
     */
    @ConfField(mutable = false, masterOnly = true)
    public static long tablet_checker_interval_ms = 20 * 1000;

    /**
     * tablet scheduled interval. Do not modify it in production environment.
     */
    @ConfField(mutable = false, masterOnly = true)
    public static long tablet_schedule_interval_ms = 1000;

    /**
     * Deprecated after 0.10
     */
    @Deprecated
    @ConfField public static boolean use_new_tablet_scheduler = true;

    /**
     * the threshold of cluster balance score, if a backend's load score is 10% lower than average score,
     * this backend will be marked as LOW load, if load score is 10% higher than average score, HIGH load
     * will be marked.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static double balance_load_score_threshold = 0.1; // 10%

    // if disk usage > balance_load_score_threshold + urgent_disk_usage_extra_threshold
    // then this disk need schedule quickly
    // this value could less than 0.
    @ConfField(mutable = true, masterOnly = true)
    public static double urgent_balance_disk_usage_extra_threshold = 0.05;

    // when run urgent disk balance, shuffle the top large tablets
    // range: [ 0 ~ 100 ]
    @ConfField(mutable = true, masterOnly = true)
    public static int urgent_balance_shuffle_large_tablet_percentage = 1;

    @ConfField(mutable = true, masterOnly = true)
    public static double urgent_balance_pick_large_tablet_num_threshold = 1000;

    // range: 0 ~ 100
    @ConfField(mutable = true, masterOnly = true)
    public static int urgent_balance_pick_large_disk_usage_percentage = 80;

    // there's a case, all backend has a high disk, by default, it will not run urgent disk balance.
    // if set this value to true, urgent disk balance will always run,
    // the backends will exchange tablets among themselves.
    @ConfField(mutable = true, masterOnly = true)
    public static boolean enable_urgent_balance_no_low_backend = true;

    /**
     * if set to true, TabletScheduler will not do balance.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static boolean disable_balance = false;

    /**
     * when be rebalancer idle, then disk balance will occurs.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static int be_rebalancer_idle_seconds = 0;

    /**
     * if set to true, TabletScheduler will not do disk balance.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static boolean disable_disk_balance = false;

    // balance order
    // ATTN: a temporary config, may delete later.
    @ConfField(mutable = true, masterOnly = true)
    public static boolean balance_be_then_disk = true;

    /**
     * if set to false, TabletScheduler will not do disk balance for replica num = 1.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static boolean enable_disk_balance_for_single_replica = false;

    // if the number of scheduled tablets in TabletScheduler exceed max_scheduling_tablets
    // skip checking.
    @ConfField(mutable = true, masterOnly = true)
    public static int max_scheduling_tablets = 2000;

    // if the number of balancing tablets in TabletScheduler exceed max_balancing_tablets,
    // no more balance check
    @ConfField(mutable = true, masterOnly = true)
    public static int max_balancing_tablets = 100;

    // Rebalancer type(ignore case): BeLoad, Partition. If type parse failed, use BeLoad as default.
    @ConfField(masterOnly = true)
    public static String tablet_rebalancer_type = "BeLoad";

    // Valid only if use PartitionRebalancer. If this changed, cached moves will be cleared.
    @ConfField(mutable = true, masterOnly = true)
    public static long partition_rebalance_move_expire_after_access = 600; // 600s

    // Valid only if use PartitionRebalancer
    @ConfField(mutable = true, masterOnly = true)
    public static int partition_rebalance_max_moves_num_per_selection = 10;

    // 1 slot for reduce unnecessary balance task, provided a more accurate estimate of capacity
    @ConfField(masterOnly = true, mutable = true)
    public static int balance_slot_num_per_path = 1;

    // when execute admin set replica status = 'drop', the replica will marked as user drop.
    // will try to drop this replica within time not exceeds manual_drop_replica_valid_second
    @ConfField(masterOnly = true, mutable = true)
    public static long manual_drop_replica_valid_second = 24 * 3600L;

    // This threshold is to avoid piling up too many report task in FE, which may cause OOM exception.
    // In some large Doris cluster, eg: 100 Backends with ten million replicas, a tablet report may cost
    // several seconds after some modification of metadata(drop partition, etc..).
    // And one Backend will report tablets info every 1 min, so unlimited receiving reports is unacceptable.
    // TODO(cmy): we will optimize the processing speed of tablet report in future, but now, just discard
    // the report if queue size exceeding limit.
    // Some online time cost:
    // 1. disk report: 0-1 ms
    // 2. task report: 0-1 ms
    // 3. tablet report
    //      10000 replicas: 200ms
    @ConfField(mutable = true, masterOnly = true)
    public static int report_queue_size = 100;

    // if the number of report task in FE exceed max_report_task_num_per_rpc, then split it to multiple rpc
    @ConfField(mutable = true, masterOnly = true, description = {
            "������������ agent task ������������ RPC ��������������� be ������������������������������������ 10000 ������",
            "The maximum number of batched tasks per RPC assigned to each BE when resending agent tasks, "
            + "the default value is 10000."
    })
    public static int report_resend_batch_task_num_per_rpc = 10000;

    /**
     * If set to true, metric collector will be run as a daemon timer to collect metrics at fix interval
     */
    @ConfField public static boolean enable_metric_calculator = true;

    /**
     * the max routine load job num, including NEED_SCHEDULED, RUNNING, PAUSE
     */
    @ConfField(mutable = true, masterOnly = true)
    public static int max_routine_load_job_num = 100;

    /**
     * the max concurrent routine load task num of a single routine load job
     */
    @ConfField(mutable = true, masterOnly = true)
    public static int max_routine_load_task_concurrent_num = 256;

    /**
     * the max concurrent routine load task num per BE.
     * This is to limit the num of routine load tasks sending to a BE, and it should also less
     * than BE config 'max_routine_load_thread_pool_size'(default 1024),
     * which is the routine load task thread pool max size on BE.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static int max_routine_load_task_num_per_be = 1024;

    /**
     * routine load timeout is equal to maxBatchIntervalS * routine_load_task_timeout_multiplier.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static int routine_load_task_timeout_multiplier = 10;

    /**
     * routine load task min timeout second.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static int routine_load_task_min_timeout_sec = 60;

    /**
     * streaming task load timeout is equal to maxIntervalS * streaming_task_timeout_multiplier.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static int streaming_task_timeout_multiplier = 10;

    @ConfField(mutable = true, masterOnly = true)
    public static int streaming_cdc_light_rpc_timeout_sec = 90;

    @ConfField(mutable = true, masterOnly = true)
    public static int streaming_cdc_heavy_rpc_timeout_sec = 600;

    /**
     * the max timeout of get kafka meta.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static int max_get_kafka_meta_timeout_second = 60;


    /**
     * the expire time of routine load blacklist.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static int routine_load_blacklist_expire_time_second = 300;

    /**
     * Minimum batch interval for adaptive routine load tasks when not at EOF.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static int routine_load_adaptive_min_batch_interval_sec = 360;

    /**
     * The max number of files store in SmallFileMgr
     */
    @ConfField(mutable = true, masterOnly = true)
    public static int max_small_file_number = 100;

    /**
     * The max size of a single file store in SmallFileMgr
     */
    @ConfField(mutable = true, masterOnly = true)
    public static int max_small_file_size_bytes = 1024 * 1024; // 1MB

    /**
     * Save small files
     */
    @ConfField
    public static String small_file_dir =  EnvUtils.getDorisHome() + "/small_files";

    /**
     * This will limit the max recursion depth of hash distribution pruner.
     * eg: where a in (5 elements) and b in (4 elements) and c in (3 elements) and d in (2 elements).
     * a/b/c/d are distribution columns, so the recursion depth will be 5 * 4 * 3 * 2 = 120, larger than 100,
     * So that distribution pruner will no work and just return all buckets.
     *
     * Increase the depth can support distribution pruning for more elements, but may cost more CPU.
     */
    @ConfField(mutable = true, masterOnly = false)
    public static int max_distribution_pruner_recursion_depth = 100;

    /**
     * If the jvm memory used percent(heap or old mem pool) exceed this threshold, checkpoint thread will
     * not work to avoid OOM.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static long metadata_checkpoint_memory_threshold = 70;

    /**
     * If set to true, the checkpoint thread will make the checkpoint regardless of the jvm memory used percent.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static boolean force_do_metadata_checkpoint = false;

    /**
     * If some joural is wrong, and FE can't start, we can use this to skip it.
     */
    @ConfField(mutable = false, masterOnly = false)
    public static String[] force_skip_journal_ids = {};

    @ConfField(description = {"��������� editlog ������������������������������������������ FE ��������������������������������������������� editlog ������������������������"
            + "������������������������������ replay ������������������������������������",
        "When replaying editlog encounters exceptions with specific operation types that prevent FE from starting, "
            + "you can configure the editlog operation type enum values to be ignored, "
            + "thereby skipping these exceptions and allowing the replay thread to continue replaying other logs"})
    public static short[] skip_operation_types_on_replay_exception =  {-1, -1};

    /**
     * Decide how often to check dynamic partition
     */
    @ConfField(mutable = true, masterOnly = true)
    public static long dynamic_partition_check_interval_seconds = 600;

    /**
     * When scheduling dynamic partition tables,
     * the execution interval of each table to prevent excessive consumption of FE CPU at the same time
     * default is 0
     */
    @ConfField(mutable = true, masterOnly = true)
    public static long dynamic_partition_step_interval_ms = 0;

    /**
     * If set to true, dynamic partition feature will open
     */
    @ConfField(mutable = true, masterOnly = true)
    public static boolean dynamic_partition_enable = true;

    /**
     * control rollup job concurrent limit
     */
    @ConfField(mutable = true, masterOnly = true)
    public static int max_running_rollup_job_num_per_table = 1;

    /**
     * If set to true, Doris will check if the compiled and running versions of Java are compatible
     */
    @ConfField
    public static boolean check_java_version = true;

    /**
     * a period for auto resume routine load
     */
    @ConfField(mutable = true, masterOnly = true)
    public static int period_of_auto_resume_min = 10;

    /**
     * If set to true, the backend will be automatically dropped after finishing decommission.
     * If set to false, the backend will not be dropped and remaining in DECOMMISSION state.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static boolean drop_backend_after_decommission = true;

    /**
     * When tablet size of decommissioned backend is lower than this threshold,
     * SystemHandler will start to check if all tablets of this backend are in recycled status,
     * this backend will be dropped immediately if the check result is true.
     * For performance based considerations, better not set a very high value for this.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static int decommission_tablet_check_threshold = 50000;

    /**
     * When decommission a backend, need to migrate all its tablets to other backends.
     * But there maybe some leaky tablets due to forgetting to delete them from TabletInvertIndex.
     * They are not in use. Decommission can skip migrating them.
     * For safety, decommission wait for a period after founding leaky tablets.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static int decommission_skip_leaky_tablet_second = 3600 * 5;

    /**
     * Decommission a tablet need to wait all the previous txns finished.
     * If wait timeout, decommission will fail.
     * Need to increase this wait time if the txn take a long time.
     *
     */
    @ConfField(mutable = true, masterOnly = true)
    public static int decommission_tablet_wait_time_seconds = 3600;

    /**
     * Define thrift server's server model, default is TThreadPoolServer model
     */
    @ConfField
    public static String thrift_server_type = "THREAD_POOL";

    /**
     * This config will decide whether to resend agent task when create_time for agent_task is set,
     * only when current_time - create_time > agent_task_resend_wait_time_ms can ReportHandler do resend agent task
     */
    @ConfField (mutable = true, masterOnly = true)
    public static long agent_task_resend_wait_time_ms = 5000;

    /**
     * min_clone_task_timeout_sec and max_clone_task_timeout_sec is to limit the
     * min and max timeout of a clone task.
     * Under normal circumstances, the timeout of a clone task is estimated by
     * the amount of data and the minimum transmission speed(5MB/s).
     * But in special cases, you may need to manually set these two configs
     * to ensure that the clone task will not fail due to timeout.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static long min_clone_task_timeout_sec = 3 * 60; // 3min
    @ConfField(mutable = true, masterOnly = true)
    public static long max_clone_task_timeout_sec = 2 * 60 * 60; // 2h

    /**
     * If set to true, fe will enable sql result cache
     * This option is suitable for offline data update scenarios
     *                              case1   case2   case3   case4
     * enable_sql_cache             false   true    true    false
     * enable_partition_cache       false   false   true    true
     */
    @ConfField(mutable = true, masterOnly = false)
    public static boolean cache_enable_sql_mode = true;

    /**
     *  Minimum interval between last version when caching results,
     *  This parameter distinguishes between offline and real-time updates
     */
    @ConfField(mutable = true, masterOnly = false)
    public static int cache_last_version_interval_second = 30;

    /**
     *  Expire sql sql in frontend time
     */
    @ConfField(
            mutable = true,
            masterOnly = false,
            callbackClassString = "org.apache.doris.common.cache.NereidsSqlCacheManager$UpdateConfig",
            description = {
                    "��������������������� 300��������������������� NereidsSqlCacheManager ��� sql cache ������������������������������������������ cache ������������",
                    "The current default setting is 300, which is used to control the expiration time of SQL cache"
                            + "in NereidsSqlCacheManager. If the cache is not accessed for a period of time, "
                            + "it will be reclaimed"
            }
    )
    public static int expire_sql_cache_in_fe_second = 300;

    /**
     *  Expire hbo plan stats. cache in frontend time.
     */
    @ConfField(
            mutable = true,
            masterOnly = false,
            callbackClassString = "org.apache.doris.nereids.stats.MemoryHboPlanStatisticsProvider$UpdateConfig",
            description = {
                    "��������������������� 86400��������������������� MemoryHboPlanStatisticsProvider ��� stats. cache ������������������������������������������",
                    "The default setting is 86400, which is used to control the expiration time of plan stats. cache"
                            + "in MemoryHboPlanStatisticsProvider. If the cache is not accessed for a period of time, "
                            + "it will be reclaimed."
            }
    )
    public static int expire_hbo_plan_stats_cache_in_fe_second = 86400;

    /**
     *  Expire hbo plan info cache in frontend time.
     */
    @ConfField(
            mutable = true,
            masterOnly = false,
            callbackClassString = "org.apache.doris.nereids.stats.HboPlanInfoProvider$UpdateConfig",
            description = {
                    "��������������������� 1000��������������������� HboPlanInfoProvider ��� plan info cache ������������������������������������������ cache ������������",
                    "The default setting is 100, which is used to control the expiration time of hbo plan info cache"
                            + "in HboPlanInfoProvider. If the cache is not accessed for a period of time, "
                            + "it will be reclaimed."
            }
    )
    public static int expire_hbo_plan_info_cache_in_fe_second = 1000;

    /**
     *  Expire sql sql in frontend time
     */
    @ConfField(
            mutable = true,
            masterOnly = false,
            callbackClassString = "org.apache.doris.common.cache.NereidsSortedPartitionsCacheManager$UpdateConfig",
            description = {
                "��������������������� 300��������������������� NereidsSortedPartitionsCacheManager ���������������������������������������"
                    + "��������������������������� cache ������������",
                "The current default setting is 300, which is used to control the expiration time of "
                    + "the partition metadata cache in NereidsSortedPartitionsCheManager. "
                    + "If the cache is not accessed for a period of time, it will be reclaimed"
            }
    )
    public static int expire_cache_partition_meta_table_in_fe_second = 300;

    /**
     * Set the maximum number of rows that can be cached
     */
    @ConfField(mutable = true, masterOnly = false, description = {"SQL/Partition Cache ������������������������������",
        "Maximum number of rows that can be cached in SQL/Partition Cache, is 3000 by default."})
    public static int cache_result_max_row_count = 3000;

    /**
     * Set the maximum data size that can be cached
     */
    @ConfField(mutable = true, masterOnly = false, description = {"SQL/Partition Cache ������������������������������������",
        "Maximum data size of rows that can be cached in SQL/Partition Cache, is 3000 by default."})
    public static int cache_result_max_data_size = 31457280; // 30M

    /**
     * Used to limit element num of InPredicate in delete statement.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static int max_allowed_in_element_num_of_delete = 1024;

    /**
     * In some cases, some tablets may have all replicas damaged or lost.
     * At this time, the data has been lost, and the damaged tablets
     * will cause the entire query to fail, and the remaining healthy tablets cannot be queried.
     * In this case, you can set this configuration to true.
     * The system will replace damaged tablets with empty tablets to ensure that the query
     * can be executed. (but at this time the data has been lost, so the query results may be inaccurate)
     */
    @ConfField(mutable = true, masterOnly = true)
    public static boolean recover_with_empty_tablet = false;

    /**
     * Whether to add a version column when create unique table
     */
    @ConfField(mutable = true, masterOnly = true)
    public static boolean enable_hidden_version_column_by_default = true;

    /**
     * Whether to add a skip bitmap column when create merge-on-write unique table
     */
    @ConfField(mutable = true, masterOnly = true)
    public static boolean enable_skip_bitmap_column_by_default = false;

    /**
     * Used to set default db data quota bytes.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static long default_db_data_quota_bytes = Long.MAX_VALUE; // 8192 PB

    /**
     * Used to set default db replica quota num.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static long default_db_replica_quota_size = 1024 * 1024 * 1024;

    /*
     * Maximum percentage of data that can be filtered (due to reasons such as data is irregularly)
     * The default value is 0.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static double default_max_filter_ratio = 0;

    /**
     * HTTP Server V2 is implemented by SpringBoot.
     * It uses an architecture that separates front and back ends.
     * Only enable httpv2 can user to use the new Frontend UI interface
     */
    @ConfField
    public static boolean enable_http_server_v2 = true;

    /*
     * Base path is the URL prefix for all API paths.
     * Some deployment environments need to configure additional base path to match resources.
     * This Api will return the path configured in Config.http_api_extra_base_path.
     * Default is empty, which means not set.
     */
    @ConfField
    public static String http_api_extra_base_path = "";

    /**
     * If set to true, FE will be started in BDBJE debug mode
     */
    @ConfField
    public static boolean enable_bdbje_debug_mode = false;

    @ConfField(mutable = false, masterOnly = true, description = {"������������ debug point ���������������������",
            "is enable debug points, use in test."})
    public static boolean enable_debug_points = false;

    /**
     * This config is used to try skip broker when access bos or other cloud storage via broker
     */
    @ConfField(mutable = true, masterOnly = true)
    public static boolean enable_access_file_without_broker = false;

    /**
     * Whether to allow the outfile function to export the results to the local disk.
     * If set to true, there's risk to run out of FE disk capacity.
     */
    @ConfField
    public static boolean enable_outfile_to_local = false;

    /**
     * Used to set the initial flow window size of the GRPC client channel, and also used to max message size.
     * When the result set is large, you may need to increase this value.
     */
    @ConfField
    public static int grpc_max_message_size_bytes = 2147483647; // 2GB

    /**
     * num of thread to handle grpc events in grpc_threadmgr
     */
    @ConfField
    public static int grpc_threadmgr_threads_nums = 4096;

    /**
     * sets the time without read activity before sending a keepalive ping
     * the smaller the value, the sooner the channel is unavailable, but it will increase network io
     */
    @ConfField(description = { "������ grpc ������������ keepalive ping ������������������������������������",
            "The time without grpc read activity before sending a keepalive ping" })
    public static int grpc_keep_alive_second = 10;

    /**
     * Used to set minimal number of replication per tablet.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static short min_replication_num_per_tablet = 1;

    /**
     * Used to set maximal number of replication per tablet.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static short max_replication_num_per_tablet = Short.MAX_VALUE;

    /**
     * Used to limit the maximum number of partitions that can be created when creating a dynamic partition table,
     * to avoid creating too many partitions at one time.
     * The number is determined by "start" and "end" in the dynamic partition parameters.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static int max_dynamic_partition_num = 20000;

    /**
     * Used to limit the maximum number of partitions that can be created when creating multi partition,
     * to avoid creating too many partitions at one time.
     * The number is determined by "start" and "end" in the multi partition parameters.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static int max_multi_partition_num = 4096;

    /**
     * Use this parameter to set the partition name prefix for multi partition,
     * Only multi partition takes effect, not dynamic partitions.
     * The default prefix is "p_".
     */
    @ConfField(mutable = true, masterOnly = true)
    public static String multi_partition_name_prefix = "p_";

    /**
     * Control the max num of backup/restore job per db
     */
    @ConfField(mutable = true, masterOnly = true)
    public static int max_backup_restore_job_num_per_db = 10;

    /**
     * A internal config, to reduce the restore job size during serialization by compress.
     *
     * WARNING: Once this option is enabled and a restore is performed, the FE version cannot be rolled back.
     */
    @ConfField(mutable = false)
    public static boolean restore_job_compressed_serialization = false;

    /**
     * A internal config, to reduce the backup job size during serialization by compress.
     *
     * WARNING: Once this option is enabled and a backup is performed, the FE version cannot be rolled back.
     */
    @ConfField(mutable = false)
    public static boolean backup_job_compressed_serialization = false;

    /**
     * A internal config, to indicate whether to enable the restore snapshot rpc compression.
     *
     * The ccr syncer will depends this config to decide whether to compress the meta and job
     * info of the restore snapshot request.
     */
    @ConfField(mutable = false)
    public static boolean enable_restore_snapshot_rpc_compression = true;

    /**
     * A internal config, to indicate whether to reset the index id when restore olap table.
     *
     * The inverted index saves the index id in the file path/header, so the index id between
     * two clusters must be the same.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static boolean restore_reset_index_id = false;

    /**
     * Control the max num of tablets per backup job involved.
     */
    @ConfField(mutable = true, masterOnly = true, description = {
        "������������������ backup job ��������������� tablet ������������������ OOM",
        "Control the max num of tablets per backup job involved, to avoid OOM"
    })
    public static int max_backup_tablets_per_job = 300000;

    /**
     * whether to ignore table that not support type when backup, and not report exception.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static boolean ignore_backup_not_support_table_type = false;

    /**
     * whether to ignore temp partitions when backup, and not report exception.
     */
    @ConfField(mutable = true, masterOnly = true, description = {
        "���������������������������������������������",
        "Whether to ignore temp partitions when backup, and not report exception."
    })
    public static boolean ignore_backup_tmp_partitions = false;

    /**
     * A internal config, to control the update interval of backup handler. Only used to speed up tests.
     */
    @ConfField(mutable = false)
    public static long backup_handler_update_interval_millis = 3000;


    /**
     * Whether to enable cloud restore job.
     */
    @ConfField(mutable = true, masterOnly = true, description = {"���������������������������������������",
        "Whether to enable cloud restore job."}, varType = VariableAnnotation.EXPERIMENTAL)
    public static boolean enable_cloud_restore_job = false;

    @ConfField(mutable = true, masterOnly = true, description = {
        "������������������������������������ create tablets rpc ��������� tablet ��������������������������� 256 ���",
        "During the cloud restore job, the maximum number of tablets created by one "
            + "create tablets RPC, 256 by default."})
    public static int cloud_restore_create_tablet_batch_size = 256;

    /**
     * Control the default max num of the instance for a user.
     */
    @ConfField(mutable = true)
    public static int default_max_query_instances = -1;

    /*
     * One master daemon thread will update global partition info, include in memory and visible version
     * info every partition_info_update_interval_secs
     */
    @ConfField(mutable = false, masterOnly = true)
    public static int partition_info_update_interval_secs = 60;

    @Deprecated
    @ConfField(masterOnly = true)
    public static boolean enable_concurrent_update = false;

    /**
     * This configuration can only be configured during cluster initialization and cannot be modified during cluster
     * restart and upgrade after initialization is complete.
     *
     * 0: table names are stored as specified and comparisons are case sensitive.
     * 1: table names are stored in lowercase and comparisons are not case sensitive.
     * 2: table names are stored as given but compared in lowercase.
     */
    @ConfField(masterOnly = true)
    public static int lower_case_table_names = 0;

    /**
     * Used to limit the length of table name.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static int table_name_length_limit = 64;

    @ConfField(mutable = true, description = {
            "���������������������������������������������������������������������������������������",
            "Used to limit the length of column comment; "
                    + "If the existing column comment is too long, it will be truncated when displayed."})
    public static int column_comment_length_limit = -1;

    @ConfField(mutable = true, description = {
            "���������������������������������������������������LZ4, LZ4F, LZ4HC, ZLIB, ZSTD, SNAPPY, NONE���",
            "Default compression type for internal tables. Supported values: LZ4, LZ4F, LZ4HC, ZLIB, ZSTD,"
            + " SNAPPY, NONE."})
    public static String default_compression_type = "ZSTD";

    /*
     * The job scheduling interval of the schema change handler.
     * The user should not set this parameter.
     * This parameter is currently only used in the regression test environment to appropriately
     * reduce the running speed of the schema change job to test the correctness of the system
     * in the case of multiple tasks in parallel.
     */
    @ConfField(mutable = false, masterOnly = true)
    public static int default_schema_change_scheduler_interval_millisecond = 500;

    /*
     * If set to true, the thrift structure of query plan will be sent to BE in compact mode.
     * This will significantly reduce the size of rpc data, which can reduce the chance of rpc timeout.
     * But this may slightly decrease the concurrency of queries, because compress and decompress cost more CPU.
     */
    @ConfField(mutable = true, masterOnly = false)
    public static boolean use_compact_thrift_rpc = true;

    /*
     * If set to true, the tablet scheduler will not work, so that all tablet repair/balance task will not work.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static boolean disable_tablet_scheduler = false;

    /*
     * When doing clone or repair tablet task, there may be replica is REDUNDANT state, which
     * should be dropped later. But there are be loading task on these replicas, so the default strategy
     * is to wait until the loading task finished before dropping them.
     * But the default strategy may takes very long time to handle these redundant replicas.
     * So we can set this config to true to not wait any loading task.
     * Set this config to true may cause loading task failed, but will
     * speed up the process of tablet balance and repair.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static boolean enable_force_drop_redundant_replica = false;

    /*
     * auto set the slowest compaction replica's status to bad
     */
    @ConfField(mutable = true, masterOnly = true)
    public static boolean repair_slow_replica = false;

    /*
     * The relocation of a colocation group may involve a large number of tablets moving within the cluster.
     * Therefore, we should use a more conservative strategy to avoid relocation
     * of colocation groups as much as possible.
     * Reloaction usually occurs after a BE node goes offline or goes down.
     * This parameter is used to delay the determination of BE node unavailability.
     * The default is 30 minutes, i.e., if a BE node recovers within 30 minutes, relocation of the colocation group
     * will not be triggered.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static long colocate_group_relocate_delay_second = 1800; // 30 min

    /*
     * If set to true, when creating table, Doris will allow to locate replicas of a tablet
     * on same host.
     * This is only for local test, so that we can deploy multi BE on same host and create table
     * with multi replicas.
     * DO NOT use it for production env.
     */
    @ConfField
    public static boolean allow_replica_on_same_host = false;

    /**
     *  The version count threshold used to judge whether replica compaction is too slow
     */
    @ConfField(mutable = true)
    public static int min_version_count_indicate_replica_compaction_too_slow = 200;

    /**
     * The valid ratio threshold of the difference between the version count of the slowest replica and the fastest
     * replica. If repair_slow_replica is set to true, it is used to determine whether to repair the slowest replica
     */
    @ConfField(mutable = true, masterOnly = true)
    public static double valid_version_count_delta_ratio_between_replicas = 0.5;

    /**
     * The data size threshold used to judge whether replica is too large
     */
    @ConfField(mutable = true, masterOnly = true)
    public static long min_bytes_indicate_replica_too_large = 2 * 1024 * 1024 * 1024L;

    // statistics
    /*
     * the max unfinished statistics job number
     */
    @Deprecated
    @ConfField(mutable = true, masterOnly = true)
    public static int cbo_max_statistics_job_num = 20;
    /*
     * the max timeout of a statistics task
     */
    @Deprecated
    @ConfField(mutable = true, masterOnly = true)
    public static int max_cbo_statistics_task_timeout_sec = 300;
    /*
     * the concurrency of statistics task
     */
    @Deprecated
    @ConfField(mutable = false, masterOnly = true)
    public static int cbo_concurrency_statistics_task_num = 10;
    /*
     * default sample percentage
     * The value from 0 ~ 100. The 100 means no sampling and fetch all data.
     */
    @Deprecated
    @ConfField(mutable = true, masterOnly = true)
    public static int cbo_default_sample_percentage = 10;

    /*
     * the system automatically checks the time interval for statistics
     */
    @ConfField(mutable = true, masterOnly = true, description = {
            "������������������������������������������������������������������������������������������������������",
            "This parameter controls the time interval for automatic collection jobs to check the health of table"
                    + "statistics and trigger automatic collection"
    })
    public static int auto_check_statistics_in_minutes = 1;

    /**
     * If set to TRUE, the compaction slower replica will be skipped when select get queryable replicas
     * Default is true.
     */
    @ConfField(mutable = true)
    public static boolean skip_compaction_slower_replica = true;

    /**
     * Enable quantile_state type column
     * Default is false.
     * */
    @ConfField(mutable = true, masterOnly = true)
    public static boolean enable_quantile_state_type = true;

    /*---------------------- JOB CONFIG START------------------------*/
    /**
     * The number of threads used to dispatch timer job.
     * If we have a lot of timer jobs, we need more threads to dispatch them.
     * All timer job will be dispatched to a thread pool, and they will be dispatched to the thread queue of the
     * corresponding type of job
     * The value should be greater than 0, if it is 0 or <=0, set it to 5
     */
    @ConfField(masterOnly = true, description = {"������������������������������������",
            "The number of threads used to dispatch timer job."})
    public static int job_dispatch_timer_job_thread_num = 2;

    /**
     * The number of timer jobs that can be queued.
     * if consumer is slow, the queue will be full, and the producer will be blocked.
     * if you have a lot of timer jobs, you need to increase this value or increase the number of
     * {@code @dispatch_timer_job_thread_num}
     * The value should be greater than 0, if it is 0 or <=0, set it to 1024
     */
    @ConfField(masterOnly = true, description = {"������������������������������������������������������", "The number of timer jobs that can be queued."})
    public static int job_dispatch_timer_job_queue_size = 1024;
    @ConfField(masterOnly = true, description = {"������ Job ��� task ��������������������������������������������������������������� task ������������������ < 1, ���������������������",
            "Maximum number of persistence allowed per task in a job,exceeding which old tasks will be discarded,"
                   + "If the value is less than 1, it will not be persisted." })
    public static int max_persistence_task_count = 100;

    @ConfField(masterOnly = true, description = { "MTMV task ������������������������������������������������������ 1024��������������� 2 ���������������������������������������������"
                    + " 2 ���������������",
            "The size of the MTMV task's waiting queue If the size is negative, 1024 will be used. If "
            + "the size is not a power of two, the nearest power of the size will be"
            + " automatically selected."})
    public static int mtmv_task_queue_size = 1024;
    @ConfField(masterOnly = true, description = {"Insert task ������������������������������������������������������ 1024��������������� 2 ������������������������������������������"
            + " ��� 2 ���������������", "The size of the Insert task's waiting queue If the size is negative, 1024 will be used."
            + " If the size is not a power of two, the nearest power of the size will "
            + "be automatically selected."})
    public static int insert_task_queue_size = 1024;
    @ConfField(masterOnly = true, description = { "������������ task ������������������������������������������������������ 1024��������������� 2 ������������������������������������������"
            + " ��� 2 ���������������",
            "The size of the Dictionary loading task's waiting queue If the size is negative, 1024 will be used."
            + " If the size is not a power of two, the nearest power of the size will "
            + "be automatically selected." })
    public static int dictionary_task_queue_size = 1024;

    @ConfField(masterOnly = true, description = {"finished ��������� job ������������������������������������������������������������������������",
            "The longest time to save the job in finished status, it will be deleted after this time. Unit: hour"})
    public static int finished_job_cleanup_threshold_time_hour = 24;

    @ConfField(masterOnly = true, description = {"������������ Insert ������������������������������������ 0������������������ 10",
            "The number of threads used to consume Insert tasks, "
                    + "the value should be greater than 0, if it is <=0, default is 10."})
    public static int job_insert_task_consumer_thread_num = 10;

    @ConfField(masterOnly = true, description = {"������������ MTMV ������������������������������������ 0������������������ 10",
            "The number of threads used to consume MTMV tasks, "
                    + "the value should be greater than 0, if it is <=0, default is 10."})
    public static int job_mtmv_task_consumer_thread_num = 10;

    @ConfField(masterOnly = true, description = { "��������������������������������������������������������������������� 0������������������ 3",
            "The number of threads used to perform the dictionary import and delete tasks, which should be"
                    + " greater than 0, otherwise it defaults to 3." })
    public static int job_dictionary_task_consumer_thread_num = 3;

    @ConfField(masterOnly = true, description = {"������������ Streaming ������������������������������������ 0������������������ 100",
            "The number of threads used to execute Streaming Tasks, "
                    + "the value should be greater than 0, if it is <=0, default is 100."})
    public static int job_streaming_task_exec_thread_num = 100;

    @ConfField(masterOnly = true, description = {"��������� Streaming ������������������������������ 0������������������ 1024",
            "The maximum number of Streaming jobs, "
                    + "the value should be greater than 0, if it is <=0, default is 1024."})
    public static int max_streaming_job_num = 1024;

    @ConfField(masterOnly = true, description = {"������ Streaming Job ��������������������������� task ���������������������������������������",
            "The maximum number of tasks a Streaming Job can keep in memory. If the number exceeds the limit, "
                    + "old records will be discarded."})
    public static int max_streaming_task_show_count = 100;

    @ConfField(masterOnly = true, mutable = true, description = {
            "Max auto resume retry count for streaming jobs. "
                    + "After exceeding, the failure reason is rewritten to CANNOT_RESUME_ERR "
                    + "and the job requires manual intervention."})
    public static int streaming_job_max_auto_resume_count = 10;

    /* job test config */
    /**
     * If set to true, we will allow the interval unit to be set to second, when creating a recurring job.
     */
    @ConfField
    public static boolean enable_job_schedule_second_for_test = false;

    /*---------------------- JOB CONFIG END------------------------*/
    /**
     * The number of async tasks that can be queued. @See TaskDisruptor
     * if consumer is slow, the queue will be full, and the producer will be blocked.
     */
    @ConfField
    public static int async_task_queen_size = 1024;

    /**
     * The number of threads used to consume async tasks. @See TaskDisruptor
     * if we have a lot of async tasks, we need more threads to consume them. Sure, it's depends on the cpu cores.
     */
    @ConfField
    public static int async_task_consumer_thread_num = 64;

    /**
     * When job is finished, it will be saved in job manager for a while.
     * This configuration is used to control the max saved time.
     * Default is 3 days.
     */
    @Deprecated
    @ConfField
    public static int finish_job_max_saved_second = 60 * 60 * 24 * 3;

    // enable_workload_group should be immutable and temporarily set to mutable during the development test phase
    @ConfField(mutable = true, varType = VariableAnnotation.EXPERIMENTAL)
    public static boolean enable_workload_group = true;

    @ConfField(mutable = true)
    public static boolean enable_query_queue = true;

    @ConfField(mutable = true)
    public static long query_queue_update_interval_ms = 5000;

    @ConfField(mutable = true, description = {
            "��� BE ������������������������������������������������������������������������ -1��������������������������������������� 0~1 ���������",
            "When be memory usage bigger than this value, query could queue, "
                    + "default value is -1, means this value not work. Decimal value range from 0 to 1"})
    public static double query_queue_by_be_used_memory = -1;

    @ConfField(mutable = true, description = {"������������������������ FE ������������ BE ���������������������������",
            "In the scenario of memory backpressure, "
                    + "the time interval for obtaining BE memory usage at regular intervals"})
    public static long get_be_resource_usage_interval_ms = 10000;

    @ConfField(mutable = false, masterOnly = true)
    public static int backend_rpc_timeout_ms = 60000; // 1 min

    /**
     * If set to TRUE, FE will:
     * 1. divide BE into high load and low load(no mid load) to force triggering tablet scheduling;
     * 2. ignore whether the cluster can be more balanced during tablet scheduling;
     *
     * It's used to test the reliability in single replica case when tablet scheduling are frequent.
     * Default is false.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static boolean be_rebalancer_fuzzy_test = false;

    /**
     * If set to TRUE, FE will convert date/datetime to datev2/datetimev2(0) automatically.
     */
    @ConfField(mutable = true)
    public static boolean enable_date_conversion = true;

    @ConfField(mutable = false, masterOnly = true)
    public static boolean enable_multi_tags = true;

    /**
     * If set to TRUE, FE will convert DecimalV2 to DecimalV3 automatically.
     */
    @ConfField(mutable = true)
    public static boolean enable_decimal_conversion = true;

    /**
     * Support complex data type ARRAY.
     */
    @Deprecated
    @ConfField(mutable = true, masterOnly = true)
    public static boolean enable_array_type = false;

    /**
     * The timeout of executing async remote fragment.
     * In normal case, the async remote fragment will be executed in a short time. If system are under high load
     * condition���try to set this timeout longer.
     */
    @ConfField(mutable = true)
    public static long remote_fragment_exec_timeout_ms = 30000; // 30 sec

    /**
     * Max data version of backends serialize block.
     */
    @ConfField(mutable = false)
    public static int max_be_exec_version = 10;

    /**
     * Min data version of backends serialize block.
     */
    @ConfField(mutable = false)
    public static int min_be_exec_version = 8;

    /**
     * Data version of backends serialize block.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static int be_exec_version = max_be_exec_version;

    /**
     * If set to true, query on external table will prefer to assign to compute node.
     * And the max number of compute node is controlled by min_backend_num_for_external_table.
     * If set to false, query on external table will assign to any node.
     */
    @ConfField(mutable = true, description = {"��������������� true������������������������������������������������������",
            "������������������������������������ min_backend_num_for_external_table ���������",
            "��������������� false������������������������������������������������"
                    + "������������������������������������������������������������",
            "If set to true, query on external table will prefer to assign to compute node. "
                    + "And the max number of compute node is controlled by min_backend_num_for_external_table. "
                    + "If set to false, query on external table will assign to any node. "
                    + "If there is no compute node in cluster, this config takes no effect."})
    public static boolean prefer_compute_node_for_external_table = false;

    @ConfField(mutable = true, description = {"��������� prefer_compute_node_for_external_table ��� true ������������"
            + "������������������������������������������������������������������������������������������������������������������������������������������"
            + "���������������������������������������������������������������������������������������-1 ������������������������������������������",
            "Only take effect when prefer_compute_node_for_external_table is true. "
                    + "If the compute node number is less than this value, "
                    + "query on external table will try to get some mix de to assign, "
                    + "to let the total number of node reach this value. "
                    + "If the compute node number is larger than this value, "
                    + "query on external table will assign to compute de only. "
                    + "-1 means only use current compute node."})
    public static int min_backend_num_for_external_table = -1;

    /**
     * Max query profile num.
     */
    @ConfField(mutable = true, masterOnly = false)
    public static int max_query_profile_num = 500;

    /**
     * Set to true to disable backend black list, so that even if we failed to send task to a backend,
     * that backend won't be added to black list.
     * This should only be set when running tests, such as regression test.
     * Highly recommended NOT disable it in product environment.
     */
    @ConfField(mutable = true, masterOnly = false)
    public static boolean disable_backend_black_list = false;

    @ConfField(mutable = true, masterOnly = false, description = {
        "If a backend is tried to be added to black list do_add_backend_black_list_threshold_count times "
            + "in do_add_backend_black_list_threshold_seconds, it will be added to black list."})
    public static long do_add_backend_black_list_threshold_count = 10;

    @ConfField(mutable = true, masterOnly = false, description = {
        "If a backend is tried to be added to black list do_add_backend_black_list_threshold_count times "
            + "in do_add_backend_black_list_threshold_seconds, it will be added to black list."})
    public static long do_add_backend_black_list_threshold_seconds = 30;

    @ConfField(mutable = true, masterOnly = false, description = {
        "Backend will stay in black list for this time after it is added to black list."})
    public static long stay_in_backend_black_list_threshold_seconds = 60;

    /**
     * Maximum backend heartbeat failure tolerance count.
     * Default is 1, which means if 1 heart failed, the backend will be marked as dead.
     * A larger value can improve the tolerance of the cluster to occasional heartbeat failures.
     * For example, when running regression tests, this value can be increased.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static long max_backend_heartbeat_failure_tolerance_count = 1;

    /**
     * Even if a backend is healthy, still write a heartbeat editlog to update backend's lastUpdateMs of bdb image.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static int editlog_healthy_heartbeat_seconds = 300;

    /**
     * Abort transaction time after lost heartbeat.
     * The default value is 300s, which means transactions of be will be aborted after lost heartbeat 300s.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static int abort_txn_after_lost_heartbeat_time_second = 300;

    /**
     * Heartbeat interval in seconds.
     * Default is 10, which means every 10 seconds, the master will send a heartbeat to all backends.
     */
    @ConfField(mutable = false, masterOnly = false)
    public static int heartbeat_interval_second = 10;

    /**
     * After a backend is marked as unavailable, it will be added to blacklist.
     * Default is 120.
     */
    @ConfField(mutable = true, masterOnly = false)
    public static int blacklist_duration_second = 120;

    /**
     * The default connection timeout for hive metastore.
     * hive.metastore.client.socket.timeout
     */
    @ConfField(mutable = false, masterOnly = false)
    public static long hive_metastore_client_timeout_second = 10;

    /**
     * Used to determined how many statistics collection SQL could run simultaneously.
     */
    @ConfField
    public static int statistics_simultaneously_running_task_num = 3;

    /**
     * if table has too many replicas, Fe occur oom when schema change.
     * 10W replicas is a reasonable value for testing.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static long max_replica_count_when_schema_change = 100000;

    /**
     * Max cache num of hive partition.
     * Decrease this value if FE's memory is small
     */
    @ConfField(description = {"Hive Metastore ���������������������������������������",
            "Max cache number of partition at table level in Hive Metastore."})
    public static long max_hive_partition_cache_num = 10000;

    @ConfField(description = {"Hudi/Iceberg/Paimon ���������������������������������",
            "Max cache number of hudi/iceberg table."})
    public static long max_external_table_cache_num = 1000;

    @ConfField(description = {"External Catalog ������Database ��� Table ���������������������������������",
            "Max cache number of database and table instance in external catalog."})
    public static long max_meta_object_cache_num = 1000;

    @ConfField(description = {"Hive ������������������������������",
            "Max cache number of hive partition table"})
    public static long max_hive_partition_table_cache_num = 1000;

    @ConfField(mutable = false, masterOnly = false, description = {"������ Hive ���������������������������������������-1 ���������������������",
            "Max number of hive partition values to return while list partitions, -1 means no limitation."})
    public static short max_hive_list_partition_num = -1;

    @ConfField(mutable = false, masterOnly = false, description = {"���������������������������������������",
            "Max cache number of remote file system."})
    public static long max_remote_file_system_cache_num = 100;

    @ConfField(mutable = false, masterOnly = false, description = {"������������������������������",
        "Max cache number of external table row count"})
    public static long max_external_table_row_count_cache_num = 100000;

    @ConfField(description = {"������������������������������������������������������������������",
            "Max cache file number of external table split file meta cache at query level."})
    public static long max_external_table_split_file_meta_cache_num = 100000;

    /**
     * Max cache loader thread-pool size.
     * Max thread pool size for loading external meta cache
     */
    @ConfField(mutable = false, masterOnly = false)
    public static int max_external_cache_loader_thread_pool_size = 64;

    /**
     * Max cache num of external catalog's file
     * Decrease this value if FE's memory is small
     */
    @ConfField(mutable = false, masterOnly = false)
    public static long max_external_file_cache_num = 10000;

    /**
     * Max cache num of external table's schema
     * Decrease this value if FE's memory is small
     */
    @ConfField(mutable = false, masterOnly = false)
    public static long max_external_schema_cache_num = 10000;

    @ConfField(description = {
            "������������������������������������������������������������������",
            "The expiration time of a cache object after last access of it. For external meta cache."
    })
    public static long external_cache_expire_time_seconds_after_access = 86400L; // 24 hours

    @ConfField(description = {
            "���������������������������������������������������",
            "The auto refresh time of external meta cache."
    })
    public static long external_cache_refresh_time_minutes = 10; // 10 mins

    /**
     * Github workflow test type, for setting some session variables
     * only for certain test type. E.g. only settting batch_size to small
     * value for p0.
     */
    @ConfField(mutable = true, masterOnly = false, options = {"p0", "daily", "rqg", "external"})
    public static String fuzzy_test_type = "";

    /**
     * Set session variables randomly to check more issues in github workflow
     */
    @ConfField(mutable = true, masterOnly = false)
    public static boolean use_fuzzy_session_variable = false;

    /**
     * Set config variables randomly to check more issues in github workflow
     */
    @ConfField(mutable = true, masterOnly = false)
    public static boolean use_fuzzy_conf = false;

    /**
     * Max num of same name meta informatntion in catalog recycle bin.
     * Default is 3.
     * 0 means do not keep any meta obj with same name.
     * < 0 means no limit
     */
    @ConfField(mutable = true, masterOnly = true)
    public static int max_same_name_catalog_trash_num = 3;

    /**
     * NOTE: The storage policy is still under developement.
     */
    @ConfField(mutable = false, masterOnly = true)
    public static boolean enable_storage_policy = true;

    /**
     * This config is mainly used in the k8s cluster environment.
     * When enable_fqdn_mode is true, the name of the pod where be is located will remain unchanged
     * after reconstruction, while the ip can be changed.
     */
    @ConfField(mutable = false, varType = VariableAnnotation.EXPERIMENTAL)
    public static boolean enable_fqdn_mode = false;

    /**
     * If set to true, doris will try to parse the ddl of a hive view and try to execute the query
     * otherwise it will throw an AnalysisException.
     */
    @ConfField(mutable = true)
    public static boolean enable_query_hive_views = true;

    @ConfField(mutable = true)
    public static boolean enable_query_iceberg_views = true;

    /**
     * If set to true, doris will automatically synchronize hms metadata to the cache in fe.
     */
    @ConfField(masterOnly = true)
    public static boolean enable_hms_events_incremental_sync = false;

    /**
     * the plan cache num which can be reused for the next query
     */
    @ConfField(
            mutable = true,
            callbackClassString = "org.apache.doris.common.cache.NereidsSqlCacheManager$UpdateConfig",
            description = {
                "��������������������� 100��������������������� NereidsSqlCacheManager ��������� sql cache ���������",
                "Now default set to 100, this config is used to control the number of "
                        + "sql cache managed by NereidsSqlCacheManager"
            }
    )
    public static int sql_cache_manage_num = 100;

    @ConfField(
            mutable = true,
            callbackClassString = "org.apache.doris.common.cache.NereidsSortedPartitionsCacheManager$UpdateConfig",
            description = {
                    "��������������������� 100��������������������� NereidsSortedPartitionsCacheManager ������������������������������������������"
                            + "������������������������",
                    "The current default setting is 100, which is used to control the number of ordered "
                            + "partition metadata caches in NereidsSortedPartitionsCacheManager, "
                            + "and to accelerate partition pruning"
            }
    )
    public static int cache_partition_meta_table_manage_num = 100;

    /**
     * HBO plan stats. cache number which can be reused for the next query.
     */
    @ConfField(
            mutable = true,
            callbackClassString = "org.apache.doris.nereids.stats.MemoryHboPlanStatisticsProvider$UpdateConfig",
            description = {
                    "��������������������� 100000��������������������� MemoryHboPlanStatisticsProvider ��������� plan stats. cache ���������",
                    "Now default set to 100000, this config is used to control the number of "
                            + "hbo plan stats. cache"
            }
    )
    public static int hbo_plan_stats_cache_num = 100000;

    /**
     * HBO plan recent runs entry number.
     */
    @ConfField(
            mutable = true,
            description = {
                    "��������������������� 10��������������������� MemoryHboPlanStatisticsProvider ��������� plan stats. cache recent runs ���������",
                    "Now default set to 10, this config is used to control the number of "
                            + "hbo plan stats. cache recent runs' entry number."
            }
    )
    public static int hbo_plan_stats_cache_recent_runs_entry_num = 10;

    /**
     * Plan info cache number which is used for HboPlanInfoProvider.
     */
    @ConfField(
            mutable = true,
            callbackClassString = "org.apache.doris.nereids.stats.HboPlanInfoProvider$UpdateConfig",
            description = {
                    "��������������������� 1000��������������������� HboPlanInfoProvider ��������� plan info cache ���������",
                    "Now default set to 1000, this config is used to control the number of "
                            + "hbo plan info cache"
            }
    )
    public static int hbo_plan_info_cache_num = 1000;

    /**
     * Maximum number of events to poll in each RPC.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static int hms_events_batch_size_per_rpc = 500;

    /**
     * HMS polling interval in milliseconds.
     */
    @ConfField(masterOnly = true)
    public static int hms_events_polling_interval_ms = 10000;

    /**
     * Maximum number of error tablets showed in broker load
     */
    @ConfField(masterOnly = true, mutable = true)
    public static int max_error_tablet_of_broker_load = 3;

    /**
     * If set to ture, doris will establish an encrypted channel based on the SSL protocol with mysql.
     */
    @ConfField(mutable = false, masterOnly = false, varType = VariableAnnotation.EXPERIMENTAL)
    public static boolean enable_ssl = false;

    /**
     * If set to ture, ssl connection needs to authenticate client's certificate.
     */
    @ConfField(mutable = false, masterOnly = false)
    public static boolean ssl_force_client_auth = false;

    /**
     * ssl connection needs to authenticate client's certificate store type.
     */
    @ConfField(mutable = false, masterOnly = false)
    public static String ssl_trust_store_type = "PKCS12";

    /**
     * Default CA certificate file location for mysql ssl connection.
     */
    @ConfField(mutable = false, masterOnly = false)
    public static String mysql_ssl_default_ca_certificate =  EnvUtils.getDorisHome()
            + "/mysql_ssl_default_certificate/ca_certificate.p12";

    /**
     * Default server certificate file location for mysql ssl connection.
     */
    @ConfField(mutable = false, masterOnly = false)
    public static String mysql_ssl_default_server_certificate =  EnvUtils.getDorisHome()
            + "/mysql_ssl_default_certificate/server_certificate.p12";

    /**
     * Password for default CA certificate file.
     */
    @ConfField(mutable = false, masterOnly = false)
    public static String mysql_ssl_default_ca_certificate_password = "doris";

    /**
     * Password for default CA certificate file.
     */
    @ConfField(mutable = false, masterOnly = false)
    public static String mysql_ssl_default_server_certificate_password = "doris";

    /**
     * Used to set session variables randomly to check more issues in github workflow
     */
    @ConfField(mutable = true)
    public static int pull_request_id = 0;

    /**
     * Used to set default db transaction quota num.
     */
    @ConfField(mutable = true, masterOnly = true)
    public static long default_db_max_running_txn_num = -1;

    /**
     * Used by TokenManager to control the number of tokens keep in memory.
     * One token will keep alive for {token_queue_size * token_generate_period_hour} hours.
     * By defaults, one token will keep for 3 days.
     */
    @ConfField(mutable = false, masterOnly = true)
    public static int token_queue_size = 6;

    /**
     * TokenManager will generate token every token_generate_period_hour.
     */
    @ConfField(mutable = false, masterOnly = true)
    public static int token_generate_period_hour = 12;

    /**
     * The secure local path of the FE node the place the data which will be loaded in doris.
     * The default value is empty for this config which means this feature is not allowed.
     * User who want to load fe server local file should config the value to a right local path.
     */
    @ConfField(mutable = false, masterOnly = false)
    public static String mysql_load_server_secure_path = "";

    @ConfField(mutable = false, masterOnly = false)
    public static int mysql_load_in_memory_record = 20;

    @ConfField(mutable = false, masterOnly = false)
    public static int mysql_load_thread_pool = 4;

    /**
     * BDBJE file logging level
     * OFF, SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST, ALL
     */
    @ConfField
    public static String bdbje_file_logging_level = "INFO";

    /**
     * When holding lock time exceeds the threshold, need to report it.
     */
    @ConfField
    public static long lock_reporting_threshold_ms = 500L;

    /**
     * If true, auth check will be disabled. The default value is false.
     * This is to solve the case that user forgot the password.
     */
    @ConfField(mutable = false)
    public static boolean skip_localhost_auth_check  = true;

    @ConfField(mutable = true)
    public static boolean enable_round_robin_create_tablet = true;

    @ConfField(mutable = true, masterOnly = true, description = {
            "������������������������������������ BE ������������������������������������������������ BE ���������",
            "When creating tablet of a partition, always start from the first BE. "
                    + "Note: This method may cause BE imbalance"})
    public static boolean create_tablet_round_robin_from_start = false;

    /**
     * To prevent different types (V1, V2, V3) of behavioral inconsistencies,
     * we may delete the DecimalV2 and DateV1 types in the future.
     * At this stage, we use 'disable_decimalv2' and 'disable_datev1'
     * to determine whether these two types take effect.
     */
    @ConfField(mutable = true)
    public static boolean disable_decimalv2  = true;

    @ConfField(mutable = true)
    public static boolean disable_datev1  = true;

    /*
     * This variable indicates the number of digits by which to increase the scale
     * of the result of division operations performed with the `/` operator. The
     * default value is 4, and it is currently only used for the DECIMALV3 type.
     */
    @ConfField(mutable = true)
    public static int div_precision_increment = 4;

    /**
     * This config used for export/outfile.
     * Whether delete all files in the directory specified by export/outfile.
     * It is a very dangerous operation, should only be used in test env.
     */

    @ConfField(mutable = false)
    public static boolean enable_delete_existing_files  = false;
    /*
     * The actual memory size taken by stats cache highly depends on characteristics of data, since on the different
     * dataset and scenarios the max/min literal's average size and buckets count of histogram would be highly
     * different. Besides, JVM version etc. also has influence on it, though not much as data itself.
     * Here I would give the mem size taken by stats cache with 10_0000 items.Each item's avg length of max/min literal
     * is 32, and the avg column name length is 16, and each column has a histogram with 128 buckets
     * In this case, stats cache takes total 911.954833984MiB mem.
     * If without histogram, stats cache takes total 61.2777404785MiB mem.
     * It's strongly discourage analyzing a column with a very large STRING value in the column, since it would cause
     * FE OOM.
     */
    @ConfField
    public static long stats_cache_size = 50_0000;

    /**
     * This config used for ranger cache data mask/row policy
     */
    @ConfField
    public static long ranger_cache_size = 10000;

    /**
     * This configuration is used to enable the statistics of query information, which will record
     * the access status of databases, tables, and columns, and can be used to guide the
     * optimization of table structures
     *
     */
    @ConfField(mutable = true)
    public static boolean enable_query_hit_stats = false;

    @ConfField(mutable = true, description = {
            "��������� true��������������������������������������������������������������� tablet ������������������������������" + "������������������������������������",
            "When set to true, if a query is unable to select a healthy replica, "
                    + "the detailed information of all the replicas of the tablet,"
                    + " including the specific reason why they are unqueryable, will be printed out."})
    public static boolean show_details_for_unaccessible_tablet = true;

    @ConfField(mutable = false, masterOnly = false, varType = VariableAnnotation.EXPERIMENTAL, description = {
            "������������ binlog ������",
            "Whether to enable binlog feature"})
    public static boolean enable_feature_binlog = false;

    @ConfField(mutable = false, description = {
            "��������������� Database/Table ������ binlog ������",
            "Whether to enable binlog feature for Database/Table by default"})
    public static boolean force_enable_feature_binlog = false;

    @ConfField(mutable = false, masterOnly = false, varType = VariableAnnotation.EXPERIMENTAL, description = {
        "������ binlog ���������������������",
        "Set the maximum byte length of binlog message"})
    public static int max_binlog_messsage_size = 1024 * 1024 * 1024;

    @ConfField(mutable = true, masterOnly = true, description = {
            "������������������ WITH RESOURCE ������������ Catalog���",
            "Whether to disable creating catalog with WITH RESOURCE statement."})
    public static boolean disallow_create_catalog_with_resource = true;

    @ConfField(mutable = true, masterOnly = false, description = {
        "Hive ���������������������������",
        "Sample size for hive row count estimation."})
    public static int hive_stats_partition_sample_size = 30;

    @ConfField(mutable = true, masterOnly = true, description = {
            "������ Hive ���������",
            "Enable external hive bucket table"})
    public static boolean enable_create_hive_bucket_table = false;

    @ConfField(mutable = true, masterOnly = true, description = {
            "Hive ������������������������������������������",
            "Default hive file format for creating table."})
    public static String hive_default_file_format = "orc";

    @ConfField
    public static int statistics_sql_parallel_exec_instance_num = 1;

    @ConfField
    public static long statistics_sql_mem_limit_in_bytes = 2L * 1024 * 1024 * 1024;

    @ConfField(mutable = true, masterOnly = true, description = {
            "���������������������������������������������������������������������������������������������������������������������������������������������������������"
                    + "���������������������������������������������������������������������������������������������������������������������������������������������������������������������������",
            "Used to force the number of replicas of the internal table. If the config is greater than zero, "
                    + "the number of replicas specified by the user when creating the table will be ignored, "
                    + "and the value set by this parameter will be used. At the same time, the replica tags "
                    + "and other parameters specified in the create table statement will be ignored. "
                    + "This config does not effect the operations including creating partitions "
                    + "and modifying table properties. "
                    + "This config is recommended to be used only in the test environment"})
    public static int force_olap_table_replication_num = 0;

    @ConfField(mutable = true, description = {
            "���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������"
                    + "������������������������������������������������������������������������������������������������������������������",
            "Used to force set the replica allocation of the internal table. If the config is not empty, "
                    + "the replication_num and replication_allocation specified by the user when creating the table "
                    + "or partitions will be ignored, and the value set by this parameter will be used."
                    + "This config effect the operations including create tables, create partitions and create "
                    + "dynamic partitions. This config is recommended to be used only in the test environment"})
    public static String force_olap_table_replication_allocation = "";

    @ConfField
    public static int auto_analyze_simultaneously_running_task_num = 1;

    @Deprecated
    @ConfField
    public static final int period_analyze_simultaneously_running_task_num = 1;

    @ConfField(mutable = false)
    public static boolean allow_analyze_statistics_info_polluting_file_cache = true;

    @ConfField
    public static int cpu_resource_limit_per_analyze_task = 1;

    @ConfField(mutable = true)
    public static boolean force_sample_analyze = false; // avoid full analyze for performance reason

    @ConfField(mutable = true, description = {
            "Export ���������������������������������",
            "The maximum number of partitions allowed by Export job"})
    public static int maximum_number_of_export_partitions = 2000;

    @Deprecated
    @ConfField(mutable = true, description = {
            "Export ������������������������������",
            "The maximum parallelism allowed by Export job"})
    public static int maximum_parallelism_of_export_job = 50;

    @ConfField(mutable = true, description = {
            "��������� mysql ��� bigint ��������������� Doris ��� largeint ������",
            "Whether to use mysql's bigint type to return Doris's largeint type"})
    public static boolean use_mysql_bigint_for_largeint = false;

    @ConfField
    public static boolean forbid_running_alter_job = false;

    @ConfField(description = {
            "��������������������������������������������������� olap ��������������� light schema change",
            "temporary config filed, will make all olap tables enable light schema change"
    })
    public static boolean enable_convert_light_weight_schema_change = false;

    @ConfField(mutable = true, masterOnly = false, description = {
            "������ information_schema.metadata_name_ids ������������������������������������������������������",
            "When querying the information_schema.metadata_name_ids table,"
                    + " the time used to obtain all tables in one database"
    })
    public static long query_metadata_name_ids_timeout = 3;

    @ConfField(mutable = true, masterOnly = true, description = {
            "������������ LocalDeployManager ������������",
            "Whether to disable LocalDeployManager drop node"})
    public static boolean disable_local_deploy_manager_drop_node = true;

    @ConfField(mutable = true, description = {
            "������ file cache ������������������������������������������������������������������"
                    + "������������������������������������������������������������������������������",
            "When file cache is enabled, the number of virtual nodes of each node in the consistent hash algorithm. "
                    + "The larger the value, the more uniform the distribution of the hash algorithm, "
                    + "but it will increase the memory overhead."})
    public static int split_assigner_virtual_node_number = 256;

    @ConfField(mutable = true, description = {
            "������������������������������������������������������������������������������",
            "Local node soft affinity optimization. Prefer local replication node."})
    public static boolean split_assigner_optimized_local_scheduling = true;

    @ConfField(mutable = true, description = {
            "������������������������������������������������������������������������",
            "The random algorithm has the smallest number of candidates and will select the most idle node."})
    public static int split_assigner_min_random_candidate_num = 2;

    @ConfField(mutable = true, description = {
            "���������������������������������������������������������������������������������",
            "The consistent hash algorithm has the smallest number of candidates and will select the most idle node."})
    public static int split_assigner_min_consistent_hash_candidate_num = 2;

    @ConfField(mutable = true, description = {
            "������������������������ split ��������������������������������������������������������� split���",
            "The maximum difference in the number of splits between nodes. "
                    + "If this number is exceeded, the splits will be redistributed."})
    public static int split_assigner_max_split_num_variance = 1;

    @ConfField(description = {
            "���������������������������������������������������������������������",
            "Determine the persist number of automatic triggered analyze job execution status"
    })
    public static long analyze_record_limit = 20000;

    @ConfField(mutable = true, masterOnly = true, description = {
            "Auto Buckets ������������ buckets ������",
            "min buckets of auto bucket"
    })
    public static int autobucket_min_buckets = 1;

    @ConfField(mutable = true, masterOnly = true, description = {
        "Auto Buckets ������������ buckets ������",
        "max buckets of auto bucket"
    })
    public static int autobucket_max_buckets = 128;

    @ConfField(description = {"������������������������������������������������������������������ 768���"
            + "1. ���������������������������������CREATE TABLE / ALTER TABLE ADD PARTITION���������������������������������������������������������������������������������"
            + "2. ������������������������������������������������������������������������ autobucket_max_buckets���"
            + "��������� 0 ���������������������������������������������������",
            "Maximum number of buckets when creating a table or adding a partition. Defaults to 768."
            + "1. For user-specified buckets (CREATE TABLE / ALTER TABLE ADD PARTITION): "
            + "if bucket number exceeds this limit, the operation will be rejected with an error message. "
            + "2. For auto-bucket feature (Dynamic Partition): "
            + "bucket number will be capped at autobucket_max_buckets automatically. "
            + "Set to 0 or negative value to disable this limit for user-specified buckets."})
    public static int max_bucket_num_per_partition = 768;

    @ConfField(description = {"������ FE ��� Arrow Flight Server ���������������������",
            "Maximal number of connections of Arrow Flight Server per FE."})
    public static int arrow_flight_max_connections = 4096;

    @ConfField(mutable = true, masterOnly = true, description = {
        "Auto Buckets ��������� partition size ��������� bucket ������������������ partition size 5G ������������ bucket���"
            + "������������������ partition size 10G ������������ bucket������������������ 0��������������������������������������������������������� 5G������������������������ 10G",
        "In Auto Buckets, the number of buckets is estimated based on the partition size. "
            + "For storage and computing integration, a partition size of 5G is estimated as one bucket."
            + " but for cloud, a partition size of 10G is estimated as one bucket. "
            + "If the configuration is less than 0, the code will have an adaptive non-cloud mode with a default of 5G,"
            + " and in cloud mode with a default of 10G."
    })
    public static int autobucket_partition_size_per_bucket_gb = -1;

    @ConfField(mutable = true, masterOnly = true, description = {"Auto bucket ��������������������������� bucket num ������������������������"
            + "bucket num ��������������������������������� case ������",
            "The new partition bucket number calculated in the auto bucket exceeds the percentage "
            + "of the previous partition's bucket number, which is considered an abnormal case alert."})
    public static double autobucket_out_of_bounds_percent_threshold = 0.5;

    @ConfField(description = {"(��������������� arrow_flight_max_connection ������) Arrow Flight Server ��������������� token ������������������"
            + "��������� LRU ���������arrow flight sql ���������������������������������������������������������"
            + "bearer token ��� cache ������������������ unregister Connection.",
            "(Deprecated, replaced by arrow_flight_max_connection) The cache limit of all user tokens in "
            + "Arrow Flight Server. which will be eliminated by LRU rules after exceeding the limit, "
            + "arrow flight sql is a stateless protocol, the connection is usually not actively disconnected, "
            + "bearer token is evict from the cache will unregister ConnectContext."})
    public static int arrow_flight_token_cache_size = 4096;

    @ConfField(description = {"Arrow Flight Server ��������� token ��������������������������������������������������������������������������� 86400������ 1 ���",
            "The alive time of the user token in Arrow Flight Server, expire after write, unit second,"
            + "the default value is 86400, which is 1 days"})
    public static int arrow_flight_token_alive_time_second = 86400;

    @ConfField(mutable = true, description = {
            "Doris ������������ mysql ������������������������������������������ mysql ������������������������������������������������������������������"
            + "��������������������������� doris ��������� mysql database ������������������",
            "To ensure compatibility with the MySQL ecosystem, Doris includes a built-in database called mysql. "
            + "If this database conflicts with a user's own database, please modify this field to replace "
            + "the name of the Doris built-in MySQL database with a different name."})
    public static String mysqldb_replace_name = "mysql";

    @ConfField(description = {
        "������������������������������������������������������������������������������",
        "Set the specific domain name that allows cross-domain access. "
            + "By default, any domain name is allowed cross-domain access"
    })
    public static String access_control_allowed_origin_domain = "*";

    @ConfField(description = {
            "������ java_udf, ��������� true��������������������� false��������������������������� java_udf������������������������������������������������������������������",
            "Used to enable java_udf, default is true. if this configuration is false, creation and use of java_udf is "
                    + "disabled. in some scenarios it may be necessary to disable this configuration to prevent "
                    + "command injection attacks."
    })
    public static boolean enable_java_udf = true;

    @ConfField(mutable = true, masterOnly = true, description = {
        "������������������������������������������������������ java_udf ������������������������������ false���",
        "When enabled, data can be processed using the globally created java_udf function during import."
                + " The default setting is false."
    })
    public static boolean enable_udf_in_load = false;

    @ConfField(description = {
            "������������ Image ������������������������������������ true��������� PersistMetaModules.MODULE_NAMES ���������������������������������������������"
                    + "��������� false��������� Image ���������������������������������Doris ���������������������"
                    + "������������������������������������������������������������������������ Image ���������",
            "Whether to ignore unknown modules in Image file. "
                    + "If true, metadata modules not in PersistMetaModules.MODULE_NAMES "
                    + "will be ignored and skipped. Default is false, if Image file contains unknown modules, "
                    + "Doris will throw exception. "
                    + "This parameter is mainly used in downgrade operation, "
                    + "old version can be compatible with new version Image file."
    })
    public static boolean ignore_unknown_metadata_module = false;

    @ConfField(mutable = true, description = {
            "������������������ image ���������������������������������������${meta_dir}/image ������������������ image ������������������������������������������������"
                    + "������������������������ 300",
            "The timeout for FE Follower/Observer synchronizing an image file from the FE Master, can be adjusted by "
                    + "the user on the size of image file in the ${meta_dir}/image and the network environment between "
                    + "nodes. The default values is 300."
    })
    public static int sync_image_timeout_second = 300;

    @ConfField(mutable = true, description = {
        "FE ��������������� image ��������������������������������������������������������������������������������������� utf8 ���������������������������������������byte, ������ 500MB���"
            + "������������������ -1 ������������������������������������������������������������������������������ utf8 ������������������"
            + "��������� -1 ��������������� 16MB������������������������������������������������������������������ utf8 ������������������������������������������������������������������ -1",
        "The size of a single batch (in bytes) when loading the binary content of a module of the "
            + "image file into a byte array and deserializing the byte array into a utf8 encoded string when FE starts."
            + " A value equal to -1 means reading the entire byte array at once and "
            + "then deserializing it into a utf8 encoded string; a value not equal to -1 means reading "
            + "a certain size (at least 16MB) of byte array in batches and then deserializing it into a "
            + "utf8 encoded string, and finally merging it into a completed string. The default value is -1"
    })
    public static int metadata_text_read_max_batch_bytes = -1;

    @ConfField(mutable = true, masterOnly = true)
    public static int publish_topic_info_interval_ms = 30000; // 30s

    @ConfField(mutable = true)
    public static int workload_sched_policy_interval_ms = 10000; // 10s

    @ConfField(mutable = true, masterOnly = true)
    public static int workload_group_check_interval_ms = 2000; // 2s

    @ConfField(mutable = true, masterOnly = true)
    public static int workload_max_policy_num = 25;

    @ConfField(mutable = true, masterOnly = true)
    public static int workload_max_condition_num_in_policy = 5;

    @ConfField(mutable = true, masterOnly = true)
    public static int workload_max_action_num_in_policy = 5; // mainly used to limit set session var action

    @ConfField(mutable = true)
    public static int workload_runtime_status_thread_interval_ms = 2000;

    // NOTE: it should bigger than be config report_query_statistics_interval_ms
    @ConfField(mutable = true)
    public static int query_audit_log_timeout_ms = 5000;

    @ConfField(description = {
            "���������������������������������������������������������������������������������������������������������������",
            "The operations of the users in this list will not be recorded in the audit log. "
                    + "Multiple users are separated by commas."
    })
    public static String skip_audit_user_list = "";

    @ConfField(mutable = true)
    public static int be_report_query_statistics_timeout_ms = 60000;

    @ConfField(mutable = true, masterOnly = true)
    public static int workload_group_max_num = 15;

    @ConfField(description = {"������ be wal_queue ��������������� (ms)",
            "the timeout threshold of checking wal_queue on be(ms)"})
    public static int check_wal_queue_timeout_threshold = 180000;   // 3 min

    @ConfField(mutable = true, masterOnly = true, description = {
            "��������������������������������������������������������������������� OLAP ���������������������������`max_auto_partition_num`��������� 2000���",
            "For auto-partitioned tables to prevent users from accidentally creating a large number of partitions, "
                    + "the number of partitions allowed per OLAP table is `max_auto_partition_num`. Default 20000."})
    public static int max_auto_partition_num = 20000;

    @ConfField(mutable = true, masterOnly = true, description = {
            "Partition rebalance ��������������� BE ��� tablet ���������������������������������������������������������",
            "The maximum difference in the number of tablets of each BE in partition rebalance mode. "
                    + "If it is less than this value, it will be diagnosed as balanced."
    })
    public static int diagnose_balance_max_tablet_num_diff = 50;

    @ConfField(mutable = true, masterOnly = true, description = {
            "Partition rebalance ��������������� BE ��� tablet ������������������������������������������������������������",
            "The maximum ratio of the number of tablets in each BE in partition rebalance mode. "
                    + "If it is less than this value, it will be diagnosed as balanced."
    })
    public static double diagnose_balance_max_tablet_num_ratio = 1.1;

    @ConfField(masterOnly = true, description = {
            "������ root ��������������� 2 ������ SHA-1 ������������������������''��������������� root ���������"
                    + "������ root ��������� `set password` ������������ root ������������������������"
                    + "��������������������������������������� `root@123`��������� Doris ������ SQL `select password('root@123')` "
                    + "������������������ `*A00C34073A26B40AB4307650BFB9309D6BFA6999`",
            "Set root user initial 2-staged SHA-1 encrypted password, default as '', means no root password. "
                    + "Subsequent `set password` operations for root user will overwrite the initial root password. "
                    + "Example: If you want to configure a plaintext password `root@123`."
                    + "You can execute Doris SQL `select password('root@123')` to generate encrypted "
                    + "password `*A00C34073A26B40AB4307650BFB9309D6BFA6999`"})
    public static String initial_root_password = "";

    @ConfField(description = {"nereids trace ������������������������",
            "The path of the nereids trace file."})
    public static String nereids_trace_log_dir = System.getenv("LOG_DIR") + "/nereids_trace";

    @ConfField(mutable = true, masterOnly = true, description = {
            "������������������������ upload ������������������������������������������������ 10 ���",
            "The max number of snapshots assigned to a upload task during the backup process, the default value is 10."
    })
    public static int backup_upload_snapshot_batch_size = 10;

    @ConfField(mutable = true, masterOnly = true, description = {
            "������������������������ download ������������������������������������������������ 10 ���",
            "The max number of snapshots assigned to a download task during the restore process, "
            + "the default value is 10."
    })
    public static int restore_download_snapshot_batch_size = 10;

    @ConfField(mutable = true, masterOnly = true, description = {
            "������������������������������ RPC ��������������� be ������������������������������������ 10000 ������",
            "The max number of batched tasks per RPC assigned to each be during the backup/restore process, "
            + "the default value is 10000."
    })
    public static int backup_restore_batch_task_num_per_rpc = 10000;

    @ConfField(mutable = true, masterOnly = true, description = {
            "������ BE ���������������������������������������",
            "The number of concurrent restore tasks per be"})
    public static int restore_task_concurrency_per_be = 5000;

    @ConfField(mutable = true, description = {"������ agent task ������BE ��������������������������������� BE ���������",
            "The time after which BE is considered unavailable if the heartbeat is not received"})
    public static int agent_task_be_unavailable_heartbeat_timeout_second = 300;

    @ConfField(description = {"������������������ http ������������ log ���������������",
            "Whether to enable the function of getting log files through http interface"})
    public static boolean enable_get_log_file_api = false;

    @ConfField(mutable = true)
    public static boolean enable_profile_when_analyze = false;
    @ConfField(mutable = true)
    public static boolean enable_collect_internal_query_profile = false;

    @ConfField(mutable = false, masterOnly = false, description = {
        "http ������������/api/query ��� sql ���������������������������",
        "The max number work threads of http sql submitter."
    })
    public static int http_sql_submitter_max_worker_threads = 2;

    @ConfField(mutable = false, masterOnly = false, description = {
        "http ������������/api/upload ���������������������������",
        "The max number work threads of http upload submitter."
    })
    public static int http_load_submitter_max_worker_threads = 2;

    @ConfField(mutable = true, masterOnly = true, description = {
            "load label ���������������������������������������������������������������������������������"
            + "��� label ��������������������������� label ������������������������ -1 ���������������������������������",
            "The threshold of load labels' number. After this number is exceeded, "
                    + "the labels of the completed import jobs or tasks will be deleted, "
                    + "and the deleted labels can be reused. "
                    + "When the value is -1, it indicates no threshold."
    })
    public static int label_num_threshold = 2000;

    @ConfField(description = {"������ internal catalog ������������������",
            "Specify the default authentication class of internal catalog"},
            options = {"default", "ranger-doris"})
    public static String access_controller_type = "default";

    /* https://forums.oracle.com/ords/apexds/post/je-log-checksumexception-2812
      when meeting disk damage or other reason described in the oracle forums
      and fe cannot start due to `com.sleepycat.je.log.ChecksumException`, we
      add a param `ignore_bdbje_log_checksum_read` to ignore the exception, but
      there is no guarantee of correctness for bdbje kv data
    */
    @ConfField
    public static boolean ignore_bdbje_log_checksum_read = false;

    @ConfField(description = {"������ mysql ������������������������",
            "Specifies the authentication type"},
            options = {"default", "ldap"})
    public static String authentication_type = "default";

    @ConfField(mutable = true, masterOnly = false, description = {"������ trino-connector catalog ���������������������������",
            "Specify the default plugins loading path for the trino-connector catalog"})
    public static String trino_connector_plugin_dir = EnvUtils.getDorisHome() + "/plugins/connectors";

    @ConfField(mutable = true)
    public static boolean fix_tablet_partition_id_eq_0 = false;

    @ConfField(mutable = true, masterOnly = true, description = {
            "������������������������������",
            "Default storage format of inverted index, the default value is V3."
    })
    public static String inverted_index_storage_format = "V3";

    @ConfField(mutable = true, masterOnly = true, description = {
            "��������� unique ��� mow ��������� delete ��������� delete predicate������������������������ delete ������������������"
                    + "��� delete ������������������������������������������������������������������������������������������ delete ������������������������������������",
            "Enable the 'delete predicate' for DELETE statements. If enabled, it will enhance the performance of "
                    + "DELETE statements, but partial column updates after a DELETE may result in erroneous data. "
                    + "If disabled, it will reduce the performance of DELETE statements to ensure accuracy."
    })
    public static boolean enable_mow_light_delete = false;

    @ConfField(description = {
            "������������ Proxy Protocol ������",
            "Whether to enable proxy protocol"
    })
    public static boolean enable_proxy_protocol = false;

    @ConfField(description = {
            "Profile ������������������������������ query ������������������������������������������������ profile ������������������������������������ profile ���������������",
            "Profile async collect expire time, after the query is completed, if the profile is not collected within "
                    + " the time specified by this parameter, the uncompleted profile will be abandoned."
    })
    public static int profile_async_collect_expire_time_secs = 5;

    @ConfField(description = {
            "������������ ProfileManager ������ Profile ������������������������������������������������ ProfileManager ������������������������������ profile "
                    + "������������������������������������������������",
            "Used to control the interval time of ProfileManager for profile garbage collection. "
    })
    public static int profile_manager_gc_interval_seconds = 1;
    // Used to check compatibility when upgrading.
    @ConfField
    public static boolean enable_check_compatibility_mode = false;

    // Do checkpoint after replaying edit logs.
    @ConfField
    public static boolean checkpoint_after_check_compatibility = false;

    // Advance the next id before transferring to the master.
    @ConfField(description = {
            "��������������� Master ��������� ID ���������������������������������������������������������������",
            "Whether to advance the ID generator after becoming Master to ensure that the id "
                    + "generator will not be rolled back even when metadata is rolled back."
    })
    public static boolean enable_advance_next_id = true;

    // The count threshold to do manual GC when doing checkpoint but not enough memory.
    // Set zero to disable it.
    @ConfField(description = {
            "������ checkpoint ��������������������������������������������������������������������� GC",
            "The threshold to do manual GC when doing checkpoint but not enough memory"})
    public static int checkpoint_manual_gc_threshold = 0;

    @ConfField(mutable = true, description = {
            "��������������������������������������������������������������������� query ������",
            "Should the request content be logged before each request starts, specifically the query statements"})
    public static boolean enable_print_request_before_execution = false;

    @ConfField
    public static String spilled_profile_storage_path = System.getenv("LOG_DIR") + File.separator + "profile";

    @ConfField
    public static String spilled_minidump_storage_path = System.getenv("LOG_DIR") + File.separator + "minidump";

    // The max number of profiles that can be stored to storage.
    @ConfField
    public static int max_spilled_profile_num = 500;

    // The total size of profiles that can be stored to storage.
    @ConfField
    public static long spilled_profile_storage_limit_bytes = 1 * 1024 * 1024 * 1024; // 1GB

    // Profile will be spilled to storage after query has finished for this time.
    @ConfField(mutable = true, description = {
            "Profile ��� query ���������������������������������������������",
            "Profile will be spilled to storage after query has finished for this time"})
    public static int profile_waiting_time_for_spill_seconds = 10;

    @ConfField(mutable = true, description = {
            "��������������������������� BE ��������� abort ������",
            "SHould abort txn by checking coorinator be heartbeat"})
    public static boolean enable_abort_txn_by_checking_coordinator_be = true;

    @ConfField(mutable = true, description = {
            "��������� schema change ��������������������������������� abort ���",
            "SHould abort txn by checking conflick txn in schema change"})
    public static boolean enable_abort_txn_by_checking_conflict_txn = true;

    @ConfField(mutable = true, description = {
            "���������������������������������������������������������������������������������������������������������������������������������0 ���������������������",
            "Columns that have not been collected within the specified interval will trigger automatic analyze. "
                + "0 means not trigger."
    })
    public static long auto_analyze_interval_seconds = 86400; // 24 hours.

    // A internal config to control whether to enable the checkpoint.
    //
    // ATTN: it only used in test environment.
    @ConfField(mutable = true, masterOnly = true)
    public static boolean enable_checkpoint = true;

    @ConfField(description = {
        "������ hadoop conf ������������������������������",
        "The default directory for storing hadoop conf configuration files."})
    public static String hadoop_config_dir = EnvUtils.getDorisHome() + "/plugins/hadoop_conf/";

    @ConfField(mutable = true, masterOnly = true, description = {"��������������� RPC ���������������",
            "Timeout of dictionary related RPC"})
    public static int dictionary_rpc_timeout_seconds = 5;

    @ConfField(mutable = true, masterOnly = true, description = { "������������������������������������������������������������",
            "Interval at which the dictionary triggers a data expiration check, in seconds" })
    public static int dictionary_auto_refresh_interval_seconds = 5;

    //==========================================================================
    //                    begin of cloud config
    //==========================================================================
    @ConfField(description = {"������������ FE ������������������������������������������������������������������������������������������ log������������������������������������",
        "Whether to enable the FE log file deletion policy based on size, "
            + "where logs exceeding the specified size are deleted. "
            + "It is disabled by default and follows a time-based deletion policy."},
            options = {"age", "size"})
    public static String log_rollover_strategy = "age";

    @ConfField public static int info_sys_accumulated_file_size = 4;
    @ConfField public static int warn_sys_accumulated_file_size = 2;
    @ConfField public static int audit_sys_accumulated_file_size = 4;

    @ConfField
    public static String deploy_mode = "";

    // compatibily with elder version.
    // cloud_unique_id has higher priority than cluster_id.
    @ConfField
    public static String cloud_unique_id = "";

    public static boolean isCloudMode() {
        return deploy_mode.equals("cloud") || !cloud_unique_id.isEmpty();
    }

    public static boolean isNotCloudMode() {
        return !isCloudMode();
    }

    /**
     * MetaService endpoint, ip:port, such as meta_service_endpoint = "192.0.0.10:8866"
     *
     * If you want to access a group of meta services, separated the endpoints by comma,
     * like "host-1:port,host-2:port".
     */
    @ConfField(mutable = true, callback = CommaSeparatedIntersectConfHandler.class)
    public static String meta_service_endpoint = "";

    @ConfField(mutable = true)
    public static boolean meta_service_connection_pooled = true;

    @ConfField(mutable = true)
    public static int meta_service_connection_pool_size = 20;

    @ConfField(mutable = true)
    public static int meta_service_rpc_retry_times = 200;

    public static int metaServiceRpcRetryTimes() {
        if (isCloudMode() && enable_check_compatibility_mode) {
            return 1;
        }
        return meta_service_rpc_retry_times;
    }

    // A connection will expire after a random time during [base, 2*base), so that the FE
    // has a chance to connect to a new RS. Set zero to disable it.
    @ConfField(mutable = true)
    public static int meta_service_connection_age_base_minutes = 5;

    @ConfField(mutable = false)
    public static boolean enable_sts_vpc = true;

    @ConfField(mutable = true)
    public static int sts_duration = 3600;

    @ConfField(mutable = true)
    public static int drop_rpc_retry_num = 200;

    @ConfField
    public static int default_get_version_from_ms_timeout_second = 3;

    @ConfField(mutable = true)
    public static boolean enable_cloud_multi_replica = false;

    @ConfField(mutable = true)
    public static int cloud_replica_num = 3;

    @ConfField(mutable = true)
    public static int cloud_cold_read_percent = 10; // 10%

    @ConfField(mutable = true)
    public static int get_tablet_stat_batch_size = 1000;

    @ConfField(mutable = true, masterOnly = true)
    public static boolean enable_light_index_change = true;

    // The original meta read lock is not enough to keep a snapshot of partition versions,
    // so the execution of `createScanRangeLocations` are delayed to `Coordinator::exec`,
    // to help to acquire a snapshot of partition versions.
    @ConfField
    public static boolean enable_cloud_snapshot_version = true;

    // Interval in seconds for checking the status of compute groups (cloud clusters).
    // Compute groups and cloud clusters refer to the same concept.
    @ConfField
    public static int cloud_cluster_check_interval_second = 10;

    @ConfField
    public static String cloud_sql_server_cluster_name = "RESERVED_CLUSTER_NAME_FOR_SQL_SERVER";

    @ConfField
    public static String cloud_sql_server_cluster_id = "RESERVED_CLUSTER_ID_FOR_SQL_SERVER";

    @ConfField
    public static int cloud_txn_tablet_batch_size = 50;

    /**
     * Default number of waiting copy jobs for the whole cluster
     */
    @ConfField(mutable = true)
    public static int cluster_max_waiting_copy_jobs = 100;

    /**
     * Default number of max file num for per copy into job
     */
    @ConfField(mutable = true)
    public static int max_file_num_per_copy_into_job = 50;

    /**
     * Default number of max meta size for per copy into job
     */
    @ConfField(mutable = true)
    public static int max_meta_size_per_copy_into_job = 51200;

    // 0 means no limit
    @ConfField(mutable = true)
    public static int cloud_max_copy_job_per_table = 10000;

    @ConfField(mutable = true)
    public static int cloud_filter_copy_file_num_limit = 100;

    @ConfField(mutable = true, masterOnly = true)
    public static boolean cloud_delete_loaded_internal_stage_files = false;

    @ConfField(mutable = false)
    public static int cloud_copy_txn_conflict_error_retry_num = 5;

    @ConfField(mutable = false)
    public static int cloud_copy_into_statement_submitter_threads_num = 64;

    @ConfField
    public static int drop_user_notify_ms_max_times = 86400;

    @ConfField(mutable = true, masterOnly = true)
    public static long cloud_tablet_rebalancer_interval_second = 1;

    @ConfField(mutable = true, masterOnly = true)
    public static boolean enable_cloud_partition_balance = true;

    @ConfField(mutable = true, masterOnly = true)
    public static boolean enable_cloud_table_balance = true;

    @ConfField(mutable = true, masterOnly = true)
    public static boolean enable_cloud_global_balance = true;

    @ConfField(mutable = true, masterOnly = true)
    public static int cloud_pre_heating_time_limit_sec = 300;

    @ConfField(mutable = true, masterOnly = true)
    public static double cloud_rebalance_percent_threshold = 0.05;

    @ConfField(mutable = true, masterOnly = true)
    public static long cloud_rebalance_number_threshold = 2;

    @ConfField(mutable = true, masterOnly = true)
    public static double cloud_balance_tablet_percent_per_run = 0.05;

    @ConfField(mutable = true, masterOnly = true, description = {"��������������������������������� Compute group ���������������������������"
            + "without_warmup: ������������ tablet ��������������������������� S3 ���������������������������������������������"
            + "async_warmup: ��������������������������������� cache������������������������ cache miss���"
            + "sync_warmup: ��������������������� cache ��������������������������������� cache miss���"
            + "peer_read_async_warmup: ������������ tablet ��������������������������� Peer BE ��������������������������������������������������������� BE ���������"
            + "��������������������� FE ��������������������� SQL���ALTER COMPUTE GROUP cg PROPERTIES���"
            + "������ compute group ��������� balance ���������compute group ���������������������������",
        "Specify the scaling and warming methods for all Compute groups in a cloud mode. "
            + "without_warmup: Directly modify shard mapping, first read from S3,"
            + "fastest re-balance but largest fluctuation; "
            + "async_warmup: Asynchronous warmup, best-effort cache pulling, "
            + "faster re-balance but possible cache miss; "
            + "sync_warmup: Synchronous warmup, ensure cache migration completion, "
            + "slower re-balance but no cache miss; "
            + "peer_read_async_warmup: Directly modify shard mapping, first read from Peer BE, "
            + "fastest re-balance but may affect other BEs in the same compute group performance. "
            + "Note: This is a global FE configuration, you can also use SQL (ALTER COMPUTE GROUP cg PROPERTIES) "
            + "to set balance type at compute group level, compute group level configuration has higher priority"},
            options = {"without_warmup", "async_warmup", "sync_warmup", "peer_read_async_warmup"})
    public static String cloud_warm_up_for_rebalance_type = "async_warmup";

    @ConfField(mutable = true, masterOnly = true, description = {"���������������������tablet������������"
            + "���������host������������������������tablet���������������10", "The max number of tablets per host "
            + "when batching warm-up requests during tablet rebalancing in "
            + "compute-storage separation mode, default 10"})
    public static int cloud_warm_up_batch_size = 10;

    @ConfField(mutable = true, masterOnly = true, description = {"���������������������tablet������������"
            + "������������������������������������������������������50ms", "Maximum wait time in milliseconds before a "
            + "pending warm-up batch is flushed, default 50ms"})
    public static int cloud_warm_up_batch_flush_interval_ms = 50;

    @ConfField(mutable = true, masterOnly = true, description = {"���������������������tablet������������rpc������������������������������4",
        "Thread pool size for asynchronous warm-up RPC dispatch during tablet "
            + "rebalancing in compute-storage separation mode, default 4"})
    public static int cloud_warm_up_rpc_async_pool_size = 4;

    @ConfField(masterOnly = true, description = {"���������������������tablet������������������������������tablet���������������������������������"
            + "When tablets are being balanced in compute-storage separation mode, "
            + "is the active tablet priority scheduling strategy enabled?  (Default: Enabled)"})
    public static boolean enable_cloud_active_tablet_priority_scheduling = false;

    @ConfField(masterOnly = true, description = {"������������������tablet���������������������������������������������",
            "Whether to enable active tablet sliding window access statistics feature, default true"})
    public static boolean enable_active_tablet_sliding_window_access_stats = false;

    @ConfField(mutable = true, masterOnly = true, description = {"������tablet���������������������������������������������������������������3600������1���������",
            "Time window size in seconds for active tablet sliding window access statistics, "
                + "default 3600 seconds (1 hour)"})
    public static long active_tablet_sliding_window_time_window_second = 3600L;

    @ConfField(mutable = true, masterOnly = true, description = {
            "������ tablet ������������������������partition ������������������������ TopN ��������� partition���"
                    + "��������������������� partition������������ partition��������������� internal db��������� 10000���<=0 ������������ TopN ���������",
            "When active tablet priority scheduling is enabled: partition-level scheduling processes TopN active "
                    + "partitions first, then other active partitions,"
                    + "then inactive partitions, and internal db at last. "
                    + "Default 10000. <=0 disables TopN segmentation."})
    public static int cloud_active_partition_scheduling_topn = 10000;

    @ConfField(mutable = true, masterOnly = false)
    public static String security_checker_class_name = "";

    @ConfField(mutable = true)
    public static int mow_calculate_delete_bitmap_retry_times = 10;

    @ConfField(mutable = true, description = {"������ S3 Load endpoint ���������������������s3_load_endpoint_white_list=a,b,c",
            "the white list for the s3 load endpoint, if it is empty, no white list will be set,"
            + "for example: s3_load_endpoint_white_list=a,b,c"})
    public static String[] s3_load_endpoint_white_list = {};

    @ConfField(mutable = true, description = {
            "������������������ S3 ������������������������ *, ?������������ HEAD ������������ ListObjects ��������������� ListBucket ���������"
            + "��������������� {1,2,3} ��������������������������� [abc] ���������������������������"
            + "��������������� GetObject ������������������������������������������������������������ false ������������������������",
            "For deterministic S3 paths (without wildcards like *, ?), use HEAD requests instead of "
            + "ListObjects to avoid requiring ListBucket permission. Brace patterns {1,2,3} and "
            + "non-negated bracket patterns [abc] are expanded to concrete paths. This is useful when only "
            + "GetObject permission is granted. Set to false to fall back to the original listing behavior."
    })
    public static boolean s3_skip_list_for_deterministic_path = true;

    @ConfField(mutable = true, description = {
            "��������� HEAD ������������ ListObjects ���������������������������������������������������������������������������������"
            + "������������������ ListObjects������������������������ {1..100}/{1..100} ������������������������ HEAD ���������",
            "Maximum number of expanded paths when using HEAD requests instead of ListObjects. "
            + "If the expanded path count exceeds this limit, falls back to ListObjects. "
            + "This prevents patterns like {1..100}/{1..100} from triggering too many HEAD requests."
    })
    public static int s3_head_request_max_paths = 100;

    @ConfField(mutable = true, description = {
            "������ Azure endpoint ������������������������������ blob ��� dfs������������������������������������"
                    + "������������ .blob.core.windows.net,.dfs.core.windows.net,"
                    + ".blob.core.chinacloudapi.cn,.dfs.core.chinacloudapi.cn,"
                    + ".blob.core.usgovcloudapi.net,.dfs.core.usgovcloudapi.net,"
                    + ".blob.core.cloudapi.de,.dfs.core.cloudapi.de���",
            "The host suffix whitelist for Azure endpoints (both blob and dfs), separated by commas. "
                    + "The default value is .blob.core.windows.net,.dfs.core.windows.net,"
                    + ".blob.core.chinacloudapi.cn,.dfs.core.chinacloudapi.cn,"
                    + ".blob.core.usgovcloudapi.net,.dfs.core.usgovcloudapi.net,"
                    + ".blob.core.cloudapi.de,.dfs.core.cloudapi.de."
    })
    public static String[] azure_blob_host_suffixes = {
            ".blob.core.windows.net",
            ".dfs.core.windows.net",
            ".blob.core.chinacloudapi.cn",
            ".dfs.core.chinacloudapi.cn",
            ".blob.core.usgovcloudapi.net",
            ".dfs.core.usgovcloudapi.net",
            ".blob.core.cloudapi.de",
            ".dfs.core.cloudapi.de"
    };

    @ConfField(mutable = true, description = {"������ Jdbc driver url ���������������������jdbc_driver_url_white_list=a,b,c",
            "the white list for jdbc driver url, if it is empty, no white list will be set"
            + "for example: jdbc_driver_url_white_list=a,b,c"
    })
    public static String[] jdbc_driver_url_white_list = {};

    @ConfField(description = {"Stream_Load ������������label ������������������������",
            "Stream_Load When importing, the maximum length of label is limited"})
    public static int label_regex_length = 128;

    @ConfField(mutable = true, masterOnly = true)
    public static int history_cloud_warm_up_job_keep_max_second = 7 * 24 * 3600;

    @ConfField(mutable = true, masterOnly = true)
    public static int max_active_cloud_warm_up_job = 10;

    @ConfField(mutable = true, masterOnly = true)
    public static int cloud_warm_up_timeout_second = 86400 * 30; // 30 days

    @ConfField(mutable = true, masterOnly = true)
    public static int cloud_warm_up_job_scheduler_interval_millisecond = 1000; // 1 seconds

    @ConfField(mutable = true, masterOnly = true)
    public static long cloud_warm_up_job_max_bytes_per_batch = 21474836480L; // 20GB

    @ConfField(mutable = true, masterOnly = true)
    public static boolean cloud_warm_up_force_all_partitions = false;

    @ConfField(mutable = true, masterOnly = true)
    public static boolean enable_fetch_cluster_cache_hotspot = true;

    @ConfField(mutable = true)
    public static long fetch_cluster_cache_hotspot_interval_ms = 3600000;
    // to control the max num of values inserted into cache hotspot internal table
    // insert into cache table when the size of batch values reaches this limit
    @ConfField(mutable = true)
    public static long batch_insert_cluster_cache_hotspot_num = 5000;

    /**
     * intervals between be status checks for CloudUpgradeMgr
     */
    @ConfField(mutable = true)
    public static int cloud_upgrade_mgr_interval_second = 15;

    @ConfField(mutable = true)
    public static boolean enable_cloud_running_txn_check = true;

    //* audit_event_log_queue_size = qps * query_audit_log_timeout_ms
    @ConfField(mutable = true)
    public static int audit_event_log_queue_size = 250000;

    @ConfField(description = {"���������������������������������������������������������������",
            "Max size of lineage event queue��� events will be discarded when exceeded"})
    public static int lineage_event_queue_size = 50000;

    @ConfField(mutable = true, description = {
            "streamload ������������������������������������������ public-private/public/private/direct/random-be/���",
            "streamload route policy, available options are "
            + "public-private/public/private/direct/random-be and empty string" })
    public static String streamload_redirect_policy = "";

    @ConfField(mutable = true, description = {
            "��������������������������������� group commit ��� streamload BE ���������������"
                    + "������ LB ������������������ group commit ������������������������������ BE ������������������������������������������ BE ���������",
            "Whether to enable group commit streamload BE forward feature in cloud mode. "
                    + "Solves the issue where LB random forwarding breaks group commit batching "
                    + "by implementing BE-level forwarding to ensure same-table requests reach the same BE node." })
    public static boolean enable_group_commit_streamload_be_forward = false;

    @ConfField(description = {"��������������������������������������������� recycler key, ������ true",
        "create table in cloud mode, check recycler key remained, default true"})
    public static boolean check_create_table_recycle_key_remained = true;

    @ConfField(mutable = true, description = {"��������������������� fe ��� ms ��������������������������������� 60s"})
    public static int delete_bitmap_lock_expiration_seconds = 60;

    @ConfField(mutable = true, description = {"��������������������� calculate delete bitmap task ��������������������� 60s"})
    public static int calculate_delete_bitmap_task_timeout_seconds = 60;

    @ConfField(mutable = true, description = {"��������������������������������� calculate delete bitmap task ��������������������� 300s"})
    public static int calculate_delete_bitmap_task_timeout_seconds_for_transaction_load = 300;

    @ConfField(mutable = true, description = {"��������������������� commit ��������������������������������� 5s"})
    public static int try_commit_lock_timeout_seconds = 5;

    @ConfField(mutable = true, description = {"��������������������������������������������������������������� true ���������������������������������������"
            + "��������� false ������������ Merge-On-Write ��������������������������������� true���",
            "Whether to enable commit lock for all tables during transaction commit."
            + "If true, commit lock will be applied to all tables."
            + "If false, commit lock will only be applied to Merge-On-Write tables."
            + "Default value is true." })
    public static boolean enable_commit_lock_for_all_tables = true;

    @ConfField(mutable = true, description = {"��������������������������������������������������������� true"})
    public static boolean enable_cloud_txn_lazy_commit = true;

    @ConfField(mutable = true, masterOnly = true,
            description = {"��������������������������� tablet ��������� be ��������������������������� tablet ��������� be ������������ false"})
    public static boolean enable_immediate_be_assign = false;

    @ConfField(mutable = true, masterOnly = false,
            description = { "������������������������������ BE ������������������������������ tablet ��������������������� BE ���" })
    public static int rehash_tablet_after_be_dead_seconds = 3600;

    @ConfField(mutable = true, description = {"������������������������������������������������������������ true",
        "Whether to enable the automatic start-stop feature in cloud model, default is true."})
    public static boolean enable_auto_start_for_cloud_cluster = true;

    @ConfField(mutable = true, description = {"��������������������������������������� cluster ��������������������������������� 300 ��������� 5 ������",
        "The automatic start-stop wait time for cluster wake-up backoff retry count in the cloud "
            + "model is set to 300 times, which is approximately 5 minutes by default."})
    public static int auto_start_wait_to_resume_times = 300;

    @ConfField(description = {"Get tablet stat task ���������������������",
        "Maximal concurrent num of get tablet stat job."})
    public static int max_get_tablet_stat_task_threads_num = 4;

    @ConfField(description = {
            "Maximal concurrent num of master FE sync tablet stats task to observers and followers in cloud mode."})
    public static int cloud_sync_tablet_stats_task_threads_num = 4;

    @ConfField(mutable = true, description = {"Version of getting tablet stats in cloud mode. "
            + "Version 1: get all tablets; Version 2: get active and interval expired tablets"})
    public static int cloud_get_tablet_stats_version = 2;

    @ConfField(description = {"��������������������������� table ��� partition version ���������. ������ frontend ������������",
            "Cloud table and partition version syncer interval. All frontends will perform the checking"})
    public static int cloud_version_syncer_interval_second = 20;

    @ConfField(mutable = true, description = {"��������������������������������������� table ��� partition version ���������",
            "Whether to enable the function of syncing table and partition version in cloud mode"})
    public static boolean cloud_enable_version_syncer = true;

    @ConfField(description = {"Get version task ������������", "Concurrent num of get version task."})
    public static int cloud_get_version_task_threads_num = 4;

    @ConfField(description = {"Master FE ��������������� FE sync version task ������������������",
            "Maximal concurrent num of sync version task between Master FE and other FEs."})
    public static int cloud_sync_version_task_threads_num = 4;

    @ConfField(mutable = true, description = {"Get version task ��������� table ��� partition ��������� batch size",
            "Maximal table or partition batch size of get version task."})
    public static int cloud_get_version_task_batch_size = 2000;

    @ConfField(mutable = true, description = {"schema change job ������������������",
            "Whether to enable retry when a schema change job fails, default is true."})
    public static boolean enable_schema_change_retry = true;

    @ConfField(mutable = true, description = {"schema change job ������������",
            "Max retry times when a schema change job fails, default is 3."})
    public static int schema_change_max_retry_time = 3;

    @ConfField(mutable = true, description = {"������������������ ShowCacheHotSpotStmt ������",
            "Whether to enable the use of ShowCacheHotSpotStmt, default is false."})
    public static boolean enable_show_file_cache_hotspot_stmt = false;

    @ConfField(mutable = true, description = {"��������������������� FE ������ meta service ������������������������ 30000ms",
            "Request timeout for FE connecting to meta service in cloud mode, default is 30000ms."})
    public static int meta_service_brpc_timeout_ms = 30000;

    @ConfField(mutable = true, description = {"��������������������� FE ������ meta service ������������������������ 500ms",
            "Connection timeout for FE connecting to meta service in cloud mode., default is 500ms."})
    public static int meta_service_brpc_connect_timeout_ms = 500;

    @ConfField(mutable = true, description = {"��������������������� FE ������ meta service ������������������������������ 1 ���",
            "In cloud mode, the retry number when the FE requests the meta service times out is 1 by default"})
    public static int meta_service_rpc_timeout_retry_times = 1;

    @ConfField(mutable = true, description = {"���������������������������������������������������������������������������������������������������"
            + "������������������������������������������������������������������������"
            + "���������auto_start_ignore_db_names=__internal_schema, information_schema",
            "In the cloud mode, the automatic start and stop ignores the DB name of the internal job,"
            + "used for databases involved in internal jobs, such as those used for statistics, "
            + "For example: auto_start_ignore_db_names=__internal_schema, information_schema"
            })
    public static String[] auto_start_ignore_resume_db_names = {"__internal_schema", "information_schema"};

    @ConfField(mutable = true, masterOnly = true)
    public static boolean enable_mow_load_force_take_ms_lock = true;

    @ConfField(mutable = true, masterOnly = true)
    public static long mow_load_force_take_ms_lock_threshold_ms = 500;

    @ConfField(mutable = true, masterOnly = true)
    public static long mow_get_ms_lock_retry_backoff_base = 20;

    @ConfField(mutable = true, masterOnly = true)
    public static long mow_get_ms_lock_retry_backoff_interval = 80;

    @ConfField(mutable = true, masterOnly = true)
    public static boolean enable_notify_be_after_load_txn_commit = false;

    // ATTN: DONOT add any config not related to cloud mode here
    // ATTN: DONOT add any config not related to cloud mode here
    // ATTN: DONOT add any config not related to cloud mode here
    //==========================================================================
    //                      end of cloud config
    //==========================================================================
    //==========================================================================
    //                      start of lock config
    @ConfField(description = {"������������������������",
            "Whether to enable deadlock detection"})
    public static boolean enable_deadlock_detection = true;

    @ConfField(description = {"���������������������������������������",
            "Deadlock detection interval time, unit minute"})
    public static long deadlock_detection_interval_minute = 5;

    @ConfField(mutable = true, description = {"������������������������������������������������������������������������������",
            "Maximum lock hold time; logs a warning if exceeded"})
    public static long max_lock_hold_threshold_seconds = 10;

    @ConfField(mutable = true, description = {"���������������������������������������",
        "Is metadata synchronization enabled in safe mode"})
    public static boolean meta_helper_security_mode = false;

    @ConfField(description = {"���������������������������������������",
            "Interval checking if resource is ready"})
    public static long resource_not_ready_sleep_seconds = 5;

    @ConfField(mutable = true, description = {
            "��������� true��������������������������������������������������������������� tablet ������������������������������"})
    public static boolean sql_block_rule_ignore_admin = false;

    @ConfField(description = {"������������������",
            "Authentication plugin directory"})
    public static String authentication_plugins_dir = EnvUtils.getDorisHome() + "/plugins/authentication";

    @ConfField(description = {"������������������",
            "Authorization plugin directory"})
    public static String authorization_plugins_dir = EnvUtils.getDorisHome() + "/plugins/authorization";

    @ConfField(description = {"������������������������",
            "Security plugin directory"})
    public static String security_plugins_dir = EnvUtils.getDorisHome() + "/plugins/security";

    @ConfField(description = {
            "��������������������������������������� DORIS_HOME ��������������� conf/authorization.conf",
            "Authorization plugin configuration file path, need to be in DORIS_HOME,"
                    + "default is conf/authorization.conf"})
    public static String authorization_config_file_path = "/conf/authorization.conf";

    @ConfField(description = {
            "��������������������������������������� DORIS_HOME ��������������� conf/authentication.conf",
            "Authentication plugin configuration file path, need to be in DORIS_HOME,"
                    + "default is conf/authentication.conf"})
    public static String authentication_config_file_path = "/conf/authentication.conf";

    @ConfField(description = {"��������������������������������������� forward ��� master ��������� forward query ���������",
            "For testing purposes, all queries are forcibly forwarded to the master to verify"
                    + "the behavior of forwarding queries."})
    public static boolean force_forward_all_queries = false;

    @ConfField(description = {"������������������ SQL��������������� AST ��� class simple name ������ (������ CreateRepositoryStmt,"
            + "CreatePolicyCommand)���������������������",
            "For disabling certain SQL queries, the configuration item is a list of simple class names of AST"
                    + "(for example CreateRepositoryStmt, CreatePolicyCommand), separated by commas."})
    public static String block_sql_ast_names = "";

    public static long meta_service_rpc_reconnect_interval_ms = 100;

    public static long meta_service_rpc_retry_cnt = 10;

    @ConfField(mutable = true, masterOnly = true, description = {"������������ variant ������������������������������������ v1",
            "Whether to allow the use of inverted index v1 for variant"})
    public static boolean enable_inverted_index_v1_for_variant = false;

    @ConfField(mutable = true, description = {"Prometheus ������������������������������������",
            "Prometheus output table dimension metric count limit"})
    public static int prom_output_table_metrics_limit = 10000;


    @ConfField(mutable = true, masterOnly = true)
    public static long create_partition_wait_seconds = 300;

    @ConfField(mutable = true, description = {
        "KMS ������������ ID������������������������������������",
        "The ID of the master key in KMS, used for generating and encrypting data keys"
    })
    public static String doris_tde_key_id = "";

    @ConfField(mutable = true, description = {
        "KMS ������������������������endpoint��������������������������� region ������",
        "The endpoint of the KMS service, should match the region of the key"
    })
    public static String doris_tde_key_endpoint = "";

    @ConfField(mutable = true, description = {
        "KMS ������������������������������ SDK ������������������������",
        "The region where the KMS key is located, used for SDK configuration"
    })
    public static String doris_tde_key_region = "";

    @ConfField(mutable = true, description = {
        "TDE��������������������������������������������������������� aws_kms",
        "The key provider for TDE (Transparent Data Encryption), currently supports aws_kms"
    })
    public static String doris_tde_key_provider = "";

    @ConfField(mutable = true, description = {
        "��������������������������������������� AES256������������������������ KMS ������������",
        "The encryption algorithm used for data, default is AES256, may be set to empty later for KMS to decide"
    })
    public static String doris_tde_algorithm = "PLAINTEXT";

    @ConfField(mutable = true, description = {
            "������������������ rotate master key ������������������������������������������������������������",
            "The time interval for automatic rotation of the master key in data encryption, in milliseconds."
                    + "The default interval is one month."
    })
    public static long doris_tde_rotate_master_key_interval_ms = 30 * 24 * 3600 * 1000L;

    @ConfField(mutable = true, description = {
            "��������������������������� rotate ������������������������������������������������������������",
            "Data encryption checks whether to rotate the time interval in milliseconds, "
                    + "and the default interval is five minutes."
    })
    public static long doris_tde_check_rotate_master_key_interval_ms = 5 * 60 * 1000L;

    @ConfField(mutable = true, description = {
        "��������������������������������������������������������������������� 256 ������",
        "The maximum length of the first row error message when data quality error occurs, default is 256 bytes"
    })
    public static int first_error_msg_max_length = 256;

    @ConfField(mutable = false, description = {
        "Whether to enable file cache admission control(Blocklist and Allowlist)"
    })
    public static boolean enable_file_cache_admission_control = false;

    @ConfField(mutable = false, description = {
        "Directory path for storing admission rules JSON files"
    })
    public static String file_cache_admission_control_json_dir = "";

    @ConfField
    public static String cloud_snapshot_handler_class = "org.apache.doris.cloud.snapshot.CloudSnapshotHandler";
    @ConfField
    public static int cloud_snapshot_handler_interval_second = 3600;
    @ConfField(mutable = true)
    public static long cloud_snapshot_timeout_seconds = 600;
    @ConfField(mutable = true)
    public static long cloud_auto_snapshot_max_reversed_num = 35;
    @ConfField(mutable = true)
    public static long cloud_auto_snapshot_min_interval_seconds = 3600;

    @ConfField(mutable = true, description = {
            "cluster snapshot ������������������������������������������������'root'������ root ��������������������� 'admin'���ADMIN ��������������������������������������� 'root'���",
            "The minimum privilege required for cluster snapshot operations. "
                    + "Valid values: 'root' (only root user can execute)"
                    + " or 'admin' (users with ADMIN privilege can execute). "
                    + "Default is 'root'."})
    public static String cluster_snapshot_min_privilege = "root";

    @ConfField(mutable = true)
    public static long multi_part_upload_part_size_in_bytes = 256 * 1024 * 1024L; // 256MB
    @ConfField(mutable = true)
    public static int multi_part_upload_max_seconds = 3600; // 1 hour
    @ConfField(mutable = true)
    public static int multi_part_upload_pool_size = 10;

    @ConfField(mutable = true)
    public static String aws_credentials_provider_version = "v2";

    @ConfField(mutable = true, description = {
            "��������������������������������� FILE_CACHE ������������������������������ 1 ��� 100������100������������������������ FILE_CACHE",
            "The upper limit of FILE_CACHE percent that a single query of a user can use, (range: 1 to 100).",
            "100 indicate that the full FILE_CACHE capacity can be used. "
    })
    public static int file_cache_query_limit_max_percent = 100;

    @ConfField(description = {
            "AWS SDK ������������������������������������������������������������������������������������������������",
            "The thread pool size used by the AWS SDK to schedule asynchronous retries, timeout tasks, "
                    + "and other background operations, shared globally"
    })
    public static int aws_sdk_async_scheduler_thread_pool_size = 20;

    @ConfField(description = {
            "agent tasks ������������������������������������������������������������0���������������������",
            "agent tasks health check interval, default is five minutes, no health check when less than or equal to 0"
    })
    public static long agent_task_health_check_intervals_ms = 5 * 60 * 1000L; // 5 min
    @ConfField(description = {
            "��������� catalog ������������������������ FE ��������� catalog ��������������������������������������� access controller ��������� "
                    + "catalog ��� SHOW/SELECT ��������������� catalog��������������������� access controller ��� catalog���"
                    + "������ CREATE/LOAD/ALTER ���������������������������������������",
            "Whether to skip the FE internal catalog privilege check in catalog-level privilege validation. "
                    + "This only applies to SHOW/SELECT on external catalogs with a custom access controller. "
                    + "Internal catalogs, catalogs without a custom access controller, and other privileges such "
                    + "as CREATE/LOAD/ALTER are still validated by the default logic"
    })
    public static boolean skip_catalog_priv_check = false;

    @ConfField(mutable = true, description = {
            "���������������������������������������������������������������������������������������������������",
            "In the compute-storage separation mode, whether to obtain partition version information in batches when "
                    + "calculating the delete bitmap, which is enabled by default"
    })
    public static boolean calc_delete_bitmap_get_versions_in_batch = true;

    @ConfField(mutable = true, description = {
            "������������������������������������������������������������������������������������������������������������������������������",
            "In the compute-storage separation mode, whether to wait for pending transactions to complete before "
                    + "obtaining partition version information when calculating the delete bitmap, which is enabled "
                    + "by default"
    })
    public static boolean calc_delete_bitmap_get_versions_waiting_for_pending_txns = true;
}