// 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.

#include "common/global-flags.h"

#include "common/version.h"
#include "gen-cpp/BackendGflags_types.h"
#include "gutil/strings/substitute.h"
#include "kudu/util/flag_tags.h"
#include "rpc/jni-thrift-util.h"
#include "util/backend-gflag-util.h"
#include "util/logging-support.h"
#include "util/os-util.h"


// Configs for the Frontend and the Catalog.
DECLARE_bool(load_catalog_in_background);
DECLARE_bool(load_auth_to_local_rules);
DECLARE_bool(enable_stats_extrapolation);
DECLARE_bool(use_local_catalog);
DECLARE_int32(local_catalog_cache_expiration_s);
DECLARE_int32(local_catalog_cache_mb);
DECLARE_int32(local_catalog_cache_concurrency_level);
DECLARE_int32(non_impala_java_vlog);
DECLARE_int32(num_metadata_loading_threads);
DECLARE_int32(max_hdfs_partitions_parallel_load);
DECLARE_int32(max_nonhdfs_partitions_parallel_load);
DECLARE_int32(initial_hms_cnxn_timeout_s);
DECLARE_int32(kudu_operation_timeout_ms);
DECLARE_int64(inc_stats_size_limit_bytes);
DECLARE_string(principal);
DECLARE_string(lineage_event_log_dir);
DECLARE_string(principal);
DECLARE_string(local_library_dir);
DECLARE_string(server_name);
DECLARE_string(authorized_proxy_group_config);
DECLARE_bool(enable_shell_based_groups_mapping_support);
DECLARE_string(catalog_topic_mode);
DECLARE_string(kudu_master_hosts);
DECLARE_bool(enable_kudu_impala_hms_check);
DECLARE_string(reserved_words_version);
DECLARE_double(max_filter_error_rate);
DECLARE_int64(min_buffer_size);
DECLARE_bool(disable_catalog_data_ops_debug_only);
DECLARE_int32(invalidate_tables_timeout_s);
DECLARE_bool(invalidate_tables_on_memory_pressure);
DECLARE_double(invalidate_tables_gc_old_gen_full_threshold);
DECLARE_double(invalidate_tables_fraction_on_memory_pressure);
DECLARE_int32(local_catalog_max_fetch_retries);
DECLARE_int64(kudu_scanner_thread_estimated_bytes_per_column);
DECLARE_int64(kudu_scanner_thread_max_estimated_bytes);
DECLARE_int32(catalog_max_parallel_partial_fetch_rpc);
DECLARE_int64(catalog_partial_fetch_rpc_queue_timeout_s);
DECLARE_int64(exchg_node_buffer_size_bytes);
DECLARE_int32(kudu_mutation_buffer_size);
DECLARE_int32(kudu_error_buffer_size);
DECLARE_int32(hms_event_polling_interval_s);
DECLARE_bool(enable_insert_events);
DECLARE_string(authorization_factory_class);
DECLARE_string(ranger_service_type);
DECLARE_string(ranger_app_id);
DECLARE_string(authorization_provider);
DECLARE_bool(recursively_list_partitions);
DECLARE_string(query_event_hook_classes);
DECLARE_int32(query_event_hook_nthreads);
DECLARE_bool(is_executor);
DECLARE_bool(is_coordinator);
DECLARE_bool(use_dedicated_coordinator_estimates);
DECLARE_string(blacklisted_dbs);
DECLARE_bool(unlock_zorder_sort);
DECLARE_string(blacklisted_tables);
DECLARE_string(min_privilege_set_for_show_stmts);
DECLARE_int32(num_expected_executors);
DECLARE_int32(num_check_authorization_threads);
DECLARE_bool(use_customized_user_groups_mapper_for_ranger);
DECLARE_bool(compact_catalog_topic);
DECLARE_bool(enable_incremental_metadata_updates);
DECLARE_int64(topic_update_tbl_max_wait_time_ms);
DECLARE_int32(catalog_max_lock_skipped_topic_updates);
DECLARE_string(scratch_dirs);
DECLARE_int32(max_wait_time_for_sync_ddl_s);
DECLARE_bool(start_hms_server);
DECLARE_int32(hms_port);
DECLARE_bool(fallback_to_hms_on_errors);
DECLARE_bool(enable_catalogd_hms_cache);
DECLARE_string(kudu_sasl_protocol_name);
DECLARE_bool(invalidate_hms_cache_on_ddls);
DECLARE_bool(hms_event_incremental_refresh_transactional_table);
DECLARE_bool(auto_check_compaction);
DECLARE_bool(enable_sync_to_latest_event_on_ddls);
DECLARE_bool(pull_table_types_and_comments);
DECLARE_bool(enable_reload_events);
DECLARE_string(geospatial_library);
DECLARE_int32(thrift_rpc_max_message_size);
DECLARE_string(file_metadata_reload_properties);
DECLARE_string(java_weigher);
DECLARE_int32(iceberg_reload_new_files_threshold);
DECLARE_bool(enable_skipping_older_events);
DECLARE_bool(enable_json_scanner);
DECLARE_bool(iceberg_allow_datafiles_in_table_location_only);
DECLARE_int32(catalog_operation_log_size);
DECLARE_string(hostname);
DECLARE_bool(allow_catalog_cache_op_from_masked_users);
DECLARE_int32(topic_update_log_gc_frequency);
DECLARE_string(debug_actions);

// HS2 SAML2.0 configuration
// Defined here because TAG_FLAG caused issues in global-flags.cc
DEFINE_string(saml2_keystore_path, "",
    "Keystore path to the saml2 client. This keystore is used to store the "
    "key pair used to sign the authentication requests when saml2_sign_requests "
    "is set to true. If the path doesn't exist, HiveServer2 will attempt to "
    "create a keystore using the default configurations otherwise it will use "
    "the one provided. Setting this is required for SAML authentication.");

DEFINE_string(saml2_keystore_password_cmd, "",
    "Command that outputs the password to the keystore used to sign the authentication "
    "requests. Setting this is required for SAML authentication.");
TAG_FLAG(saml2_keystore_password_cmd, sensitive);

DEFINE_string(saml2_private_key_password_cmd, "",
    "Command that outputs the password for the private key which is stored in the "
    "keystore pointed by saml2_keystore_path. This key is used to sign the "
    "authentication request if saml2_sign_requests is set to true.");
TAG_FLAG(saml2_private_key_password_cmd, sensitive);

DEFINE_string(saml2_idp_metadata, "",
    "IDP metadata file for the SAML configuration. This metadata file must be "
    "exported from the external identity provider. This is used to validate the SAML "
    "assertions received. Setting this is required for SAML authentication");

DEFINE_string(saml2_sp_entity_id, "",
    "Service provider entity id for this impalad. This must match with the "
    "SP id on the external identity provider. If this is not set, saml2_sp_callback_url "
    "will be used as the SP id.");

DEFINE_string(saml2_sp_callback_url, "",
    "Callback URL where SAML responses should be posted. Currently this must be "
    "configured at the same port number as the --hs2_http_port flag.");

DEFINE_bool(saml2_want_assertations_signed, true,
    "When this configuration is set to true, Impala will validate the signature "
    "of the assertions received at the callback url. 'False' should be only used "
    "for testing as it makes the protocol unsecure.");

DEFINE_bool(saml2_sign_requests, false,
    "When this configuration is set to true, Impala will sign the SAML requests "
    "which can be validated by the IDP provider.");

DEFINE_int32(saml2_callback_token_ttl, 30000,
    "Time (in milliseconds) for which the token issued by service provider is valid.");

DEFINE_string(saml2_group_attribute_name, "",
    "The attribute name in the SAML assertion which would "
    "be used to compare for the group name matching. By default it is empty "
    "which would allow any authenticated user. If this value is set then "
    "saml2_group_filter must be set to a non-empty value.");

DEFINE_string(saml2_group_filter, "",
    "Comma separated list of group names which will be allowed when SAML "
    "authentication is enabled.");

DEFINE_bool_hidden(saml2_ee_test_mode, false,
    "If true, no signature is checked and bearer token validation returns "
    "401 Unauthorized to allow checking cookies dealing with Thrift protocol. "
    "Should be only used in test environments." );

DEFINE_bool(enable_column_masking, true,
    "If false, disable the column masking feature. Defaults to be true.");

DEFINE_bool(enable_row_filtering, true,
    "If false, disable the row filtering feature. Defaults to be true. Enabling this flag"
    " requires enable_column_masking to be true.");

DEFINE_bool(allow_ordinals_in_having, false,
    "If true, allow using ordinals in HAVING clause. This non-standard feature is "
    "supported in Impala 3.x and earlier. We intend to disable it since 4.0. So it "
    "defaults to be false. See IMPALA-7844.");

DEFINE_int32(warn_catalog_response_size_mb, 50,
    "Threshold in MB to log a warning for large catalogd response size.");

DEFINE_int32(warn_catalog_response_duration_s, 60,
    "Threshold in seconds to log a warning for slow catalogd response.");

DEFINE_string(startup_filesystem_check_directories, "/",
    "Comma separated list of directories to list on startup to verify access to the "
    "filesystem. The default is to list the root of the filesytem. This can be "
    "specified to a subdirectory to avoid accesses to the root of the filesystem. "
    "To disable the startup check, specify the empty string.");

DEFINE_bool(use_hms_column_order_for_hbase_tables, false,
    "Use the column order in HMS for HBase tables instead of ordering the columns by "
    "family/qualifier. Keeping the default as false for backward compatibility.");

DEFINE_string(ignored_dir_prefix_list, ".,_tmp.,_spark_metadata",
    "Comma separated list to specify the prefix for tmp/staging dirs that catalogd should"
    " skip in loading file metadata.");

DEFINE_double_hidden(query_cpu_count_divisor, 1.0,
    "(Deprecated) this is now deprecated in favor of query option with the same name. "
    "(Advance) Divide the CPU requirement of a query to fit the total available CPU in "
    "the executor group. For example, setting value 2 will fit the query with CPU "
    "requirement 2X to an executor group with total available CPU X. Note that setting "
    "with a fractional value less than 1 effectively multiplies the query CPU "
    "requirement. A valid value is > 0.0. The default value is 1.");

// TODO: Tune the individual expression cost from IMPALA-2805.
DEFINE_bool_hidden(processing_cost_use_equal_expr_weight, true,
    "(Advance) If true, all expression evaluations are weighted equally to 1 during the "
    "plan node's processing cost calculation. If false, expression cost from IMPALA-2805 "
    "will be used. Default to false.");

// TODO: Benchmark and tune this config with an optimal value.
DEFINE_int64_hidden(min_processing_per_thread, 10000000,
    "(Advance) Minimum processing load (in processing cost unit) that a fragment "
    "instance need to work on before planner consider increasing instance count. Used to "
    "adjust fragment instance count based on estimated workload rather than the MT_DOP "
    "setting. Setting this to high number will reduce parallelism of a fragment (more "
    "workload per fragment), while setting to low number will increase parallelism (less "
    "workload per fragment). Actual parallelism might still be constrained by the total "
    "number of cores in selected executor group, MT_DOP, or PROCESSING_COST_MIN_THREAD "
    "query option. Must be a positive integer. Default to 10M.");

// TODO: Benchmark and tune this config with an optimal value.
DEFINE_double_hidden(scan_range_cost_factor, 0.005,
    "(Advance) Cost factor associated with processing one scan range. Combined with "
    "min_processing_per_thread flag, this flag define the cost to process one scan range "
    "as (scan_range_cost_factor * min_processing_per_thread). Default to 0.005, which "
    "roughly means that one scan node instance will handle at most 200 scan ranges.");

DEFINE_bool_hidden(skip_resource_checking_on_last_executor_group_set, true,
    "(Advance) If true, memory and cpu resource checking will be skipped when a query "
    "is being planned against the last (largest) executor group set. Setting true will "
    "ensure that query will always get admitted into last executor group set if it does "
    "not fit in any other group set.");

DEFINE_double_hidden(max_filter_error_rate_from_full_scan, 0.9,
    "(Advance) Skip generating bloom runtime filter that is generated from "
    "a full build scan and has resulting error rate estimation that is higher than "
    "this value after filter size limit applied. This config may get ignored if "
    "target error rate is set with higher value through RUNTIME_FILTER_ERROR_RATE "
    "query option or max_filter_error_rate backend flag. Setting value less than 0 "
    "will disable this runtime filter reduction feature.");

using strings::Substitute;

namespace impala {

// Flag validation
// ------------------------------------------------------------
static bool ValidateCpuCountDivisor(const char* flagname, double value) {
  if (0.0 < value) {
    return true;
  }
  LOG(ERROR) << Substitute(
      "$0 must be greater than 0.0, value $1 is invalid", flagname, value);
  return false;
}

static bool ValidateMinProcessingPerThread(const char* flagname, int64_t value) {
  if (0 < value) {
    return true;
  }
  LOG(ERROR) << Substitute(
      "$0 must be a positive integer, value $1 is invalid", flagname, value);
  return false;
}

DEFINE_validator(query_cpu_count_divisor, &ValidateCpuCountDivisor);
DEFINE_validator(min_processing_per_thread, &ValidateMinProcessingPerThread);

Status GetConfigFromCommand(const string& flag_cmd, string& result) {
  result.clear();
  if (flag_cmd.empty()) return Status::OK();
  if (!RunShellProcess(flag_cmd, &result, true, {"JAVA_TOOL_OPTIONS"})) {
    return Status(strings::Substitute("$0 failed with output: '$1'", flag_cmd, result));
  }
  return Status::OK();
}

Status PopulateThriftBackendGflags(TBackendGflags& cfg) {
  cfg.__set_load_catalog_in_background(FLAGS_load_catalog_in_background);
  cfg.__set_use_local_catalog(FLAGS_use_local_catalog);
  cfg.__set_local_catalog_cache_mb(FLAGS_local_catalog_cache_mb);
  cfg.__set_local_catalog_cache_expiration_s(
    FLAGS_local_catalog_cache_expiration_s);
  cfg.__set_local_catalog_cache_concurrency_level(
    FLAGS_local_catalog_cache_concurrency_level);
  cfg.__set_server_name(FLAGS_server_name);
  cfg.__set_kudu_master_hosts(FLAGS_kudu_master_hosts);
  cfg.__set_enable_kudu_impala_hms_check(FLAGS_enable_kudu_impala_hms_check);
  cfg.__set_read_size(FLAGS_read_size);
  cfg.__set_num_metadata_loading_threads(FLAGS_num_metadata_loading_threads);
  cfg.__set_max_hdfs_partitions_parallel_load(FLAGS_max_hdfs_partitions_parallel_load);
  cfg.__set_max_nonhdfs_partitions_parallel_load(
      FLAGS_max_nonhdfs_partitions_parallel_load);
  cfg.__set_initial_hms_cnxn_timeout_s(FLAGS_initial_hms_cnxn_timeout_s);
  // auth_to_local rules are read if --load_auth_to_local_rules is set to true
  // and impala is kerberized.
  cfg.__set_load_auth_to_local_rules(FLAGS_load_auth_to_local_rules);
  cfg.__set_principal(FLAGS_principal);
  cfg.__set_impala_log_lvl(FlagToTLogLevel(FLAGS_v));
  cfg.__set_non_impala_java_vlog(FlagToTLogLevel(FLAGS_non_impala_java_vlog));
  cfg.__set_inc_stats_size_limit_bytes(FLAGS_inc_stats_size_limit_bytes);
  cfg.__set_enable_stats_extrapolation(FLAGS_enable_stats_extrapolation);
  cfg.__set_lineage_event_log_dir(FLAGS_lineage_event_log_dir);
  cfg.__set_local_library_path(FLAGS_local_library_dir);
  cfg.__set_kudu_operation_timeout_ms(FLAGS_kudu_operation_timeout_ms);
  if (FLAGS_reserved_words_version == "2.11.0") {
    cfg.__set_reserved_words_version(TReservedWordsVersion::IMPALA_2_11);
  } else {
    DCHECK_EQ(FLAGS_reserved_words_version, "3.0.0");
    cfg.__set_reserved_words_version(TReservedWordsVersion::IMPALA_3_0);
  }
  cfg.__set_max_filter_error_rate(FLAGS_max_filter_error_rate);
  cfg.__set_min_buffer_size(FLAGS_min_buffer_size);
  cfg.__set_authorized_proxy_group_config(FLAGS_authorized_proxy_group_config);
  cfg.__set_enable_shell_based_groups_mapping_support(
      FLAGS_enable_shell_based_groups_mapping_support);
  cfg.__set_disable_catalog_data_ops_debug_only(
      FLAGS_disable_catalog_data_ops_debug_only);
  cfg.__set_catalog_topic_mode(FLAGS_catalog_topic_mode);
  cfg.__set_invalidate_tables_timeout_s(FLAGS_invalidate_tables_timeout_s);
  cfg.__set_invalidate_tables_on_memory_pressure(
      FLAGS_invalidate_tables_on_memory_pressure);
  cfg.__set_invalidate_tables_gc_old_gen_full_threshold(
      FLAGS_invalidate_tables_gc_old_gen_full_threshold);
  cfg.__set_invalidate_tables_fraction_on_memory_pressure(
      FLAGS_invalidate_tables_fraction_on_memory_pressure);
  cfg.__set_local_catalog_max_fetch_retries(FLAGS_local_catalog_max_fetch_retries);
  cfg.__set_kudu_scanner_thread_estimated_bytes_per_column(
      FLAGS_kudu_scanner_thread_estimated_bytes_per_column);
  cfg.__set_kudu_scanner_thread_max_estimated_bytes(
      FLAGS_kudu_scanner_thread_max_estimated_bytes);
  cfg.__set_catalog_max_parallel_partial_fetch_rpc(
      FLAGS_catalog_max_parallel_partial_fetch_rpc);
  cfg.__set_catalog_partial_fetch_rpc_queue_timeout_s(
      FLAGS_catalog_partial_fetch_rpc_queue_timeout_s);
  cfg.__set_exchg_node_buffer_size_bytes(
      FLAGS_exchg_node_buffer_size_bytes);
  cfg.__set_kudu_mutation_buffer_size(FLAGS_kudu_mutation_buffer_size);
  cfg.__set_kudu_error_buffer_size(FLAGS_kudu_error_buffer_size);
  cfg.__set_hms_event_polling_interval_s(FLAGS_hms_event_polling_interval_s);
  cfg.__set_enable_insert_events(FLAGS_enable_insert_events);
  cfg.__set_impala_build_version(::GetDaemonBuildVersion());
  cfg.__set_authorization_factory_class(FLAGS_authorization_factory_class);
  cfg.__set_ranger_service_type(FLAGS_ranger_service_type);
  cfg.__set_ranger_app_id(FLAGS_ranger_app_id);
  cfg.__set_authorization_provider(FLAGS_authorization_provider);
  cfg.__set_recursively_list_partitions(FLAGS_recursively_list_partitions);
  cfg.__set_query_event_hook_classes(FLAGS_query_event_hook_classes);
  cfg.__set_query_event_hook_nthreads(FLAGS_query_event_hook_nthreads);
  cfg.__set_is_executor(FLAGS_is_executor);
  cfg.__set_is_coordinator(FLAGS_is_coordinator);
  cfg.__set_use_dedicated_coordinator_estimates(
      FLAGS_use_dedicated_coordinator_estimates);
  cfg.__set_blacklisted_dbs(FLAGS_blacklisted_dbs);
  cfg.__set_unlock_zorder_sort(FLAGS_unlock_zorder_sort);
  cfg.__set_blacklisted_tables(FLAGS_blacklisted_tables);
  cfg.__set_min_privilege_set_for_show_stmts(FLAGS_min_privilege_set_for_show_stmts);
  cfg.__set_num_expected_executors(FLAGS_num_expected_executors);
  cfg.__set_num_check_authorization_threads(FLAGS_num_check_authorization_threads);
  cfg.__set_use_customized_user_groups_mapper_for_ranger(
      FLAGS_use_customized_user_groups_mapper_for_ranger);
  cfg.__set_enable_column_masking(FLAGS_enable_column_masking);
  cfg.__set_enable_row_filtering(FLAGS_enable_row_filtering);
  cfg.__set_compact_catalog_topic(FLAGS_compact_catalog_topic);
  cfg.__set_enable_incremental_metadata_updates(
      FLAGS_enable_incremental_metadata_updates);
  cfg.__set_topic_update_tbl_max_wait_time_ms(FLAGS_topic_update_tbl_max_wait_time_ms);
  cfg.__set_catalog_max_lock_skipped_topic_updates(
      FLAGS_catalog_max_lock_skipped_topic_updates);
  cfg.__set_saml2_keystore_path(FLAGS_saml2_keystore_path);
  string saml2_keystore_password;
  RETURN_IF_ERROR(GetConfigFromCommand(
      FLAGS_saml2_keystore_password_cmd, saml2_keystore_password));
  cfg.__set_saml2_keystore_password(saml2_keystore_password);
  string saml2_private_key_password;
  RETURN_IF_ERROR(GetConfigFromCommand(
      FLAGS_saml2_private_key_password_cmd,saml2_private_key_password));
  cfg.__set_saml2_private_key_password(saml2_private_key_password);
  cfg.__set_saml2_idp_metadata(FLAGS_saml2_idp_metadata);
  cfg.__set_saml2_sp_entity_id(FLAGS_saml2_sp_entity_id);
  cfg.__set_saml2_sp_callback_url(FLAGS_saml2_sp_callback_url);
  cfg.__set_saml2_want_assertations_signed(FLAGS_saml2_want_assertations_signed);
  cfg.__set_saml2_sign_requests(FLAGS_saml2_sign_requests);
  cfg.__set_saml2_callback_token_ttl(FLAGS_saml2_callback_token_ttl);
  cfg.__set_saml2_group_attribute_name(FLAGS_saml2_group_attribute_name);
  cfg.__set_saml2_group_filter(FLAGS_saml2_group_filter);
  cfg.__set_saml2_ee_test_mode(FLAGS_saml2_ee_test_mode);
  cfg.__set_scratch_dirs(FLAGS_scratch_dirs);
  cfg.__set_max_wait_time_for_sync_ddl_s(FLAGS_max_wait_time_for_sync_ddl_s);
  cfg.__set_allow_ordinals_in_having(FLAGS_allow_ordinals_in_having);
  cfg.__set_start_hms_server(FLAGS_start_hms_server);
  cfg.__set_hms_port(FLAGS_hms_port);
  cfg.__set_fallback_to_hms_on_errors(FLAGS_fallback_to_hms_on_errors);
  cfg.__set_enable_catalogd_hms_cache(FLAGS_enable_catalogd_hms_cache);
  cfg.__set_kudu_sasl_protocol_name(FLAGS_kudu_sasl_protocol_name);
  cfg.__set_warn_catalog_response_size_mb(FLAGS_warn_catalog_response_size_mb);
  cfg.__set_warn_catalog_response_duration_s(FLAGS_warn_catalog_response_duration_s);
  cfg.__set_invalidate_hms_cache_on_ddls(FLAGS_invalidate_hms_cache_on_ddls);
  cfg.__set_startup_filesystem_check_directories(
      FLAGS_startup_filesystem_check_directories);
  cfg.__set_hms_event_incremental_refresh_transactional_table(
      FLAGS_hms_event_incremental_refresh_transactional_table);
  cfg.__set_auto_check_compaction(FLAGS_auto_check_compaction);
  cfg.__set_enable_sync_to_latest_event_on_ddls(
      FLAGS_enable_sync_to_latest_event_on_ddls);
  cfg.__set_pull_table_types_and_comments(FLAGS_pull_table_types_and_comments);
  cfg.__set_use_hms_column_order_for_hbase_tables(
      FLAGS_use_hms_column_order_for_hbase_tables);
  cfg.__set_ignored_dir_prefix_list(FLAGS_ignored_dir_prefix_list);
  cfg.__set_enable_reload_events(FLAGS_enable_reload_events);
  if (FLAGS_geospatial_library == to_string(TGeospatialLibrary::NONE)) {
    cfg.__set_geospatial_library(TGeospatialLibrary::NONE);
  } else {
    DCHECK_EQ(FLAGS_geospatial_library, to_string(TGeospatialLibrary::HIVE_ESRI));
    cfg.__set_geospatial_library(TGeospatialLibrary::HIVE_ESRI);
  }
  cfg.__set_query_cpu_count_divisor(FLAGS_query_cpu_count_divisor);
  cfg.__set_processing_cost_use_equal_expr_weight(
      FLAGS_processing_cost_use_equal_expr_weight);
  cfg.__set_min_processing_per_thread(FLAGS_min_processing_per_thread);
  cfg.__set_skip_resource_checking_on_last_executor_group_set(
      FLAGS_skip_resource_checking_on_last_executor_group_set);
  cfg.__set_file_metadata_reload_properties(FLAGS_file_metadata_reload_properties);
  cfg.__set_thrift_rpc_max_message_size(FLAGS_thrift_rpc_max_message_size);
  cfg.__set_scan_range_cost_factor(FLAGS_scan_range_cost_factor);
  cfg.__set_use_jamm_weigher(FLAGS_java_weigher == "jamm");
  cfg.__set_iceberg_reload_new_files_threshold(FLAGS_iceberg_reload_new_files_threshold);
  cfg.__set_enable_skipping_older_events(FLAGS_enable_skipping_older_events);
  cfg.__set_enable_json_scanner(FLAGS_enable_json_scanner);
  cfg.__set_iceberg_allow_datafiles_in_table_location_only(
      FLAGS_iceberg_allow_datafiles_in_table_location_only);
  cfg.__set_max_filter_error_rate_from_full_scan(
      FLAGS_max_filter_error_rate_from_full_scan);
  cfg.__set_catalog_operation_log_size(FLAGS_catalog_operation_log_size);
  cfg.__set_hostname(FLAGS_hostname);
  cfg.__set_allow_catalog_cache_op_from_masked_users(
      FLAGS_allow_catalog_cache_op_from_masked_users);
  cfg.__set_topic_update_log_gc_frequency(FLAGS_topic_update_log_gc_frequency);
  cfg.__set_debug_actions(FLAGS_debug_actions);
  return Status::OK();
}

Status GetThriftBackendGFlagsForJNI(JNIEnv* jni_env, jbyteArray* cfg_bytes) {
  TBackendGflags cfg;
  RETURN_IF_ERROR(PopulateThriftBackendGflags(cfg));
  RETURN_IF_ERROR(SerializeThriftMsg(jni_env, &cfg, cfg_bytes));
  return Status::OK();
}

}
