diff --git a/.github/actions/package-macos/action.yaml b/.github/actions/package-macos/action.yaml index 02865c870..fc9d9162c 100644 --- a/.github/actions/package-macos/action.yaml +++ b/.github/actions/package-macos/action.yaml @@ -33,7 +33,7 @@ runs: HOMEBREW_NO_INSTALL_UPGRADE: 1 HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK: 1 run: | - brew install curl zip unzip coreutils openssl@1.1 + brew install curl zip unzip coreutils openssl@1.1 unixodbc echo "/usr/local/opt/bison/bin" >> $GITHUB_PATH echo "/usr/local/bin" >> $GITHUB_PATH echo "emqx_name=${emqx_name}" >> $GITHUB_OUTPUT @@ -56,7 +56,7 @@ runs: if: steps.prepare.outputs.SELF_HOSTED != 'true' with: path: ${{ steps.prepare.outputs.OTP_INSTALL_PATH }} - key: otp-install-${{ inputs.otp }}-${{ inputs.os }}-static-ssl-disable-hipe-disable-jit + key: otp-install-${{ inputs.otp }}-${{ inputs.os }}-static-ssl-disable-hipe-disable-jit-20240524-1 - name: build erlang if: steps.cache.outputs.cache-hit != 'true' shell: bash @@ -80,9 +80,10 @@ runs: git clone --depth 1 --branch OTP-${{ inputs.otp }} https://github.com/emqx/otp.git "$OTP_SOURCE_PATH" cd "$OTP_SOURCE_PATH" if [ "$(arch)" = arm64 ]; then - export CFLAGS="-O2 -g -I$(brew --prefix unixodbc)/include" - export LDFLAGS="-L$(brew --prefix unixodbc)/lib" - WITH_ODBC="--with-odbc=$(brew --prefix unixodbc)" + ODBCHOME="$(brew --prefix unixodbc)" + export CFLAGS="-O2 -g -I${ODBCHOME}/include" + export LDFLAGS="-L${ODBCHOME}/lib" + WITH_ODBC="--with-odbc=${ODBCHOME}" else WITH_ODBC="" fi diff --git a/.github/workflows/build_and_push_docker_images.yaml b/.github/workflows/build_and_push_docker_images.yaml index ec6747c32..5c879dc11 100644 --- a/.github/workflows/build_and_push_docker_images.yaml +++ b/.github/workflows/build_and_push_docker_images.yaml @@ -156,7 +156,7 @@ jobs: password: ${{ secrets.AWS_SECRET_ACCESS_KEY }} ecr: true - - name: Build docker image + - name: Build docker image for smoke test env: PROFILE: ${{ matrix.profile[0] }} DOCKER_REGISTRY: ${{ matrix.profile[1] }} @@ -164,7 +164,6 @@ jobs: DOCKER_LATEST: ${{ inputs.latest }} DOCKER_PUSH: false DOCKER_BUILD_NOCACHE: true - DOCKER_PLATFORMS: linux/amd64,linux/arm64 DOCKER_LOAD: true EMQX_RUNNER: 'public.ecr.aws/debian/debian:12-slim' EMQX_DOCKERFILE: 'deploy/docker/Dockerfile' @@ -203,7 +202,8 @@ jobs: docker exec -t -u root -w /root $CID bash -c 'apt-get -y update && apt-get -y install net-tools' docker exec -t -u root $CID node_dump docker rm -f $CID - - name: Push docker image + + - name: Build and push docker image if: inputs.publish || github.repository_owner != 'emqx' env: PROFILE: ${{ matrix.profile[0] }} diff --git a/.github/workflows/build_packages.yaml b/.github/workflows/build_packages.yaml index 7ccf975b6..ce8536dde 100644 --- a/.github/workflows/build_packages.yaml +++ b/.github/workflows/build_packages.yaml @@ -205,18 +205,6 @@ jobs: pattern: "${{ matrix.profile }}-*" path: packages/${{ matrix.profile }} merge-multiple: true - - name: install dos2unix - run: sudo apt-get update -y && sudo apt install -y dos2unix - - name: get packages - run: | - set -eu - cd packages/${{ matrix.profile }} - # fix the .sha256 file format - for f in *.sha256; do - dos2unix $f - echo "$(cat $f) ${f%.*}" | sha256sum -c || exit 1 - done - cd - - uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} diff --git a/.github/workflows/run_docker_tests.yaml b/.github/workflows/run_docker_tests.yaml index 527c1cb32..cfc67be75 100644 --- a/.github/workflows/run_docker_tests.yaml +++ b/.github/workflows/run_docker_tests.yaml @@ -47,9 +47,6 @@ jobs: echo "_EMQX_DOCKER_IMAGE_TAG=$_EMQX_DOCKER_IMAGE_TAG" >> $GITHUB_ENV - name: dashboard tests working-directory: ./scripts/ui-tests - env: - EMQX_VERSION: ${{ inputs.version-emqx }} - EMQX_ENTERPRISE_VERSION: ${{ inputs.version-emqx-enterprise }} run: | set -eu docker compose up --abort-on-container-exit --exit-code-from selenium diff --git a/.gitignore b/.gitignore index d5338d5c4..8d95669ac 100644 --- a/.gitignore +++ b/.gitignore @@ -78,3 +78,4 @@ rebar-git-cache.tar .git/ apps/emqx_utils/src/emqx_variform_parser.erl apps/emqx_utils/src/emqx_variform_scan.erl +default-profile.mk diff --git a/Makefile b/Makefile index b9ff0dd53..cbff37ecd 100644 --- a/Makefile +++ b/Makefile @@ -20,9 +20,10 @@ endif # Dashboard version # from https://github.com/emqx/emqx-dashboard5 -export EMQX_DASHBOARD_VERSION ?= v1.9.0-beta.1 -export EMQX_EE_DASHBOARD_VERSION ?= e1.7.0-beta.9 +export EMQX_DASHBOARD_VERSION ?= v1.9.0 +export EMQX_EE_DASHBOARD_VERSION ?= e1.7.0 +-include default-profile.mk PROFILE ?= emqx REL_PROFILES := emqx emqx-enterprise PKG_PROFILES := emqx-pkg emqx-enterprise-pkg diff --git a/apps/emqx/include/emqx_release.hrl b/apps/emqx/include/emqx_release.hrl index 18e059422..97fc51363 100644 --- a/apps/emqx/include/emqx_release.hrl +++ b/apps/emqx/include/emqx_release.hrl @@ -32,7 +32,7 @@ %% `apps/emqx/src/bpapi/README.md' %% Opensource edition --define(EMQX_RELEASE_CE, "5.7.0-alpha.1"). +-define(EMQX_RELEASE_CE, "5.7.0"). %% Enterprise edition --define(EMQX_RELEASE_EE, "5.7.0-alpha.1"). +-define(EMQX_RELEASE_EE, "5.7.0"). diff --git a/apps/emqx/test/emqx_static_checks_data/5.7.bpapi2 b/apps/emqx/test/emqx_static_checks_data/5.7.bpapi2 new file mode 100644 index 000000000..8d334e9c3 --- /dev/null +++ b/apps/emqx/test/emqx_static_checks_data/5.7.bpapi2 @@ -0,0 +1 @@ +#{api => #{{emqx_bridge,3} => #{calls => [{{emqx_bridge_proto_v3,lookup_from_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_api,lookup_from_local_node,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v3,stop_bridges_to_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_resource,stop,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v3,start_bridges_to_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_resource,start,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v3,restart_bridges_to_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_resource,restart,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v3,stop_bridge_to_node,['Node','BridgeType','BridgeName']},{emqx_bridge_resource,stop,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v3,start_bridge_to_node,['Node','BridgeType','BridgeName']},{emqx_bridge_resource,start,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v3,restart_bridge_to_node,['Node','BridgeType','BridgeName']},{emqx_bridge_resource,restart,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v3,list_bridges_on_nodes,['Nodes']},{emqx_bridge,list,[]}},{{emqx_bridge_proto_v3,list_bridges,['Node']},{emqx_bridge,list,[]}}],casts => []},{emqx_authn,1} => #{calls => [{{emqx_authn_proto_v1,lookup_from_all_nodes,['Nodes','ChainName','AuthenticatorID']},{emqx_authn_api,lookup_from_local_node,['ChainName','AuthenticatorID']}}],casts => []},{emqx_bridge,4} => #{calls => [{{emqx_bridge_proto_v4,get_metrics_from_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_api,get_metrics_from_local_node,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v4,lookup_from_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_api,lookup_from_local_node,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v4,stop_bridges_to_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_resource,stop,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v4,start_bridges_to_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_resource,start,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v4,restart_bridges_to_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_resource,restart,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v4,stop_bridge_to_node,['Node','BridgeType','BridgeName']},{emqx_bridge_resource,stop,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v4,start_bridge_to_node,['Node','BridgeType','BridgeName']},{emqx_bridge_resource,start,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v4,restart_bridge_to_node,['Node','BridgeType','BridgeName']},{emqx_bridge_resource,restart,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v4,list_bridges_on_nodes,['Nodes']},{emqx_bridge,list,[]}}],casts => []},{emqx_resource,2} => #{calls => [{{emqx_resource_proto_v2,reset_metrics,['ResId']},{emqx_resource,reset_metrics_local,['ResId']}}],casts => []},{emqx_ft_storage_fs_reader,1} => #{calls => [{{emqx_ft_storage_fs_reader_proto_v1,read,['Node','Pid','Bytes']},{emqx_ft_storage_fs_reader,read,['Pid','Bytes']}}],casts => []},{emqx_authz,1} => #{calls => [{{emqx_authz_proto_v1,lookup_from_all_nodes,['Nodes','Type']},{emqx_authz_api_sources,lookup_from_local_node,['Type']}}],casts => []},{emqx_management,5} => #{calls => [{{emqx_management_proto_v5,kickout_clients,['Node','ClientIds']},{emqx_mgmt,do_kickout_clients,['ClientIds']}},{{emqx_management_proto_v5,get_full_config,['Node']},{emqx_mgmt_api_configs,get_full_config,[]}},{{emqx_management_proto_v5,call_client,['Nodes','ClientId','Req']},{emqx_mgmt,do_call_client,['ClientId','Req']}},{{emqx_management_proto_v5,unsubscribe,['Node','ClientId','Topic']},{emqx_mgmt,do_unsubscribe,['ClientId','Topic']}},{{emqx_management_proto_v5,subscribe,['Node','ClientId','TopicTables']},{emqx_mgmt,do_subscribe,['ClientId','TopicTables']}},{{emqx_management_proto_v5,list_listeners,['Node']},{emqx_mgmt_api_listeners,do_list_listeners,[]}},{{emqx_management_proto_v5,list_subscriptions,['Node']},{emqx_mgmt,do_list_subscriptions,[]}},{{emqx_management_proto_v5,broker_info,['Nodes']},{emqx_mgmt,broker_info,[]}},{{emqx_management_proto_v5,node_info,['Nodes']},{emqx_mgmt,node_info,[]}},{{emqx_management_proto_v5,unsubscribe_batch,['Node','ClientId','Topics']},{emqx_mgmt,do_unsubscribe_batch,['ClientId','Topics']}}],casts => []},{emqx_node_rebalance_purge,1} => #{calls => [{{emqx_node_rebalance_purge_proto_v1,stop,['Nodes']},{emqx_node_rebalance_purge,stop,[]}},{{emqx_node_rebalance_purge_proto_v1,start,['Nodes','Opts']},{emqx_node_rebalance_purge,start,['Opts']}}],casts => []},{emqx,1} => #{calls => [{{emqx_proto_v1,delete_all_deactivated_alarms,['Node']},{emqx_alarm,delete_all_deactivated_alarms,[]}},{{emqx_proto_v1,deactivate_alarm,['Node','Name']},{emqx_alarm,deactivate,['Name']}},{{emqx_proto_v1,clean_pem_cache,['Node']},{ssl_pem_cache,clear,[]}},{{emqx_proto_v1,clean_authz_cache,['Node']},{emqx_authz_cache,drain_cache,[]}},{{emqx_proto_v1,clean_authz_cache,['Node','ClientId']},{emqx_authz_cache,drain_cache,['ClientId']}},{{emqx_proto_v1,get_metrics,['Node']},{emqx_metrics,all,[]}},{{emqx_proto_v1,get_stats,['Node']},{emqx_stats,getstats,[]}},{{emqx_proto_v1,get_alarms,['Node','Type']},{emqx_alarm,get_alarms,['Type']}},{{emqx_proto_v1,is_running,['Node']},{emqx,is_running,[]}}],casts => []},{emqx_mgmt_cluster,1} => #{calls => [{{emqx_mgmt_cluster_proto_v1,invite_node,['Node','Self']},{emqx_mgmt_api_cluster,join,['Self']}}],casts => []},{emqx_cm,2} => #{calls => [{{emqx_cm_proto_v2,kick_session,['Action','ClientId','ChanPid']},{emqx_cm,do_kick_session,['Action','ClientId','ChanPid']}},{{emqx_cm_proto_v2,takeover_finish,['ConnMod','ChanPid']},{emqx_cm,takeover_finish,['ConnMod','ChanPid']}},{{emqx_cm_proto_v2,takeover_session,['ClientId','ChanPid']},{emqx_cm,takeover_session,['ClientId','ChanPid']}},{{emqx_cm_proto_v2,get_chann_conn_mod,['ClientId','ChanPid']},{emqx_cm,do_get_chann_conn_mod,['ClientId','ChanPid']}},{{emqx_cm_proto_v2,get_chan_info,['ClientId','ChanPid']},{emqx_cm,do_get_chan_info,['ClientId','ChanPid']}},{{emqx_cm_proto_v2,get_chan_stats,['ClientId','ChanPid']},{emqx_cm,do_get_chan_stats,['ClientId','ChanPid']}},{{emqx_cm_proto_v2,lookup_client,['Node','Key']},{emqx_cm,lookup_client,['Key']}},{{emqx_cm_proto_v2,kickout_client,['Node','ClientId']},{emqx_cm,kick_session,['ClientId']}}],casts => []},{emqx,2} => #{calls => [{{emqx_proto_v2,delete_all_deactivated_alarms,['Node']},{emqx_alarm,delete_all_deactivated_alarms,[]}},{{emqx_proto_v2,deactivate_alarm,['Node','Name']},{emqx_alarm,deactivate,['Name']}},{{emqx_proto_v2,clean_pem_cache,['Node']},{ssl_pem_cache,clear,[]}},{{emqx_proto_v2,clean_authz_cache,['Node']},{emqx_authz_cache,drain_cache,[]}},{{emqx_proto_v2,clean_authz_cache,['Node','ClientId']},{emqx_authz_cache,drain_cache,['ClientId']}},{{emqx_proto_v2,get_metrics,['Node']},{emqx_metrics,all,[]}},{{emqx_proto_v2,get_stats,['Node']},{emqx_stats,getstats,[]}},{{emqx_proto_v2,get_alarms,['Node','Type']},{emqx_alarm,get_alarms,['Type']}},{{emqx_proto_v2,are_running,['Nodes']},{emqx,is_running,[]}},{{emqx_proto_v2,is_running,['Node']},{emqx,is_running,[]}}],casts => []},{emqx_gateway_http,1} => #{calls => [{{emqx_gateway_http_proto_v1,get_cluster_status,['Nodes','GwName']},{emqx_gateway_http,gateway_status,['GwName']}}],casts => []},{emqx_slow_subs,1} => #{calls => [{{emqx_slow_subs_proto_v1,get_history,['Nodes']},{emqx_slow_subs_api,get_history,[]}},{{emqx_slow_subs_proto_v1,clear_history,['Nodes']},{emqx_slow_subs,clear_history,[]}}],casts => []},{emqx_retainer,1} => #{calls => [{{emqx_retainer_proto_v1,wait_dispatch_complete,['Nodes','Timeout']},{emqx_retainer_dispatcher,wait_dispatch_complete,['Timeout']}}],casts => []},{emqx_mgmt_api_plugins,2} => #{calls => [{{emqx_mgmt_api_plugins_proto_v2,ensure_action,['Name','Action']},{emqx_mgmt_api_plugins,ensure_action,['Name','Action']}},{{emqx_mgmt_api_plugins_proto_v2,delete_package,['Name']},{emqx_mgmt_api_plugins,delete_package,['Name']}},{{emqx_mgmt_api_plugins_proto_v2,describe_package,['Nodes','Name']},{emqx_mgmt_api_plugins,describe_package,['Name']}},{{emqx_mgmt_api_plugins_proto_v2,install_package,['Nodes','Filename','Bin']},{emqx_mgmt_api_plugins,install_package,['Filename','Bin']}},{{emqx_mgmt_api_plugins_proto_v2,get_plugins,['Nodes']},{emqx_mgmt_api_plugins,get_plugins,[]}}],casts => []},{emqx_mgmt_trace,1} => #{calls => [{{emqx_mgmt_trace_proto_v1,read_trace_file,['Node','Name','Position','Limit']},{emqx_mgmt_api_trace,read_trace_file,['Name','Position','Limit']}},{{emqx_mgmt_trace_proto_v1,trace_file,['Nodes','File']},{emqx_trace,trace_file,['File']}},{{emqx_mgmt_trace_proto_v1,get_trace_size,['Nodes']},{emqx_mgmt_api_trace,get_trace_size,[]}}],casts => []},{emqx_mgmt_data_backup,1} => #{calls => [{{emqx_mgmt_data_backup_proto_v1,delete_file,['Node','FileName','Timeout']},{emqx_mgmt_data_backup,delete_file,['FileName']}},{{emqx_mgmt_data_backup_proto_v1,read_file,['Node','FileName','Timeout']},{emqx_mgmt_data_backup,read_file,['FileName']}},{{emqx_mgmt_data_backup_proto_v1,import_file,['Node','FileNode','FileName','Timeout']},{emqx_mgmt_data_backup,maybe_copy_and_import,['FileNode','FileName']}},{{emqx_mgmt_data_backup_proto_v1,list_files,['Nodes','Timeout']},{emqx_mgmt_data_backup,list_files,[]}}],casts => []},{emqx_bridge,1} => #{calls => [{{emqx_bridge_proto_v1,lookup_from_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_api,lookup_from_local_node,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v1,stop_bridges_to_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_resource,stop,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v1,restart_bridges_to_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_resource,restart,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v1,stop_bridge_to_node,['Node','BridgeType','BridgeName']},{emqx_bridge_resource,stop,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v1,restart_bridge_to_node,['Node','BridgeType','BridgeName']},{emqx_bridge_resource,restart,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v1,list_bridges,['Node']},{emqx_bridge,list,[]}}],casts => []},{emqx_exhook,1} => #{calls => [{{emqx_exhook_proto_v1,server_hooks_metrics,['Nodes','Name']},{emqx_exhook_mgr,server_hooks_metrics,['Name']}},{{emqx_exhook_proto_v1,server_info,['Nodes','Name']},{emqx_exhook_mgr,server_info,['Name']}},{{emqx_exhook_proto_v1,all_servers_info,['Nodes']},{emqx_exhook_mgr,all_servers_info,[]}}],casts => []},{emqx_topic_metrics,1} => #{calls => [{{emqx_topic_metrics_proto_v1,reset,['Nodes','Topic']},{emqx_topic_metrics,reset,['Topic']}},{{emqx_topic_metrics_proto_v1,reset,['Nodes']},{emqx_topic_metrics,reset,[]}},{{emqx_topic_metrics_proto_v1,metrics,['Nodes','Topic']},{emqx_topic_metrics,metrics,['Topic']}},{{emqx_topic_metrics_proto_v1,metrics,['Nodes']},{emqx_topic_metrics,metrics,[]}}],casts => []},{emqx_delayed,3} => #{calls => [{{emqx_delayed_proto_v3,delete_delayed_messages_by_topic_name,['Nodes','TopicName']},{emqx_delayed,do_delete_delayed_messages_by_topic_name,['TopicName']}},{{emqx_delayed_proto_v3,clear_all,['Nodes']},{emqx_delayed,clear_all_local,[]}},{{emqx_delayed_proto_v3,delete_delayed_message,['Node','Id']},{emqx_delayed,delete_delayed_message,['Id']}},{{emqx_delayed_proto_v3,get_delayed_message,['Node','Id']},{emqx_delayed,get_delayed_message,['Id']}}],casts => []},{emqx_prometheus,1} => #{calls => [{{emqx_prometheus_proto_v1,stop,['Nodes']},{emqx_prometheus,do_stop,[]}},{{emqx_prometheus_proto_v1,start,['Nodes']},{emqx_prometheus,do_start,[]}}],casts => []},{emqx_license,2} => #{calls => [{{emqx_license_proto_v2,remote_connection_counts,['Nodes']},{emqx_license_resources,local_connection_count,[]}}],casts => []},{emqx_node_rebalance_api,2} => #{calls => [{{emqx_node_rebalance_api_proto_v2,node_rebalance_purge_stop,['Node']},{emqx_node_rebalance_purge,stop,[]}},{{emqx_node_rebalance_api_proto_v2,node_rebalance_purge_start,['Node','Opts']},{emqx_node_rebalance_purge,start,['Opts']}},{{emqx_node_rebalance_api_proto_v2,node_rebalance_stop,['Node']},{emqx_node_rebalance,stop,[]}},{{emqx_node_rebalance_api_proto_v2,node_rebalance_start,['Node','Opts']},{emqx_node_rebalance,start,['Opts']}},{{emqx_node_rebalance_api_proto_v2,node_rebalance_evacuation_stop,['Node']},{emqx_node_rebalance_evacuation,stop,[]}},{{emqx_node_rebalance_api_proto_v2,node_rebalance_evacuation_start,['Node','Opts']},{emqx_node_rebalance_evacuation,start,['Opts']}}],casts => []},{emqx_connector,1} => #{calls => [{{emqx_connector_proto_v1,start_connectors_to_all_nodes,['Nodes','ConnectorType','ConnectorName']},{emqx_connector_resource,start,['ConnectorType','ConnectorName']}},{{emqx_connector_proto_v1,start_connector_to_node,['Node','ConnectorType','ConnectorName']},{emqx_connector_resource,start,['ConnectorType','ConnectorName']}},{{emqx_connector_proto_v1,lookup_from_all_nodes,['Nodes','ConnectorType','ConnectorName']},{emqx_connector_api,lookup_from_local_node,['ConnectorType','ConnectorName']}},{{emqx_connector_proto_v1,list_connectors_on_nodes,['Nodes']},{emqx_connector,list,[]}}],casts => []},{emqx_node_rebalance_evacuation,1} => #{calls => [{{emqx_node_rebalance_evacuation_proto_v1,available_nodes,['Nodes']},{emqx_node_rebalance_evacuation,is_node_available,[]}}],casts => []},{emqx_rule_engine,1} => #{calls => [{{emqx_rule_engine_proto_v1,reset_metrics,['RuleId']},{emqx_rule_engine,reset_metrics_for_rule,['RuleId']}}],casts => []},{emqx_node_rebalance_status,1} => #{calls => [{{emqx_node_rebalance_status_proto_v1,evacuation_status,['Nodes']},{emqx_node_rebalance_status,evacuation_status,[]}},{{emqx_node_rebalance_status_proto_v1,rebalance_status,['Nodes']},{emqx_node_rebalance_status,rebalance_status,[]}},{{emqx_node_rebalance_status_proto_v1,local_status,['Node']},{emqx_node_rebalance_status,local_status,[]}}],casts => []},{emqx_retainer,2} => #{calls => [{{emqx_retainer_proto_v2,active_mnesia_indices,['Nodes']},{emqx_retainer_mnesia,active_indices,[]}},{{emqx_retainer_proto_v2,wait_dispatch_complete,['Nodes','Timeout']},{emqx_retainer_dispatcher,wait_dispatch_complete,['Timeout']}}],casts => []},{emqx_conf,1} => #{calls => [{{emqx_conf_proto_v1,get_override_config_file,['Nodes']},{emqx_conf_app,get_override_config_file,[]}},{{emqx_conf_proto_v1,reset,['Node','KeyPath','Opts']},{emqx,reset_config,['KeyPath','Opts']}},{{emqx_conf_proto_v1,reset,['KeyPath','Opts']},{emqx,reset_config,['KeyPath','Opts']}},{{emqx_conf_proto_v1,remove_config,['Node','KeyPath','Opts']},{emqx,remove_config,['KeyPath','Opts']}},{{emqx_conf_proto_v1,remove_config,['KeyPath','Opts']},{emqx,remove_config,['KeyPath','Opts']}},{{emqx_conf_proto_v1,update,['Node','KeyPath','UpdateReq','Opts']},{emqx,update_config,['KeyPath','UpdateReq','Opts']}},{{emqx_conf_proto_v1,update,['KeyPath','UpdateReq','Opts']},{emqx,update_config,['KeyPath','UpdateReq','Opts']}},{{emqx_conf_proto_v1,get_all,['KeyPath']},{emqx_conf,get_node_and_config,['KeyPath']}},{{emqx_conf_proto_v1,get_config,['Node','KeyPath','Default']},{emqx,get_config,['KeyPath','Default']}},{{emqx_conf_proto_v1,get_config,['Node','KeyPath']},{emqx,get_config,['KeyPath']}}],casts => []},{emqx_ds,3} => #{calls => [{{emqx_ds_proto_v3,drop_generation,['Node','DB','Shard','GenId']},{emqx_ds_replication_layer,do_drop_generation_v3,['DB','Shard','GenId']}},{{emqx_ds_proto_v3,list_generations_with_lifetimes,['Node','DB','Shard']},{emqx_ds_replication_layer,do_list_generations_with_lifetimes_v3,['DB','Shard']}},{{emqx_ds_proto_v3,add_generation,['Node','DB']},{emqx_ds_replication_layer,do_add_generation_v2,['DB']}},{{emqx_ds_proto_v3,update_iterator,['Node','DB','Shard','OldIter','DSKey']},{emqx_ds_replication_layer,do_update_iterator_v2,['DB','Shard','OldIter','DSKey']}},{{emqx_ds_proto_v3,store_batch,['Node','DB','Shard','Batch','Options']},{emqx_ds_replication_layer,do_store_batch_v1,['DB','Shard','Batch','Options']}},{{emqx_ds_proto_v3,next,['Node','DB','Shard','Iter','BatchSize']},{emqx_ds_replication_layer,do_next_v1,['DB','Shard','Iter','BatchSize']}},{{emqx_ds_proto_v3,make_iterator,['Node','DB','Shard','Stream','TopicFilter','StartTime']},{emqx_ds_replication_layer,do_make_iterator_v1,['DB','Shard','Stream','TopicFilter','StartTime']}},{{emqx_ds_proto_v3,get_streams,['Node','DB','Shard','TopicFilter','Time']},{emqx_ds_replication_layer,do_get_streams_v1,['DB','Shard','TopicFilter','Time']}},{{emqx_ds_proto_v3,drop_db,['Node','DB']},{emqx_ds_replication_layer,do_drop_db_v1,['DB']}}],casts => []},{emqx_management,2} => #{calls => [{{emqx_management_proto_v2,get_full_config,['Node']},{emqx_mgmt_api_configs,get_full_config,[]}},{{emqx_management_proto_v2,call_client,['Node','ClientId','Req']},{emqx_mgmt,do_call_client,['ClientId','Req']}},{{emqx_management_proto_v2,unsubscribe,['Node','ClientId','Topic']},{emqx_mgmt,do_unsubscribe,['ClientId','Topic']}},{{emqx_management_proto_v2,subscribe,['Node','ClientId','TopicTables']},{emqx_mgmt,do_subscribe,['ClientId','TopicTables']}},{{emqx_management_proto_v2,list_listeners,['Node']},{emqx_mgmt_api_listeners,do_list_listeners,[]}},{{emqx_management_proto_v2,list_subscriptions,['Node']},{emqx_mgmt,do_list_subscriptions,[]}},{{emqx_management_proto_v2,broker_info,['Node']},{emqx_mgmt,broker_info,[]}},{{emqx_management_proto_v2,node_info,['Node']},{emqx_mgmt,node_info,[]}},{{emqx_management_proto_v2,unsubscribe_batch,['Node','ClientId','Topics']},{emqx_mgmt,do_unsubscribe_batch,['ClientId','Topics']}}],casts => []},{emqx_conf,2} => #{calls => [{{emqx_conf_proto_v2,get_override_config_file,['Nodes']},{emqx_conf_app,get_override_config_file,[]}},{{emqx_conf_proto_v2,reset,['Node','KeyPath','Opts']},{emqx,reset_config,['KeyPath','Opts']}},{{emqx_conf_proto_v2,reset,['KeyPath','Opts']},{emqx,reset_config,['KeyPath','Opts']}},{{emqx_conf_proto_v2,remove_config,['Node','KeyPath','Opts']},{emqx,remove_config,['KeyPath','Opts']}},{{emqx_conf_proto_v2,remove_config,['KeyPath','Opts']},{emqx,remove_config,['KeyPath','Opts']}},{{emqx_conf_proto_v2,update,['Node','KeyPath','UpdateReq','Opts']},{emqx,update_config,['KeyPath','UpdateReq','Opts']}},{{emqx_conf_proto_v2,update,['KeyPath','UpdateReq','Opts']},{emqx,update_config,['KeyPath','UpdateReq','Opts']}},{{emqx_conf_proto_v2,get_all,['KeyPath']},{emqx_conf,get_node_and_config,['KeyPath']}},{{emqx_conf_proto_v2,get_config,['Node','KeyPath','Default']},{emqx,get_config,['KeyPath','Default']}},{{emqx_conf_proto_v2,get_config,['Node','KeyPath']},{emqx,get_config,['KeyPath']}},{{emqx_conf_proto_v2,sync_data_from_node,['Node']},{emqx_conf_app,sync_data_from_node,[]}}],casts => []},{emqx_management,4} => #{calls => [{{emqx_management_proto_v4,kickout_clients,['Node','ClientIds']},{emqx_mgmt,do_kickout_clients,['ClientIds']}},{{emqx_management_proto_v4,get_full_config,['Node']},{emqx_mgmt_api_configs,get_full_config,[]}},{{emqx_management_proto_v4,call_client,['Node','ClientId','Req']},{emqx_mgmt,do_call_client,['ClientId','Req']}},{{emqx_management_proto_v4,unsubscribe,['Node','ClientId','Topic']},{emqx_mgmt,do_unsubscribe,['ClientId','Topic']}},{{emqx_management_proto_v4,subscribe,['Node','ClientId','TopicTables']},{emqx_mgmt,do_subscribe,['ClientId','TopicTables']}},{{emqx_management_proto_v4,list_listeners,['Node']},{emqx_mgmt_api_listeners,do_list_listeners,[]}},{{emqx_management_proto_v4,list_subscriptions,['Node']},{emqx_mgmt,do_list_subscriptions,[]}},{{emqx_management_proto_v4,broker_info,['Nodes']},{emqx_mgmt,broker_info,[]}},{{emqx_management_proto_v4,node_info,['Nodes']},{emqx_mgmt,node_info,[]}},{{emqx_management_proto_v4,unsubscribe_batch,['Node','ClientId','Topics']},{emqx_mgmt,do_unsubscribe_batch,['ClientId','Topics']}}],casts => []},{emqx_bridge,6} => #{calls => [{{emqx_bridge_proto_v6,v2_start_bridge_on_node_v6,['Node','ConfRootKey','BridgeType','BridgeName']},{emqx_bridge_v2,start,['ConfRootKey','BridgeType','BridgeName']}},{{emqx_bridge_proto_v6,v2_start_bridge_on_all_nodes_v6,['Nodes','ConfRootKey','BridgeType','BridgeName']},{emqx_bridge_v2,start,['ConfRootKey','BridgeType','BridgeName']}},{{emqx_bridge_proto_v6,v2_get_metrics_from_all_nodes_v6,['Nodes','ConfRootKey','ActionType','ActionName']},{emqx_bridge_v2_api,get_metrics_from_local_node_v6,['ConfRootKey','ActionType','ActionName']}},{{emqx_bridge_proto_v6,v2_list_bridges_on_nodes_v6,['Nodes','ConfRootKey']},{emqx_bridge_v2,list,['ConfRootKey']}},{{emqx_bridge_proto_v6,v2_lookup_from_all_nodes_v6,['Nodes','ConfRootKey','BridgeType','BridgeName']},{emqx_bridge_v2_api,lookup_from_local_node_v6,['ConfRootKey','BridgeType','BridgeName']}},{{emqx_bridge_proto_v6,get_metrics_from_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_api,get_metrics_from_local_node,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v6,lookup_from_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_api,lookup_from_local_node,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v6,stop_bridges_to_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_resource,stop,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v6,start_bridges_to_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_resource,start,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v6,restart_bridges_to_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_resource,restart,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v6,stop_bridge_to_node,['Node','BridgeType','BridgeName']},{emqx_bridge_resource,stop,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v6,start_bridge_to_node,['Node','BridgeType','BridgeName']},{emqx_bridge_resource,start,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v6,restart_bridge_to_node,['Node','BridgeType','BridgeName']},{emqx_bridge_resource,restart,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v6,list_bridges_on_nodes,['Nodes']},{emqx_bridge,list,[]}}],casts => []},{emqx_ds,2} => #{calls => [{{emqx_ds_proto_v2,add_generation,['Node','DB']},{emqx_ds_replication_layer,do_add_generation_v2,['DB']}},{{emqx_ds_proto_v2,update_iterator,['Node','DB','Shard','OldIter','DSKey']},{emqx_ds_replication_layer,do_update_iterator_v2,['DB','Shard','OldIter','DSKey']}},{{emqx_ds_proto_v2,store_batch,['Node','DB','Shard','Batch','Options']},{emqx_ds_replication_layer,do_store_batch_v1,['DB','Shard','Batch','Options']}},{{emqx_ds_proto_v2,next,['Node','DB','Shard','Iter','BatchSize']},{emqx_ds_replication_layer,do_next_v1,['DB','Shard','Iter','BatchSize']}},{{emqx_ds_proto_v2,make_iterator,['Node','DB','Shard','Stream','TopicFilter','StartTime']},{emqx_ds_replication_layer,do_make_iterator_v1,['DB','Shard','Stream','TopicFilter','StartTime']}},{{emqx_ds_proto_v2,get_streams,['Node','DB','Shard','TopicFilter','Time']},{emqx_ds_replication_layer,do_get_streams_v1,['DB','Shard','TopicFilter','Time']}},{{emqx_ds_proto_v2,drop_db,['Node','DB']},{emqx_ds_replication_layer,do_drop_db_v1,['DB']}}],casts => []},{emqx_node_rebalance,2} => #{calls => [{{emqx_node_rebalance_proto_v2,purge_sessions,['Nodes','Count']},{emqx_eviction_agent,purge_sessions,['Count']}},{{emqx_node_rebalance_proto_v2,disable_rebalance_agent,['Nodes','OwnerPid','Kind']},{emqx_node_rebalance_agent,disable,['OwnerPid','Kind']}},{{emqx_node_rebalance_proto_v2,enable_rebalance_agent,['Nodes','OwnerPid','Kind']},{emqx_node_rebalance_agent,enable,['OwnerPid','Kind']}},{{emqx_node_rebalance_proto_v2,disconnected_session_counts,['Nodes']},{emqx_node_rebalance,disconnected_session_count,[]}},{{emqx_node_rebalance_proto_v2,disable_rebalance_agent,['Nodes','OwnerPid']},{emqx_node_rebalance_agent,disable,['OwnerPid']}},{{emqx_node_rebalance_proto_v2,enable_rebalance_agent,['Nodes','OwnerPid']},{emqx_node_rebalance_agent,enable,['OwnerPid']}},{{emqx_node_rebalance_proto_v2,session_counts,['Nodes']},{emqx_node_rebalance,session_count,[]}},{{emqx_node_rebalance_proto_v2,connection_counts,['Nodes']},{emqx_node_rebalance,connection_count,[]}},{{emqx_node_rebalance_proto_v2,evict_sessions,['Nodes','Count','RecipientNodes','ConnState']},{emqx_eviction_agent,evict_sessions,['Count','RecipientNodes','ConnState']}},{{emqx_node_rebalance_proto_v2,evict_connections,['Nodes','Count']},{emqx_eviction_agent,evict_connections,['Count']}},{{emqx_node_rebalance_proto_v2,available_nodes,['Nodes']},{emqx_node_rebalance,is_node_available,[]}}],casts => []},{emqx_mgmt_cluster,2} => #{calls => [{{emqx_mgmt_cluster_proto_v2,connected_replicants,['Nodes']},{emqx_mgmt_api_cluster,connected_replicants,[]}},{{emqx_mgmt_cluster_proto_v2,invite_node,['Node','Self']},{emqx_mgmt_api_cluster,join,['Self']}}],casts => []},{emqx_metrics,1} => #{calls => [{{emqx_metrics_proto_v1,get_metrics,['Nodes','HandlerName','MetricId','Timeout']},{emqx_metrics_worker,get_metrics,['HandlerName','MetricId']}}],casts => []},{emqx_cm,1} => #{calls => [{{emqx_cm_proto_v1,kick_session,['Action','ClientId','ChanPid']},{emqx_cm,do_kick_session,['Action','ClientId','ChanPid']}},{{emqx_cm_proto_v1,takeover_session,['ClientId','ChanPid']},{emqx_cm,takeover_session,['ClientId','ChanPid']}},{{emqx_cm_proto_v1,get_chann_conn_mod,['ClientId','ChanPid']},{emqx_cm,do_get_chann_conn_mod,['ClientId','ChanPid']}},{{emqx_cm_proto_v1,get_chan_info,['ClientId','ChanPid']},{emqx_cm,do_get_chan_info,['ClientId','ChanPid']}},{{emqx_cm_proto_v1,get_chan_stats,['ClientId','ChanPid']},{emqx_cm,do_get_chan_stats,['ClientId','ChanPid']}},{{emqx_cm_proto_v1,lookup_client,['Node','Key']},{emqx_cm,lookup_client,['Key']}},{{emqx_cm_proto_v1,kickout_client,['Node','ClientId']},{emqx_cm,kick_session,['ClientId']}}],casts => []},{emqx_eviction_agent,1} => #{calls => [{{emqx_eviction_agent_proto_v1,evict_session_channel,['Node','ClientId','ConnInfo','ClientInfo']},{emqx_eviction_agent,evict_session_channel,['ClientId','ConnInfo','ClientInfo']}}],casts => []},{emqx_ds,1} => #{calls => [{{emqx_ds_proto_v1,store_batch,['Node','DB','Shard','Batch','Options']},{emqx_ds_replication_layer,do_store_batch_v1,['DB','Shard','Batch','Options']}},{{emqx_ds_proto_v1,next,['Node','DB','Shard','Iter','BatchSize']},{emqx_ds_replication_layer,do_next_v1,['DB','Shard','Iter','BatchSize']}},{{emqx_ds_proto_v1,make_iterator,['Node','DB','Shard','Stream','TopicFilter','StartTime']},{emqx_ds_replication_layer,do_make_iterator_v1,['DB','Shard','Stream','TopicFilter','StartTime']}},{{emqx_ds_proto_v1,get_streams,['Node','DB','Shard','TopicFilter','Time']},{emqx_ds_replication_layer,do_get_streams_v1,['DB','Shard','TopicFilter','Time']}},{{emqx_ds_proto_v1,drop_db,['Node','DB']},{emqx_ds_replication_layer,do_drop_db_v1,['DB']}}],casts => []},{emqx_delayed,1} => #{calls => [{{emqx_delayed_proto_v1,delete_delayed_message,['Node','Id']},{emqx_delayed,delete_delayed_message,['Id']}},{{emqx_delayed_proto_v1,get_delayed_message,['Node','Id']},{emqx_delayed,get_delayed_message,['Id']}}],casts => []},{emqx_node_rebalance_api,1} => #{calls => [{{emqx_node_rebalance_api_proto_v1,node_rebalance_stop,['Node']},{emqx_node_rebalance,stop,[]}},{{emqx_node_rebalance_api_proto_v1,node_rebalance_start,['Node','Opts']},{emqx_node_rebalance,start,['Opts']}},{{emqx_node_rebalance_api_proto_v1,node_rebalance_evacuation_stop,['Node']},{emqx_node_rebalance_evacuation,stop,[]}},{{emqx_node_rebalance_api_proto_v1,node_rebalance_evacuation_start,['Node','Opts']},{emqx_node_rebalance_evacuation,start,['Opts']}}],casts => []},{emqx_ft_storage_exporter_fs,1} => #{calls => [{{emqx_ft_storage_exporter_fs_proto_v1,read_export_file,['Node','Filepath','CallerPid']},{emqx_ft_storage_exporter_fs_proxy,read_export_file_local,['Filepath','CallerPid']}},{{emqx_ft_storage_exporter_fs_proto_v1,list_exports,['Nodes','Query']},{emqx_ft_storage_exporter_fs_proxy,list_exports_local,['Query']}}],casts => []},{emqx_mgmt_trace,2} => #{calls => [{{emqx_mgmt_trace_proto_v2,read_trace_file,['Node','Name','Position','Limit']},{emqx_mgmt_api_trace,read_trace_file,['Name','Position','Limit']}},{{emqx_mgmt_trace_proto_v2,trace_file_detail,['Nodes','File']},{emqx_trace,trace_file_detail,['File']}},{{emqx_mgmt_trace_proto_v2,trace_file,['Nodes','File']},{emqx_trace,trace_file,['File']}},{{emqx_mgmt_trace_proto_v2,get_trace_size,['Nodes']},{emqx_mgmt_api_trace,get_trace_size,[]}}],casts => []},{emqx_persistent_session_ds,1} => #{calls => [{{emqx_persistent_session_ds_proto_v1,close_all_iterators,['Nodes','DSSessionID']},{emqx_persistent_session_ds,do_ensure_all_iterators_closed,['DSSessionID']}},{{emqx_persistent_session_ds_proto_v1,close_iterator,['Nodes','IteratorID']},{emqx_persistent_session_ds,do_ensure_iterator_closed,['IteratorID']}},{{emqx_persistent_session_ds_proto_v1,open_iterator,['Nodes','TopicFilter','StartMS','IteratorID']},{emqx_persistent_session_ds,do_open_iterator,['TopicFilter','StartMS','IteratorID']}}],casts => []},{emqx_gateway_cm,1} => #{calls => [{{emqx_gateway_cm_proto_v1,cast,['GwName','ClientId','ChanPid','Req']},{emqx_gateway_cm,do_cast,['GwName','ClientId','ChanPid','Req']}},{{emqx_gateway_cm_proto_v1,call,['GwName','ClientId','ChanPid','Req']},{emqx_gateway_cm,do_call,['GwName','ClientId','ChanPid','Req']}},{{emqx_gateway_cm_proto_v1,call,['GwName','ClientId','ChanPid','Req','Timeout']},{emqx_gateway_cm,do_call,['GwName','ClientId','ChanPid','Req','Timeout']}},{{emqx_gateway_cm_proto_v1,takeover_session,['GwName','ClientId','ChanPid']},{emqx_gateway_cm,do_takeover_session,['GwName','ClientId','ChanPid']}},{{emqx_gateway_cm_proto_v1,get_chann_conn_mod,['GwName','ClientId','ChanPid']},{emqx_gateway_cm,do_get_chann_conn_mod,['GwName','ClientId','ChanPid']}},{{emqx_gateway_cm_proto_v1,kick_session,['GwName','Action','ClientId','ChanPid']},{emqx_gateway_cm,do_kick_session,['GwName','Action','ClientId','ChanPid']}},{{emqx_gateway_cm_proto_v1,set_chan_stats,['GwName','ClientId','ChanPid','Stats']},{emqx_gateway_cm,do_set_chan_stats,['GwName','ClientId','ChanPid','Stats']}},{{emqx_gateway_cm_proto_v1,get_chan_stats,['GwName','ClientId','ChanPid']},{emqx_gateway_cm,do_get_chan_stats,['GwName','ClientId','ChanPid']}},{{emqx_gateway_cm_proto_v1,set_chan_info,['GwName','ClientId','ChanPid','Infos']},{emqx_gateway_cm,do_set_chan_info,['GwName','ClientId','ChanPid','Infos']}},{{emqx_gateway_cm_proto_v1,get_chan_info,['GwName','ClientId','ChanPid']},{emqx_gateway_cm,do_get_chan_info,['GwName','ClientId','ChanPid']}},{{emqx_gateway_cm_proto_v1,lookup_by_clientid,['Nodes','GwName','ClientId']},{emqx_gateway_cm,do_lookup_by_clientid,['GwName','ClientId']}}],casts => []},{emqx_bridge,5} => #{calls => [{{emqx_bridge_proto_v5,v2_start_bridge_to_node,['Node','BridgeType','BridgeName']},{emqx_bridge_v2,start,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v5,v2_start_bridge_to_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_v2,start,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v5,v2_get_metrics_from_all_nodes,['Nodes','ActionType','ActionName']},{emqx_bridge_v2_api,get_metrics_from_local_node,['ActionType','ActionName']}},{{emqx_bridge_proto_v5,v2_lookup_from_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_v2_api,lookup_from_local_node,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v5,v2_list_bridges_on_nodes,['Nodes']},{emqx_bridge_v2,list,[]}},{{emqx_bridge_proto_v5,get_metrics_from_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_api,get_metrics_from_local_node,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v5,lookup_from_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_api,lookup_from_local_node,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v5,stop_bridges_to_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_resource,stop,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v5,start_bridges_to_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_resource,start,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v5,restart_bridges_to_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_resource,restart,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v5,stop_bridge_to_node,['Node','BridgeType','BridgeName']},{emqx_bridge_resource,stop,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v5,start_bridge_to_node,['Node','BridgeType','BridgeName']},{emqx_bridge_resource,start,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v5,restart_bridge_to_node,['Node','BridgeType','BridgeName']},{emqx_bridge_resource,restart,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v5,list_bridges_on_nodes,['Nodes']},{emqx_bridge,list,[]}}],casts => []},{emqx_mgmt_api_plugins,1} => #{calls => [{{emqx_mgmt_api_plugins_proto_v1,ensure_action,['Name','Action']},{emqx_mgmt_api_plugins,ensure_action,['Name','Action']}},{{emqx_mgmt_api_plugins_proto_v1,delete_package,['Name']},{emqx_mgmt_api_plugins,delete_package,['Name']}},{{emqx_mgmt_api_plugins_proto_v1,describe_package,['Name']},{emqx_mgmt_api_plugins,describe_package,['Name']}},{{emqx_mgmt_api_plugins_proto_v1,install_package,['Filename','Bin']},{emqx_mgmt_api_plugins,install_package,['Filename','Bin']}},{{emqx_mgmt_api_plugins_proto_v1,get_plugins,[]},{emqx_mgmt_api_plugins,get_plugins,[]}}],casts => []},{emqx_node_rebalance_status,2} => #{calls => [{{emqx_node_rebalance_status_proto_v2,purge_status,['Nodes']},{emqx_node_rebalance_status,purge_status,[]}},{{emqx_node_rebalance_status_proto_v2,evacuation_status,['Nodes']},{emqx_node_rebalance_status,evacuation_status,[]}},{{emqx_node_rebalance_status_proto_v2,rebalance_status,['Nodes']},{emqx_node_rebalance_status,rebalance_status,[]}},{{emqx_node_rebalance_status_proto_v2,local_status,['Node']},{emqx_node_rebalance_status,local_status,[]}}],casts => []},{emqx_shared_sub,1} => #{calls => [{{emqx_shared_sub_proto_v1,dispatch_with_ack,['Pid','Group','Topic','Msg','Timeout']},{emqx_shared_sub,do_dispatch_with_ack,['Pid','Group','Topic','Msg']}}],casts => [{{emqx_shared_sub_proto_v1,send,['Node','Pid','Topic','Msg']},{erlang,send,['Pid','Msg']}}]},{emqx_gateway_api_listeners,1} => #{calls => [{{emqx_gateway_api_listeners_proto_v1,listeners_cluster_status,['Nodes','Listeners']},{emqx_gateway_api_listeners,do_listeners_cluster_status,['Listeners']}}],casts => []},{emqx_management,1} => #{calls => [{{emqx_management_proto_v1,get_full_config,['Node']},{emqx_mgmt_api_configs,get_full_config,[]}},{{emqx_management_proto_v1,call_client,['Node','ClientId','Req']},{emqx_mgmt,do_call_client,['ClientId','Req']}},{{emqx_management_proto_v1,unsubscribe,['Node','ClientId','Topic']},{emqx_mgmt,do_unsubscribe,['ClientId','Topic']}},{{emqx_management_proto_v1,subscribe,['Node','ClientId','TopicTables']},{emqx_mgmt,do_subscribe,['ClientId','TopicTables']}},{{emqx_management_proto_v1,list_listeners,['Node']},{emqx_mgmt_api_listeners,do_list_listeners,[]}},{{emqx_management_proto_v1,list_subscriptions,['Node']},{emqx_mgmt,do_list_subscriptions,[]}},{{emqx_management_proto_v1,broker_info,['Node']},{emqx_mgmt,broker_info,[]}},{{emqx_management_proto_v1,node_info,['Node']},{emqx_mgmt,node_info,[]}}],casts => []},{emqx_prometheus,2} => #{calls => [{{emqx_prometheus_proto_v2,raw_prom_data,['Nodes','M','F','A']},{emqx_prometheus_api,lookup_from_local_nodes,['M','F','A']}},{{emqx_prometheus_proto_v2,stop,['Nodes']},{emqx_prometheus,do_stop,[]}},{{emqx_prometheus_proto_v2,start,['Nodes']},{emqx_prometheus,do_start,[]}}],casts => []},{emqx_eviction_agent,2} => #{calls => [{{emqx_eviction_agent_proto_v2,all_channels_count,['Nodes','Timeout']},{emqx_eviction_agent,all_local_channels_count,[]}},{{emqx_eviction_agent_proto_v2,evict_session_channel,['Node','ClientId','ConnInfo','ClientInfo']},{emqx_eviction_agent,evict_session_channel,['ClientId','ConnInfo','ClientInfo']}}],casts => []},{emqx_delayed,2} => #{calls => [{{emqx_delayed_proto_v2,clear_all,['Nodes']},{emqx_delayed,clear_all_local,[]}},{{emqx_delayed_proto_v2,delete_delayed_message,['Node','Id']},{emqx_delayed,delete_delayed_message,['Id']}},{{emqx_delayed_proto_v2,get_delayed_message,['Node','Id']},{emqx_delayed,get_delayed_message,['Id']}}],casts => []},{emqx_conf,3} => #{calls => [{{emqx_conf_proto_v3,get_hocon_config,['Node','Key']},{emqx_conf_cli,get_config,['Key']}},{{emqx_conf_proto_v3,get_hocon_config,['Node']},{emqx_conf_cli,get_config,[]}},{{emqx_conf_proto_v3,get_override_config_file,['Nodes']},{emqx_conf_app,get_override_config_file,[]}},{{emqx_conf_proto_v3,reset,['Node','KeyPath','Opts']},{emqx,reset_config,['KeyPath','Opts']}},{{emqx_conf_proto_v3,reset,['KeyPath','Opts']},{emqx,reset_config,['KeyPath','Opts']}},{{emqx_conf_proto_v3,remove_config,['Node','KeyPath','Opts']},{emqx,remove_config,['KeyPath','Opts']}},{{emqx_conf_proto_v3,remove_config,['KeyPath','Opts']},{emqx,remove_config,['KeyPath','Opts']}},{{emqx_conf_proto_v3,update,['Node','KeyPath','UpdateReq','Opts']},{emqx,update_config,['KeyPath','UpdateReq','Opts']}},{{emqx_conf_proto_v3,update,['KeyPath','UpdateReq','Opts']},{emqx,update_config,['KeyPath','UpdateReq','Opts']}},{{emqx_conf_proto_v3,get_all,['KeyPath']},{emqx_conf,get_node_and_config,['KeyPath']}},{{emqx_conf_proto_v3,get_config,['Node','KeyPath','Default']},{emqx,get_config,['KeyPath','Default']}},{{emqx_conf_proto_v3,get_config,['Node','KeyPath']},{emqx,get_config,['KeyPath']}},{{emqx_conf_proto_v3,sync_data_from_node,['Node']},{emqx_conf_app,sync_data_from_node,[]}}],casts => []},{emqx_plugins,1} => #{calls => [{{emqx_plugins_proto_v1,get_tar,['Node','NameVsn','Timeout']},{emqx_plugins,get_tar,['NameVsn']}}],casts => []},{emqx_ft_storage_fs,1} => #{calls => [{{emqx_ft_storage_fs_proto_v1,list_assemblers,['Nodes','Transfer']},{emqx_ft_storage_fs_proxy,lookup_local_assembler,['Transfer']}},{{emqx_ft_storage_fs_proto_v1,pread,['Node','Transfer','Frag','Offset','Size']},{emqx_ft_storage_fs_proxy,pread_local,['Transfer','Frag','Offset','Size']}},{{emqx_ft_storage_fs_proto_v1,multilist,['Nodes','Transfer','What']},{emqx_ft_storage_fs_proxy,list_local,['Transfer','What']}}],casts => []},{emqx_bridge,2} => #{calls => [{{emqx_bridge_proto_v2,lookup_from_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_api,lookup_from_local_node,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v2,stop_bridges_to_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_resource,stop,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v2,start_bridges_to_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_resource,start,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v2,restart_bridges_to_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_resource,restart,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v2,stop_bridge_to_node,['Node','BridgeType','BridgeName']},{emqx_bridge_resource,stop,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v2,start_bridge_to_node,['Node','BridgeType','BridgeName']},{emqx_bridge_resource,start,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v2,restart_bridge_to_node,['Node','BridgeType','BridgeName']},{emqx_bridge_resource,restart,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v2,list_bridges,['Node']},{emqx_bridge,list,[]}}],casts => []},{emqx_router,1} => #{calls => [{{emqx_router_proto_v1,get_routing_schema_vsn,['Nodes']},{emqx_router,get_schema_vsn,[]}}],casts => []},{emqx_mgmt_cluster,3} => #{calls => [{{emqx_mgmt_cluster_proto_v3,connected_replicants,['Nodes']},{emqx_mgmt_api_cluster,connected_replicants,[]}},{{emqx_mgmt_cluster_proto_v3,invite_node,['Node','Self','Timeout']},{emqx_mgmt_api_cluster,join,['Self']}}],casts => []},{emqx_broker,1} => #{calls => [{{emqx_broker_proto_v1,list_subscriptions_via_topic,['Node','Topic']},{emqx_broker,subscriptions_via_topic,['Topic']}},{{emqx_broker_proto_v1,list_client_subscriptions,['Node','ClientId']},{emqx_broker,subscriptions,['ClientId']}},{{emqx_broker_proto_v1,forward,['Node','Topic','Delivery']},{emqx_broker,dispatch,['Topic','Delivery']}}],casts => [{{emqx_broker_proto_v1,forward_async,['Node','Topic','Delivery']},{emqx_broker,dispatch,['Topic','Delivery']}}]},{emqx_ds,4} => #{calls => [{{emqx_ds_proto_v4,drop_generation,['Node','DB','Shard','GenId']},{emqx_ds_replication_layer,do_drop_generation_v3,['DB','Shard','GenId']}},{{emqx_ds_proto_v4,list_generations_with_lifetimes,['Node','DB','Shard']},{emqx_ds_replication_layer,do_list_generations_with_lifetimes_v3,['DB','Shard']}},{{emqx_ds_proto_v4,add_generation,['Node','DB']},{emqx_ds_replication_layer,do_add_generation_v2,['DB']}},{{emqx_ds_proto_v4,update_iterator,['Node','DB','Shard','OldIter','DSKey']},{emqx_ds_replication_layer,do_update_iterator_v2,['DB','Shard','OldIter','DSKey']}},{{emqx_ds_proto_v4,store_batch,['Node','DB','Shard','Batch','Options']},{emqx_ds_replication_layer,do_store_batch_v1,['DB','Shard','Batch','Options']}},{{emqx_ds_proto_v4,next,['Node','DB','Shard','Iter','BatchSize']},{emqx_ds_replication_layer,do_next_v1,['DB','Shard','Iter','BatchSize']}},{{emqx_ds_proto_v4,make_iterator,['Node','DB','Shard','Stream','TopicFilter','StartTime']},{emqx_ds_replication_layer,do_make_iterator_v2,['DB','Shard','Stream','TopicFilter','StartTime']}},{{emqx_ds_proto_v4,get_streams,['Node','DB','Shard','TopicFilter','Time']},{emqx_ds_replication_layer,do_get_streams_v2,['DB','Shard','TopicFilter','Time']}},{{emqx_ds_proto_v4,drop_db,['Node','DB']},{emqx_ds_replication_layer,do_drop_db_v1,['DB']}}],casts => []},{emqx_dashboard,1} => #{calls => [{{emqx_dashboard_proto_v1,current_rate,['Node']},{emqx_dashboard_monitor,current_rate,['Node']}},{{emqx_dashboard_proto_v1,do_sample,['Node','Latest']},{emqx_dashboard_monitor,do_sample,['Node','Latest']}}],casts => []},{emqx_license,1} => #{calls => [{{emqx_license_proto_v1,remote_connection_counts,['Nodes']},{emqx_license_resources,local_connection_count,[]}}],casts => []},{emqx_resource,1} => #{calls => [{{emqx_resource_proto_v1,reset_metrics,['ResId']},{emqx_resource,reset_metrics_local,['ResId']}},{{emqx_resource_proto_v1,remove,['ResId']},{emqx_resource,remove_local,['ResId']}},{{emqx_resource_proto_v1,recreate,['ResId','ResourceType','Config','Opts']},{emqx_resource,recreate_local,['ResId','ResourceType','Config','Opts']}},{{emqx_resource_proto_v1,create_dry_run,['ResourceType','Config']},{emqx_resource,create_dry_run_local,['ResourceType','Config']}},{{emqx_resource_proto_v1,create,['ResId','Group','ResourceType','Config','Opts']},{emqx_resource,create_local,['ResId','Group','ResourceType','Config','Opts']}}],casts => []},{emqx_telemetry,1} => #{calls => [{{emqx_telemetry_proto_v1,get_cluster_uuid,['Node']},{emqx_telemetry,get_cluster_uuid,[]}},{{emqx_telemetry_proto_v1,get_node_uuid,['Node']},{emqx_telemetry,get_node_uuid,[]}}],casts => []},{emqx_management,3} => #{calls => [{{emqx_management_proto_v3,get_full_config,['Node']},{emqx_mgmt_api_configs,get_full_config,[]}},{{emqx_management_proto_v3,call_client,['Node','ClientId','Req']},{emqx_mgmt,do_call_client,['ClientId','Req']}},{{emqx_management_proto_v3,unsubscribe,['Node','ClientId','Topic']},{emqx_mgmt,do_unsubscribe,['ClientId','Topic']}},{{emqx_management_proto_v3,subscribe,['Node','ClientId','TopicTables']},{emqx_mgmt,do_subscribe,['ClientId','TopicTables']}},{{emqx_management_proto_v3,list_listeners,['Node']},{emqx_mgmt_api_listeners,do_list_listeners,[]}},{{emqx_management_proto_v3,list_subscriptions,['Node']},{emqx_mgmt,do_list_subscriptions,[]}},{{emqx_management_proto_v3,broker_info,['Nodes']},{emqx_mgmt,broker_info,[]}},{{emqx_management_proto_v3,node_info,['Nodes']},{emqx_mgmt,node_info,[]}},{{emqx_management_proto_v3,unsubscribe_batch,['Node','ClientId','Topics']},{emqx_mgmt,do_unsubscribe_batch,['ClientId','Topics']}}],casts => []},{emqx_node_rebalance,3} => #{calls => [{{emqx_node_rebalance_proto_v3,enable_rebalance_agent,['Nodes','OwnerPid','Kind','Options']},{emqx_node_rebalance_agent,enable,['OwnerPid','Kind','Options']}},{{emqx_node_rebalance_proto_v3,purge_sessions,['Nodes','Count']},{emqx_eviction_agent,purge_sessions,['Count']}},{{emqx_node_rebalance_proto_v3,disable_rebalance_agent,['Nodes','OwnerPid','Kind']},{emqx_node_rebalance_agent,disable,['OwnerPid','Kind']}},{{emqx_node_rebalance_proto_v3,enable_rebalance_agent,['Nodes','OwnerPid','Kind']},{emqx_node_rebalance_agent,enable,['OwnerPid','Kind']}},{{emqx_node_rebalance_proto_v3,disconnected_session_counts,['Nodes']},{emqx_node_rebalance,disconnected_session_count,[]}},{{emqx_node_rebalance_proto_v3,disable_rebalance_agent,['Nodes','OwnerPid']},{emqx_node_rebalance_agent,disable,['OwnerPid']}},{{emqx_node_rebalance_proto_v3,enable_rebalance_agent,['Nodes','OwnerPid']},{emqx_node_rebalance_agent,enable,['OwnerPid']}},{{emqx_node_rebalance_proto_v3,session_counts,['Nodes']},{emqx_node_rebalance,session_count,[]}},{{emqx_node_rebalance_proto_v3,connection_counts,['Nodes']},{emqx_node_rebalance,connection_count,[]}},{{emqx_node_rebalance_proto_v3,evict_sessions,['Nodes','Count','RecipientNodes','ConnState']},{emqx_eviction_agent,evict_sessions,['Count','RecipientNodes','ConnState']}},{{emqx_node_rebalance_proto_v3,evict_connections,['Nodes','Count']},{emqx_eviction_agent,evict_connections,['Count']}},{{emqx_node_rebalance_proto_v3,available_nodes,['Nodes']},{emqx_node_rebalance,is_node_available,[]}}],casts => []},{emqx_node_rebalance,1} => #{calls => [{{emqx_node_rebalance_proto_v1,disconnected_session_counts,['Nodes']},{emqx_node_rebalance,disconnected_session_count,[]}},{{emqx_node_rebalance_proto_v1,disable_rebalance_agent,['Nodes','OwnerPid']},{emqx_node_rebalance_agent,disable,['OwnerPid']}},{{emqx_node_rebalance_proto_v1,enable_rebalance_agent,['Nodes','OwnerPid']},{emqx_node_rebalance_agent,enable,['OwnerPid']}},{{emqx_node_rebalance_proto_v1,session_counts,['Nodes']},{emqx_node_rebalance,session_count,[]}},{{emqx_node_rebalance_proto_v1,connection_counts,['Nodes']},{emqx_node_rebalance,connection_count,[]}},{{emqx_node_rebalance_proto_v1,evict_sessions,['Nodes','Count','RecipientNodes','ConnState']},{emqx_eviction_agent,evict_sessions,['Count','RecipientNodes','ConnState']}},{{emqx_node_rebalance_proto_v1,evict_connections,['Nodes','Count']},{emqx_eviction_agent,evict_connections,['Count']}},{{emqx_node_rebalance_proto_v1,available_nodes,['Nodes']},{emqx_node_rebalance,is_node_available,[]}}],casts => []}},release => "master",signatures => #{{emqx_exhook_proto_v1,all_servers_info,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_gateway_http_proto_v1,get_cluster_status,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,atom,any,unknown}]},{emqx_ds_proto_v2,next,5} => {any,[{c,atom,any,unknown},{c,atom,any,unknown},{c,binary,{8,0},unknown},{c,opaque,[{opaque,emqx_ds_storage_layer,iterator,0,{c,map,{[{{c,number,{int_set,[1]},integer},mandatory,{c,number,{int_set,[2]},integer}},{{c,number,{int_set,[2]},integer},mandatory,{c,number,{int_rng,0,1114111},integer}},{{c,number,{int_set,[3]},integer},mandatory,any}],none,none},unknown}}],unknown},{c,number,{int_rng,1,pos_inf},integer}]},{emqx_node_rebalance_proto_v2,evict_connections,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,number,{int_rng,0,pos_inf},integer}]},{emqx_proto_v2,get_alarms,2} => {any,[{c,atom,any,unknown},{c,atom,[activated,all,deactivated],unknown}]},{emqx_conf_cli,get_config,0} => {{c,map,{[],any,any},unknown},[]},{emqx_topic_metrics_proto_v1,reset,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_mgmt_api_trace,read_trace_file,3} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[eof],unknown},{c,union,[{c,atom,[undefined],unknown},none,none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none],unknown}],{2,{c,atom,[eof],unknown}}},{c,tuple,[{c,atom,[error],unknown},{c,union,[{c,atom,any,unknown},none,none,none,none,none,{c,tuple,[{c,atom,[no_translation],unknown},{c,atom,[unicode],unknown},{c,atom,[latin1],unknown}],{3,{c,atom,[no_translation],unknown}}},none,none],unknown}],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}],{2,{c,atom,[ok],unknown}}}]}],unknown},[{c,binary,{8,0},unknown},any,any]},{emqx_cm_proto_v2,takeover_finish,2} => {any,[{c,atom,any,unknown},{c,identifier,[pid],unknown}]},{emqx_proto_v1,is_running,1} => {any,[{c,atom,any,unknown}]},{emqx_proto_v2,are_running,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_gateway_cm,do_get_chann_conn_mod,3} => {any,[any,any,any]},{emqx_node_rebalance_status_proto_v1,rebalance_status,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_bridge_proto_v5,v2_get_metrics_from_all_nodes,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_conf,get_node_and_config,1} => {{c,tuple,[{c,atom,any,unknown},any],{2,any}},[{c,list,{{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,nil,[],unknown}},unknown}]},{emqx_mgmt_api_plugins_proto_v1,install_package,2} => {any,[{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,binary,{8,0},unknown}]},{emqx_bridge_proto_v2,start_bridges_to_all_nodes,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_management_proto_v4,list_listeners,1} => {any,[{c,atom,any,unknown}]},{emqx_ds_replication_layer,do_list_generations_with_lifetimes_v3,2} => {{c,map,{[],{c,number,{int_rng,0,1114111},integer},{c,map,{[{{c,atom,[created_at],unknown},mandatory,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[since],unknown},mandatory,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[until],unknown},mandatory,{c,union,[{c,atom,[undefined],unknown},none,none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none],unknown}}],none,none},unknown}},unknown},[{c,atom,any,unknown},{c,binary,{8,0},unknown}]},{emqx_proto_v1,delete_all_deactivated_alarms,1} => {any,[{c,atom,any,unknown}]},{emqx_exhook_mgr,server_hooks_metrics,1} => {any,[any]},{emqx_stats,getstats,0} => {{c,list,{{c,tuple,any,{any,any}},{c,nil,[],unknown}},unknown},[]},{emqx_cm_proto_v1,lookup_client,2} => {any,[{c,atom,any,unknown},{c,tuple_set,[{2,[{c,tuple,[{c,atom,[clientid],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}],{2,{c,atom,[clientid],unknown}}},{c,tuple,[{c,atom,[username],unknown},{c,union,[{c,atom,[undefined],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}],{2,{c,atom,[username],unknown}}}]}],unknown}]},{emqx_mgmt,do_unsubscribe_batch,2} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},{c,atom,[channel_not_found],unknown}],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[unsubscribe],unknown},{c,list,{{c,tuple,[any,any],{2,any}},{c,nil,[],unknown}},unknown}],{2,{c,atom,[unsubscribe],unknown}}}]}],unknown},[any,any]},{emqx_mgmt_api_plugins,delete_package,1} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},any],{2,{c,atom,[error],unknown}}},none,none],unknown},[{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_node_rebalance,connection_count,0} => {{c,tuple,[{c,atom,[ok],unknown},any],{2,{c,atom,[ok],unknown}}},[]},{emqx_ds_proto_v4,next,5} => {any,[{c,atom,any,unknown},{c,atom,any,unknown},{c,binary,{8,0},unknown},{c,opaque,[{opaque,emqx_ds_storage_layer,iterator,0,{c,map,{[{{c,number,{int_set,[1]},integer},mandatory,{c,number,{int_set,[2]},integer}},{{c,number,{int_set,[2]},integer},mandatory,{c,number,{int_rng,0,1114111},integer}},{{c,number,{int_set,[3]},integer},mandatory,any}],none,none},unknown}}],unknown},{c,number,{int_rng,1,pos_inf},integer}]},{emqx_cm_proto_v2,takeover_session,2} => {any,[{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_connector_resource,start,2} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},any],{2,{c,atom,[error],unknown}}},none,none],unknown},[{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{any,{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,nil,[],unknown},none,none,none,none],unknown}},unknown},{c,number,{int_rng,0,255},integer},none,none,none],unknown},{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,nil,[],unknown},none,none,none,none],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{any,{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,nil,[],unknown},none,none,none,none],unknown}},unknown},{c,number,{int_rng,0,255},integer},none,none,none],unknown},{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,nil,[],unknown},none,none,none,none],unknown}},unknown},none,none,none,none],unknown}]},{emqx_cm_proto_v2,get_chan_stats,2} => {any,[{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_connector_api,lookup_from_local_node,2} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},{c,atom,[not_found],unknown}],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},any],{2,{c,atom,[ok],unknown}}}]}],unknown},[{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_node_rebalance,stop,0} => {any,[]},{emqx_node_rebalance_proto_v2,disable_rebalance_agent,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,identifier,[pid],unknown},any]},{emqx_mgmt_api_plugins_proto_v1,get_plugins,0} => {any,[]},{emqx_management_proto_v4,subscribe,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,list,{{c,tuple,[{c,binary,{8,0},unknown},{c,map,{[{{c,atom,[nl],unknown},mandatory,{c,number,{int_set,[0,1]},integer}},{{c,atom,[qos],unknown},mandatory,{c,number,{int_set,[0,1,2]},integer}},{{c,atom,[rap],unknown},mandatory,{c,number,{int_set,[0,1]},integer}},{{c,atom,[rh],unknown},mandatory,{c,number,{int_set,[0,1,2]},integer}}],{c,atom,any,unknown},any},unknown}],{2,any}},{c,nil,[],unknown}},unknown}]},{emqx_topic_metrics,metrics,1} => {{c,union,[none,none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},{c,atom,[topic_not_found],unknown}],{2,{c,atom,[error],unknown}}},none,{c,map,{[{{c,atom,[create_time],unknown},mandatory,any},{{c,atom,[metrics],unknown},mandatory,{c,map,{[],any,any},unknown}},{{c,atom,[reset_time],unknown},optional,any},{{c,atom,[topic],unknown},mandatory,any}],none,none},unknown}],unknown},[any]},{emqx_gateway_cm,do_lookup_by_clientid,2} => {{c,list,{any,{c,nil,[],unknown}},unknown},[{c,union,[{c,atom,any,unknown},none,none,none,{c,list,{{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}},unknown},{c,number,any,unknown},none,none,none],unknown},any]},{emqx_conf_proto_v1,get_override_config_file,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_prometheus_proto_v1,stop,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_bridge_proto_v6,lookup_from_all_nodes,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_ds_proto_v2,store_batch,5} => {any,[{c,atom,any,unknown},{c,atom,any,unknown},{c,binary,{8,0},unknown},{c,map,{[{{c,number,{int_set,[1]},integer},mandatory,{c,number,{int_set,[3]},integer}},{{c,number,{int_set,[2]},integer},mandatory,{c,list,{{c,tuple,[{c,atom,[message],unknown},{c,binary,{8,0},unknown},any,{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,map,{[],{c,atom,any,unknown},{c,atom,[false,true],unknown}},unknown},{c,map,{[{{c,atom,[allow_publish],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[peerhost],unknown},optional,{c,tuple_set,[{4,[{c,tuple,[{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer}],{4,any}}]},{8,[{c,tuple,[{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer}],{8,any}}]}],unknown}},{{c,atom,[properties],unknown},optional,{c,map,{[],{c,atom,any,unknown},any},unknown}},{{c,atom,[proto_ver],unknown},optional,{c,union,[none,{c,binary,{8,0},unknown},none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none],unknown}},{{c,atom,[protocol],unknown},optional,{c,atom,any,unknown}},{{c,atom,[username],unknown},optional,{c,union,[{c,atom,[undefined],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}}],{c,atom,any,unknown},any},unknown},{c,binary,{8,0},unknown},{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{any,{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,nil,[],unknown},none,none,none,none],unknown}},unknown},{c,number,{int_rng,0,255},integer},none,none,none],unknown},{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,nil,[],unknown},none,none,none,none],unknown}},unknown},none,none,none,none],unknown},{c,number,any,integer},any],{10,{c,atom,[message],unknown}}},{c,nil,[],unknown}},unknown}}],none,none},unknown},{c,map,{[{{c,atom,[atomic],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[sync],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_mgmt,do_subscribe,2} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},{c,atom,[channel_not_found],unknown}],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[subscribe],unknown},any],{2,{c,atom,[subscribe],unknown}}}]}],unknown},[any,any]},{emqx_cm_proto_v2,kick_session,3} => {any,[{c,atom,[discard,kick],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_node_rebalance_api_proto_v1,node_rebalance_evacuation_stop,1} => {any,[{c,atom,any,unknown}]},{emqx_node_rebalance_api_proto_v2,node_rebalance_purge_stop,1} => {any,[{c,atom,any,unknown}]},{emqx_conf_proto_v1,get_config,3} => {any,[{c,atom,any,unknown},{c,list,{{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,nil,[],unknown}},unknown},any]},{emqx_mgmt_cluster_proto_v3,invite_node,3} => {any,[{c,atom,any,unknown},{c,atom,any,unknown},{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none],unknown}]},{emqx_cm_proto_v2,get_chann_conn_mod,2} => {any,[{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_bridge_proto_v4,list_bridges_on_nodes,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_persistent_session_ds,do_ensure_iterator_closed,1} => {{c,atom,[ok],unknown},[any]},{emqx_conf_app,sync_data_from_node,0} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},any],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},{c,binary,{8,0},unknown}],{2,{c,atom,[ok],unknown}}}]}],unknown},[]},{emqx_management_proto_v1,list_subscriptions,1} => {any,[{c,atom,any,unknown}]},{emqx_management_proto_v5,unsubscribe,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,binary,{8,0},unknown}]},{emqx_node_rebalance_purge,stop,0} => {any,[]},{emqx_mgmt_api_cluster,connected_replicants,0} => {{c,list,{{c,tuple,[{c,atom,any,unknown},{c,atom,any,unknown},{c,identifier,[pid],unknown}],{3,any}},{c,nil,[],unknown}},unknown},[]},{emqx_management_proto_v4,broker_info,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_management_proto_v2,list_subscriptions,1} => {any,[{c,atom,any,unknown}]},{emqx_node_rebalance_status,local_status,0} => {{c,union,[{c,atom,[disabled],unknown},none,none,none,none,none,{c,tuple_set,[{2,[{c,tuple,[{c,atom,[evacuation],unknown},any],{2,{c,atom,[evacuation],unknown}}},{c,tuple,[{c,atom,[purge],unknown},any],{2,{c,atom,[purge],unknown}}},{c,tuple,[{c,atom,[rebalance],unknown},{c,map,{[],{c,atom,[connection_eviction_rate,connection_goal,coordinator_node,disconnected_session_goal,recipients,session_eviction_rate,state,stats],unknown},any},unknown}],{2,{c,atom,[rebalance],unknown}}}]}],unknown},none,none],unknown},[]},{emqx_ds_proto_v2,make_iterator,6} => {any,[{c,atom,any,unknown},{c,atom,any,unknown},{c,binary,{8,0},unknown},{c,opaque,[{opaque,emqx_ds_storage_layer,stream_v1,0,{c,map,{[{{c,number,{int_set,[1]},integer},mandatory,{c,number,{int_set,[1]},integer}},{{c,number,{int_set,[2]},integer},mandatory,{c,number,{int_rng,0,1114111},integer}},{{c,number,{int_set,[3]},integer},mandatory,any}],none,none},unknown}}],unknown},{c,list,{{c,union,[{c,atom,['','#','+'],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,nil,[],unknown}},unknown},{c,number,{int_rng,0,pos_inf},integer}]},{emqx_gateway_http,gateway_status,1} => {{c,map,{[{{c,atom,[current_connections],unknown},optional,any},{{c,atom,[max_connections],unknown},optional,{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none],unknown}},{{c,atom,[node],unknown},mandatory,{c,atom,any,unknown}},{{c,atom,[status],unknown},mandatory,{c,atom,[running,stopped,unloaded],unknown}}],none,none},unknown},[{c,atom,any,unknown}]},{emqx_ds_proto_v2,add_generation,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,atom,any,unknown}]},{emqx_node_rebalance_status,purge_status,0} => {{c,tuple,[{c,atom,any,unknown},{c,union,[{c,atom,[disabled],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[enabled],unknown},{c,map,{[{{c,atom,[current_sessions],unknown},mandatory,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[initial_sessions],unknown},mandatory,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[purge_rate],unknown},mandatory,{c,number,{int_rng,1,pos_inf},integer}}],none,none},unknown}],{2,{c,atom,[enabled],unknown}}},none,none],unknown}],{2,any}},[]},{emqx_conf_proto_v2,reset,2} => {any,[{c,list,{{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,nil,[],unknown}},nonempty},{c,map,{[{{c,atom,[lazy_evaluator],unknown},optional,{c,function,{{c,product,[{c,function,{any,any},unknown}],unknown},any},unknown}},{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_proto_v2,clean_authz_cache,2} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}]},{emqx_license_resources,local_connection_count,0} => {any,[]},{emqx_bridge_api,get_metrics_from_local_node,2} => {{c,map,{[{{c,atom,[dropped],unknown},mandatory,{c,number,any,integer}},{{c,atom,['dropped.expired'],unknown},mandatory,{c,number,any,integer}},{{c,atom,['dropped.other'],unknown},mandatory,{c,number,any,integer}},{{c,atom,['dropped.queue_full'],unknown},mandatory,{c,number,any,integer}},{{c,atom,['dropped.resource_not_found'],unknown},mandatory,{c,number,any,integer}},{{c,atom,['dropped.resource_stopped'],unknown},mandatory,{c,number,any,integer}},{{c,atom,[failed],unknown},mandatory,{c,number,any,integer}},{{c,atom,[inflight],unknown},mandatory,any},{{c,atom,[late_reply],unknown},mandatory,{c,number,any,integer}},{{c,atom,[matched],unknown},mandatory,{c,number,any,integer}},{{c,atom,[queuing],unknown},mandatory,any},{{c,atom,[rate],unknown},mandatory,any},{{c,atom,[rate_last5m],unknown},mandatory,any},{{c,atom,[rate_max],unknown},mandatory,any},{{c,atom,[received],unknown},mandatory,{c,number,any,integer}},{{c,atom,[retried],unknown},mandatory,{c,number,any,integer}},{{c,atom,[success],unknown},mandatory,{c,number,any,integer}}],none,none},unknown},[{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{any,{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,nil,[],unknown},none,none,none,none],unknown}},unknown},{c,number,{int_rng,0,255},integer},none,none,none],unknown},{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,nil,[],unknown},none,none,none,none],unknown}},unknown},none,none,none,none],unknown},any]},{emqx_delayed_proto_v1,delete_delayed_message,2} => {any,[{c,atom,any,unknown},{c,binary,{8,0},unknown}]},{emqx_delayed_proto_v1,get_delayed_message,2} => {any,[{c,atom,any,unknown},{c,binary,{8,0},unknown}]},{emqx_bridge_proto_v1,restart_bridges_to_all_nodes,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_cm,lookup_client,1} => {{c,list,{any,{c,nil,[],unknown}},unknown},[{c,tuple_set,[{2,[{c,tuple,[{c,atom,[clientid],unknown},any],{2,{c,atom,[clientid],unknown}}},{c,tuple,[{c,atom,[username],unknown},any],{2,{c,atom,[username],unknown}}}]}],unknown}]},{emqx_mgmt_api_plugins_proto_v1,ensure_action,2} => {any,[{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,atom,[restart,start,stop],unknown}]},{emqx_ds_replication_layer,do_drop_generation_v3,3} => {{c,atom,[ok],unknown},[{c,atom,any,unknown},{c,binary,{8,0},unknown},{c,number,{int_rng,0,1114111},integer}]},{emqx_conf_proto_v3,get_all,1} => {any,[{c,list,{{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,nil,[],unknown}},unknown}]},{emqx_broker_proto_v1,forward_async,3} => {any,[{c,atom,any,unknown},{c,binary,{8,0},unknown},{c,tuple,[{c,atom,[delivery],unknown},{c,identifier,[pid],unknown},{c,tuple,[{c,atom,[message],unknown},{c,binary,{8,0},unknown},any,{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,map,{[],{c,atom,any,unknown},{c,atom,[false,true],unknown}},unknown},{c,map,{[{{c,atom,[allow_publish],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[peerhost],unknown},optional,{c,tuple_set,[{4,[{c,tuple,[{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer}],{4,any}}]},{8,[{c,tuple,[{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer}],{8,any}}]}],unknown}},{{c,atom,[properties],unknown},optional,{c,map,{[],{c,atom,any,unknown},any},unknown}},{{c,atom,[proto_ver],unknown},optional,{c,union,[none,{c,binary,{8,0},unknown},none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none],unknown}},{{c,atom,[protocol],unknown},optional,{c,atom,any,unknown}},{{c,atom,[username],unknown},optional,{c,union,[{c,atom,[undefined],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}}],{c,atom,any,unknown},any},unknown},{c,binary,{8,0},unknown},{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{any,{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,nil,[],unknown},none,none,none,none],unknown}},unknown},{c,number,{int_rng,0,255},integer},none,none,none],unknown},{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,nil,[],unknown},none,none,none,none],unknown}},unknown},none,none,none,none],unknown},{c,number,any,integer},any],{10,{c,atom,[message],unknown}}}],{3,{c,atom,[delivery],unknown}}}]},{emqx_exhook_proto_v1,server_info,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,binary,{8,0},unknown}]},{emqx_node_rebalance,is_node_available,0} => {{c,atom,any,unknown},[]},{emqx_ds_proto_v3,drop_db,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,atom,any,unknown}]},{emqx_eviction_agent,purge_sessions,1} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},{c,atom,[disabled],unknown}],{2,{c,atom,[error],unknown}}},none,none],unknown},[any]},{emqx_management_proto_v3,list_listeners,1} => {any,[{c,atom,any,unknown}]},{emqx_bridge_proto_v6,restart_bridge_to_node,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_bridge_proto_v5,v2_start_bridge_to_node,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_proto_v1,get_alarms,2} => {any,[{c,atom,any,unknown},{c,atom,[activated,all,deactivated],unknown}]},{emqx_node_rebalance_proto_v1,disconnected_session_counts,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_mgmt_trace_proto_v1,trace_file,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,union,[{c,atom,any,unknown},none,none,none,{c,list,{any,{c,nil,[],unknown}},unknown},{c,number,{int_rng,0,1114111},integer},none,none,none],unknown},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_bridge_proto_v6,v2_start_bridge_on_all_nodes_v6,4} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,atom,[actions,sources],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_gateway_cm_proto_v1,call,4} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown},any]},{emqx_mgmt_trace_proto_v1,read_trace_file,4} => {any,[{c,atom,any,unknown},{c,binary,{8,0},unknown},{c,number,{int_rng,0,pos_inf},integer},{c,number,{int_rng,0,pos_inf},integer}]},{ssl_pem_cache,clear,0} => {any,[]},{emqx_node_rebalance_api_proto_v2,node_rebalance_evacuation_start,2} => {any,[{c,atom,any,unknown},{c,map,{[{{c,atom,[conn_evict_rate],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[migrate_to],unknown},optional,{c,union,[{c,atom,[undefined],unknown},none,none,none,{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}},{{c,atom,[server_reference],unknown},optional,{c,union,[{c,atom,[undefined],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}},{{c,atom,[sess_evict_rate],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[wait_health_check],unknown},optional,{c,number,any,unknown}},{{c,atom,[wait_takeover],unknown},optional,{c,number,any,unknown}}],none,none},unknown}]},{emqx_node_rebalance,session_count,0} => {{c,tuple,[{c,atom,[ok],unknown},any],{2,{c,atom,[ok],unknown}}},[]},{emqx_mgmt_api_plugins,install_package,2} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},{c,map,{[],any,any},unknown}],{2,{c,atom,[error],unknown}}},none,none],unknown},[{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{{c,union,[none,none,none,none,{c,list,{any,{c,nil,[],unknown}},unknown},{c,number,{int_rng,0,1114111},integer},none,none,none],unknown},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{any,{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,nil,[],unknown},none,none,none,none],unknown}},unknown},{c,number,{int_rng,0,255},integer},none,none,none],unknown},{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,nil,[],unknown},none,none,none,none],unknown}},unknown},none,none,none,none],unknown}]},{emqx_management_proto_v3,broker_info,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_management_proto_v3,node_info,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_node_rebalance_proto_v2,disable_rebalance_agent,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,identifier,[pid],unknown}]},{emqx_conf_proto_v2,get_all,1} => {any,[{c,list,{{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,nil,[],unknown}},unknown}]},{emqx_management_proto_v3,list_subscriptions,1} => {any,[{c,atom,any,unknown}]},{emqx_persistent_session_ds_proto_v1,close_all_iterators,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,binary,{8,0},unknown}]},{emqx_node_rebalance_status_proto_v2,rebalance_status,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_management_proto_v2,call_client,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},any]},{emqx_node_rebalance_evacuation_proto_v1,available_nodes,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_bridge_proto_v6,v2_list_bridges_on_nodes_v6,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,atom,[actions,sources],unknown}]},{emqx_retainer_dispatcher,wait_dispatch_complete,1} => {{c,atom,[ok],unknown},[any]},{emqx_ds_replication_layer,do_next_v1,4} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[ok],unknown},{c,atom,[end_of_stream],unknown}],{2,{c,atom,[ok],unknown}}}]},{3,[{c,tuple,[{c,atom,[error],unknown},{c,atom,[recoverable,unrecoverable],unknown},any],{3,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},{c,opaque,[{opaque,emqx_ds_storage_layer,iterator,0,{c,map,{[{{c,number,{int_set,[1]},integer},mandatory,{c,number,{int_set,[2]},integer}},{{c,number,{int_set,[2]},integer},mandatory,{c,number,{int_rng,0,1114111},integer}},{{c,number,{int_set,[3]},integer},mandatory,any}],none,none},unknown}}],unknown},{c,list,{{c,tuple,[{c,binary,{8,0},unknown},{c,tuple,[any,any,any,any,any,any,any,any,any,any],{10,any}}],{2,any}},{c,nil,[],unknown}},unknown}],{3,{c,atom,[ok],unknown}}}]}],unknown},[{c,atom,any,unknown},{c,binary,{8,0},unknown},{c,opaque,[{opaque,emqx_ds_storage_layer,iterator,0,{c,map,{[{{c,number,{int_set,[1]},integer},mandatory,{c,number,{int_set,[2]},integer}},{{c,number,{int_set,[2]},integer},mandatory,{c,number,{int_rng,0,1114111},integer}},{{c,number,{int_set,[3]},integer},mandatory,any}],none,none},unknown}}],unknown},{c,number,{int_rng,1,pos_inf},integer}]},{emqx_management_proto_v3,call_client,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},any]},{emqx_node_rebalance_proto_v3,connection_counts,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_ds_proto_v2,update_iterator,5} => {any,[{c,atom,any,unknown},{c,atom,any,unknown},{c,binary,{8,0},unknown},{c,opaque,[{opaque,emqx_ds_storage_layer,iterator,0,{c,map,{[{{c,number,{int_set,[1]},integer},mandatory,{c,number,{int_set,[2]},integer}},{{c,number,{int_set,[2]},integer},mandatory,{c,number,{int_rng,0,1114111},integer}},{{c,number,{int_set,[3]},integer},mandatory,any}],none,none},unknown}}],unknown},{c,binary,{8,0},unknown}]},{emqx_exhook_mgr,all_servers_info,0} => {any,[]},{emqx_management_proto_v2,unsubscribe_batch,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,list,{{c,binary,{8,0},unknown},{c,nil,[],unknown}},unknown}]},{emqx_bridge_proto_v6,list_bridges_on_nodes,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_delayed_proto_v2,get_delayed_message,2} => {any,[{c,atom,any,unknown},{c,binary,{8,0},unknown}]},{emqx_node_rebalance_agent,enable,2} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},{c,atom,[eviction_agent_busy,invalid_coordinator],unknown}],{2,{c,atom,[error],unknown}}},none,none],unknown},[{c,identifier,[pid],unknown},any]},{emqx_ft_storage_fs_proxy,list_local,2} => {any,[any,any]},{emqx_conf_proto_v2,get_config,3} => {any,[{c,atom,any,unknown},{c,list,{{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,nil,[],unknown}},unknown},any]},{emqx_prometheus,do_stop,0} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},{c,atom,[not_found,restarting,running,simple_one_for_one],unknown}],{2,{c,atom,[error],unknown}}},none,none],unknown},[]},{emqx_proto_v1,get_stats,1} => {any,[{c,atom,any,unknown}]},{emqx_bridge_proto_v5,restart_bridges_to_all_nodes,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_ft_storage_fs_proto_v1,pread,5} => {any,[{c,atom,any,unknown},{c,tuple,[{c,binary,{8,0},unknown},{c,binary,{8,0},unknown}],{2,any}},{c,map,{[{{c,atom,[fragment],unknown},mandatory,{c,tuple_set,[{2,[{c,tuple,[{c,atom,[filemeta],unknown},{c,map,{[{{c,atom,[checksum],unknown},optional,{c,tuple,[{c,atom,any,unknown},{c,binary,{8,0},unknown}],{2,any}}},{{c,atom,[expire_at],unknown},mandatory,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[name],unknown},mandatory,{c,list,{{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}},unknown}},{{c,atom,[segments_ttl],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[size],unknown},optional,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[user_data],unknown},optional,{c,union,[{c,atom,[false,null,true],unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,union,[{c,atom,[false,null,true],unknown},{c,binary,{8,0},unknown},none,none,{c,list,{any,{c,nil,[],unknown}},unknown},{c,number,any,unknown},none,none,{c,map,{[],{c,binary,{8,0},unknown},any},unknown}],unknown},{c,nil,[],unknown}},unknown},{c,number,any,unknown},none,none,{c,map,{[],{c,binary,{8,0},unknown},{c,union,[{c,atom,[false,null,true],unknown},{c,binary,{8,0},unknown},none,none,{c,list,{any,{c,nil,[],unknown}},unknown},{c,number,any,unknown},none,none,{c,map,{[],{c,binary,{8,0},unknown},any},unknown}],unknown}},unknown}],unknown}}],none,none},unknown}],{2,{c,atom,[filemeta],unknown}}},{c,tuple,[{c,atom,[segment],unknown},{c,map,{[{{c,atom,[offset],unknown},mandatory,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[size],unknown},mandatory,{c,number,{int_rng,0,pos_inf},integer}}],none,none},unknown}],{2,{c,atom,[segment],unknown}}}]}],unknown}},{{c,atom,[path],unknown},mandatory,{c,union,[{c,atom,any,unknown},none,none,none,{c,list,{{c,union,[{c,atom,any,unknown},none,none,none,{c,list,{any,{c,nil,[],unknown}},unknown},{c,number,{int_rng,0,1114111},integer},none,none,none],unknown},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}},{{c,atom,[size],unknown},mandatory,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[timestamp],unknown},mandatory,{c,number,{int_rng,0,pos_inf},integer}}],none,none},unknown},{c,number,{int_rng,0,pos_inf},integer},{c,number,{int_rng,0,pos_inf},integer}]},{emqx_bridge_proto_v1,list_bridges,1} => {any,[{c,atom,any,unknown}]},{emqx,get_config,1} => {any,[{c,list,{any,{c,nil,[],unknown}},unknown}]},{emqx_telemetry,get_node_uuid,0} => {any,[]},{emqx_conf_proto_v1,reset,2} => {any,[{c,list,{{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,nil,[],unknown}},nonempty},{c,map,{[{{c,atom,[lazy_evaluator],unknown},optional,{c,function,{{c,product,[{c,function,{any,any},unknown}],unknown},any},unknown}},{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_mgmt_data_backup,read_file,1} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},{c,atom,any,unknown}],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},{c,binary,{8,0},unknown}],{2,{c,atom,[ok],unknown}}}]}],unknown},none,none],unknown},[{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{any,{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,nil,[],unknown},none,none,none,none],unknown}},unknown},{c,number,{int_rng,0,1114111},integer},none,none,none],unknown},{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,nil,[],unknown},none,none,none,none],unknown}},unknown},none,none,none,none],unknown}]},{emqx_authz_cache,drain_cache,0} => {{c,atom,[ok],unknown},[]},{emqx_ds_proto_v4,get_streams,5} => {any,[{c,atom,any,unknown},{c,atom,any,unknown},{c,binary,{8,0},unknown},{c,list,{{c,union,[{c,atom,['','#','+'],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,nil,[],unknown}},unknown},{c,number,{int_rng,0,pos_inf},integer}]},{emqx_topic_metrics_proto_v1,metrics,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,binary,{8,0},unknown}]},{emqx_ds_proto_v2,drop_db,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,atom,any,unknown}]},{emqx_ft_storage_fs_reader_proto_v1,read,3} => {any,[{c,atom,any,unknown},{c,identifier,[pid],unknown},{c,number,{int_rng,1,pos_inf},integer}]},{emqx_bridge_proto_v6,restart_bridges_to_all_nodes,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_mgmt,do_unsubscribe,2} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},{c,atom,[channel_not_found],unknown}],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[unsubscribe],unknown},{c,list,{{c,tuple,[{c,union,[none,{c,binary,{8,0},unknown},none,none,none,none,{c,tuple,[any,any,any],{3,any}},none,none],unknown},{c,map,{[],any,any},unknown}],{2,any}},{c,nil,[],unknown}},nonempty}],{2,{c,atom,[unsubscribe],unknown}}}]}],unknown},[any,any]},{emqx_resource,create_dry_run_local,2} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},any],{2,{c,atom,[error],unknown}}},none,none],unknown},[{c,atom,any,unknown},any]},{emqx_bridge_proto_v3,start_bridges_to_all_nodes,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_management_proto_v2,list_listeners,1} => {any,[{c,atom,any,unknown}]},{emqx_prometheus_api,lookup_from_local_nodes,3} => {any,[{c,union,[{c,atom,any,unknown},none,none,none,none,none,{c,tuple,any,{any,any}},none,none],unknown},{c,atom,any,unknown},{c,list,{any,{c,nil,[],unknown}},unknown}]},{emqx_conf_cli,get_config,1} => {{c,union,[none,none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},{c,list,{{c,number,{int_set,"_defknotuy"},integer},{c,nil,[],unknown}},nonempty}],{2,{c,atom,[error],unknown}}},none,{c,map,{[],any,any},unknown}],unknown},[{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_node_rebalance_proto_v3,available_nodes,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_bridge_proto_v4,start_bridge_to_node,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_node_rebalance_proto_v1,evict_sessions,4} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,number,{int_rng,0,pos_inf},integer},{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,atom,[connected,connecting,disconnected,idle,reauthenticating],unknown}]},{emqx_proto_v1,deactivate_alarm,2} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}]},{emqx_authz_cache,drain_cache,1} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},{c,atom,[not_found],unknown}],{2,{c,atom,[error],unknown}}},none,none],unknown},[{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}]},{emqx_bridge_proto_v2,stop_bridges_to_all_nodes,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_delayed_proto_v3,get_delayed_message,2} => {any,[{c,atom,any,unknown},{c,binary,{8,0},unknown}]},{emqx_conf_proto_v3,remove_config,3} => {any,[{c,atom,any,unknown},{c,list,{{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,nil,[],unknown}},nonempty},{c,map,{[{{c,atom,[lazy_evaluator],unknown},optional,{c,function,{{c,product,[{c,function,{any,any},unknown}],unknown},any},unknown}},{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_node_rebalance_status_proto_v2,purge_status,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_eviction_agent,all_local_channels_count,0} => {any,[]},{emqx_mgmt_api_plugins,get_plugins,0} => {{c,tuple,[{c,atom,any,unknown},{c,list,{{c,map,{[],any,any},unknown},{c,nil,[],unknown}},unknown}],{2,any}},[]},{emqx_management_proto_v4,get_full_config,1} => {any,[{c,atom,any,unknown}]},{emqx_authz_proto_v1,lookup_from_all_nodes,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,atom,any,unknown}]},{emqx_proto_v2,is_running,1} => {any,[{c,atom,any,unknown}]},{emqx_mgmt_trace_proto_v2,trace_file_detail,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,union,[{c,atom,any,unknown},none,none,none,{c,list,{any,{c,nil,[],unknown}},unknown},{c,number,{int_rng,0,1114111},integer},none,none,none],unknown},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_cm,do_get_chan_info,2} => {any,[any,any]},{emqx,is_running,0} => {{c,atom,[false,true],unknown},[]},{emqx_ds_proto_v1,next,5} => {any,[{c,atom,any,unknown},{c,atom,any,unknown},{c,binary,{8,0},unknown},{c,opaque,[{opaque,emqx_ds_storage_layer,iterator,0,{c,map,{[{{c,number,{int_set,[1]},integer},mandatory,{c,number,{int_set,[2]},integer}},{{c,number,{int_set,[2]},integer},mandatory,{c,number,{int_rng,0,1114111},integer}},{{c,number,{int_set,[3]},integer},mandatory,any}],none,none},unknown}}],unknown},{c,number,{int_rng,1,pos_inf},integer}]},{emqx_mgmt,do_list_subscriptions,0} => {none,[]},{emqx_persistent_session_ds_proto_v1,close_iterator,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},any]},{emqx_ds_proto_v1,get_streams,5} => {any,[{c,atom,any,unknown},{c,atom,any,unknown},{c,binary,{8,0},unknown},{c,list,{{c,union,[{c,atom,['','#','+'],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,nil,[],unknown}},unknown},{c,number,{int_rng,0,pos_inf},integer}]},{emqx_mgmt,node_info,0} => {{c,map,{[{{c,atom,[cluster_sessions],unknown},mandatory,any},{{c,atom,[connections],unknown},mandatory,any},{{c,atom,[edition],unknown},mandatory,{c,binary,{0,80},unknown}},{{c,atom,[live_connections],unknown},mandatory,any},{{c,atom,[load1],unknown},optional,{c,number,any,float}},{{c,atom,[load15],unknown},optional,{c,number,any,float}},{{c,atom,[load5],unknown},optional,{c,number,any,float}},{{c,atom,[log_path],unknown},mandatory,{c,binary,{8,0},unknown}},{{c,atom,[max_fds],unknown},mandatory,any},{{c,atom,[memory_total],unknown},mandatory,{c,number,any,unknown}},{{c,atom,[memory_used],unknown},mandatory,{c,number,any,integer}},{{c,atom,[node],unknown},mandatory,{c,atom,any,unknown}},{{c,atom,[node_status],unknown},mandatory,{c,atom,[running],unknown}},{{c,atom,[otp_release],unknown},mandatory,{c,binary,{8,0},unknown}},{{c,atom,[process_available],unknown},mandatory,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[process_used],unknown},mandatory,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[role],unknown},mandatory,{c,atom,[core,replicant],unknown}},{{c,atom,[sys_path],unknown},mandatory,{c,binary,{8,0},unknown}},{{c,atom,[uptime],unknown},mandatory,any},{{c,atom,[version],unknown},mandatory,{c,binary,{8,0},unknown}}],none,none},unknown},[]},{emqx_bridge_proto_v6,stop_bridges_to_all_nodes,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_delayed_proto_v2,delete_delayed_message,2} => {any,[{c,atom,any,unknown},{c,binary,{8,0},unknown}]},{emqx_bridge_proto_v2,restart_bridges_to_all_nodes,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_ds_replication_layer,do_store_batch_v1,4} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},{c,atom,[recoverable,unrecoverable],unknown},any],{3,{c,atom,[error],unknown}}},none,none],unknown},[{c,atom,any,unknown},{c,binary,{8,0},unknown},{c,map,{[{{c,number,{int_set,[1]},integer},mandatory,{c,number,{int_set,[3]},integer}},{{c,number,{int_set,[2]},integer},mandatory,{c,list,{{c,tuple,[{c,atom,[message],unknown},{c,binary,{8,0},unknown},any,{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,map,{[],any,any},unknown},{c,map,{[],any,any},unknown},{c,binary,{8,0},unknown},{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{any,{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,nil,[],unknown},none,none,none,none],unknown}},unknown},none,none,none,none],unknown},{c,number,any,integer},any],{10,{c,atom,[message],unknown}}},{c,nil,[],unknown}},unknown}}],any,any},unknown},{c,map,{[{{c,atom,[atomic],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[sync],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_broker_proto_v1,list_subscriptions_via_topic,2} => {any,[{c,atom,any,unknown},{c,binary,{8,0},unknown}]},{emqx_ft_storage_exporter_fs_proxy,list_exports_local,1} => {any,[any]},{emqx_ds_replication_layer,do_get_streams_v2,4} => {{c,list,{{c,tuple,[{c,number,{int_rng,0,1114111},integer},{c,opaque,[{opaque,emqx_ds_storage_layer,stream,0,{c,list,{any,any},nonempty}}],unknown}],{2,any}},{c,nil,[],unknown}},unknown},[{c,atom,any,unknown},{c,binary,{8,0},unknown},{c,list,{{c,union,[{c,atom,['','#','+'],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,nil,[],unknown}},unknown},{c,number,{int_rng,0,pos_inf},integer}]},{emqx_retainer_proto_v1,wait_dispatch_complete,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none],unknown}]},{emqx_mgmt_data_backup_proto_v1,read_file,3} => {any,[{c,atom,any,unknown},{c,binary,{8,0},unknown},{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none],unknown}]},{emqx_mgmt_cluster_proto_v1,invite_node,2} => {any,[{c,atom,any,unknown},{c,atom,any,unknown}]},{emqx_management_proto_v2,node_info,1} => {any,[{c,atom,any,unknown}]},{emqx_broker,subscriptions,1} => {{c,list,{{c,tuple,[any,any],{2,any}},{c,nil,[],unknown}},unknown},[{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,{c,identifier,[pid],unknown},none,none,none,none,none],unknown}]},{emqx_mgmt_api_cluster,join,1} => {{c,union,[{c,atom,[ignore,ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},any],{2,{c,atom,[error],unknown}}},none,none],unknown},[{c,atom,any,unknown}]},{emqx_bridge_proto_v2,lookup_from_all_nodes,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_cm_proto_v2,get_chan_info,2} => {any,[{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_ds_replication_layer,do_get_streams_v1,4} => {none,[any,any,any,any]},{emqx_node_rebalance,disconnected_session_count,0} => {{c,tuple,[{c,atom,[ok],unknown},any],{2,{c,atom,[ok],unknown}}},[]},{emqx_node_rebalance_proto_v1,connection_counts,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_gateway_cm,do_set_chan_stats,4} => {{c,atom,[false,true],unknown},[any,any,any,any]},{emqx_plugins,get_tar,1} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},any],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},{c,binary,{8,0},unknown}],{2,{c,atom,[ok],unknown}}}]}],unknown},[{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{any,{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,nil,[],unknown},none,none,none,none],unknown}},unknown},{c,number,{int_rng,0,1114111},integer},none,none,none],unknown}]},{emqx_proto_v2,delete_all_deactivated_alarms,1} => {any,[{c,atom,any,unknown}]},{emqx_telemetry,get_cluster_uuid,0} => {any,[]},{emqx_dashboard_proto_v1,do_sample,2} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,1,pos_inf},integer},none,none,none],unknown}]},{emqx_gateway_cm_proto_v1,takeover_session,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_bridge_resource,start,2} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},any],{2,{c,atom,[error],unknown}}},none,none],unknown},[any,any]},{emqx_bridge_v2_api,lookup_from_local_node,2} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},{c,atom,[not_found],unknown}],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},any],{2,{c,atom,[ok],unknown}}}]}],unknown},[{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_cm_proto_v1,kick_session,3} => {any,[{c,atom,[discard,kick],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_delayed,get_delayed_message,1} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},{c,atom,[not_found],unknown}],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},{c,map,{[{{c,atom,[delayed_interval],unknown},mandatory,any},{{c,atom,[delayed_remaining],unknown},mandatory,{c,number,any,integer}},{{c,atom,[expected_at],unknown},mandatory,{c,binary,{8,0},unknown}},{{c,atom,[from_clientid],unknown},mandatory,{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}},{{c,atom,[from_username],unknown},mandatory,any},{{c,atom,[msgid],unknown},mandatory,{c,binary,{8,0},unknown}},{{c,atom,[node],unknown},mandatory,any},{{c,atom,[payload],unknown},optional,{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{any,{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,nil,[],unknown},none,none,none,none],unknown}},unknown},{c,number,{int_rng,0,255},integer},none,none,none],unknown},{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,nil,[],unknown},none,none,none,none],unknown}},unknown},none,none,none,none],unknown}},{{c,atom,[publish_at],unknown},mandatory,{c,binary,{8,0},unknown}},{{c,atom,[qos],unknown},mandatory,any},{{c,atom,[topic],unknown},mandatory,{c,binary,{8,0},unknown}}],none,none},unknown}],{2,{c,atom,[ok],unknown}}}]}],unknown},[any]},{emqx_node_rebalance_proto_v2,enable_rebalance_agent,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,identifier,[pid],unknown},any]},{emqx_mgmt_trace_proto_v2,get_trace_size,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_management_proto_v4,node_info,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_conf_proto_v3,update,4} => {any,[{c,atom,any,unknown},{c,list,{{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,nil,[],unknown}},nonempty},any,{c,map,{[{{c,atom,[lazy_evaluator],unknown},optional,{c,function,{{c,product,[{c,function,{any,any},unknown}],unknown},any},unknown}},{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_ds_proto_v4,drop_generation,4} => {any,[{c,atom,any,unknown},{c,atom,any,unknown},{c,binary,{8,0},unknown},{c,number,{int_rng,0,1114111},integer}]},{emqx_bridge_proto_v3,start_bridge_to_node,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_conf_proto_v3,get_hocon_config,1} => {any,[{c,atom,any,unknown}]},{emqx_resource_proto_v1,create_dry_run,2} => {any,[{c,atom,any,unknown},any]},{emqx_ds_replication_layer,do_add_generation_v2,1} => {{c,atom,[ok],unknown},[{c,atom,any,unknown}]},{emqx_node_rebalance_agent,disable,2} => {any,[any,any]},{emqx_conf_proto_v2,update,4} => {any,[{c,atom,any,unknown},{c,list,{{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,nil,[],unknown}},nonempty},any,{c,map,{[{{c,atom,[lazy_evaluator],unknown},optional,{c,function,{{c,product,[{c,function,{any,any},unknown}],unknown},any},unknown}},{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_node_rebalance_proto_v3,purge_sessions,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,number,{int_rng,0,pos_inf},integer}]},{emqx_connector_proto_v1,lookup_from_all_nodes,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_ft_storage_exporter_fs_proxy,read_export_file_local,2} => {any,[any,any]},{emqx_conf_proto_v1,update,3} => {any,[{c,list,{{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,nil,[],unknown}},nonempty},any,{c,map,{[{{c,atom,[lazy_evaluator],unknown},optional,{c,function,{{c,product,[{c,function,{any,any},unknown}],unknown},any},unknown}},{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx,reset_config,2} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},any],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},{c,map,{[{{c,atom,[config],unknown},optional,{c,union,[{c,atom,[undefined],unknown},none,none,none,{c,list,{any,{c,nil,[],unknown}},unknown},none,none,none,{c,map,{[],{c,atom,any,unknown},any},unknown}],unknown}},{{c,atom,[post_config_update],unknown},optional,{c,map,{[],{c,atom,any,unknown},any},unknown}},{{c,atom,[raw_config],unknown},optional,{c,union,[{c,atom,[undefined],unknown},none,none,none,{c,list,{any,{c,nil,[],unknown}},unknown},none,none,none,{c,map,{[],{c,binary,{8,0},unknown},any},unknown}],unknown}}],none,none},unknown}],{2,{c,atom,[ok],unknown}}}]}],unknown},[{c,list,{{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,nil,[],unknown}},nonempty},any]},{emqx_management_proto_v4,kickout_clients,2} => {any,[{c,atom,any,unknown},{c,list,{{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,nil,[],unknown}},unknown}]},{emqx_bridge_proto_v6,stop_bridge_to_node,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_ds_proto_v4,list_generations_with_lifetimes,3} => {any,[{c,atom,any,unknown},{c,atom,any,unknown},{c,binary,{8,0},unknown}]},{emqx_conf_proto_v2,remove_config,2} => {any,[{c,list,{{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,nil,[],unknown}},nonempty},{c,map,{[{{c,atom,[lazy_evaluator],unknown},optional,{c,function,{{c,product,[{c,function,{any,any},unknown}],unknown},any},unknown}},{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_management_proto_v1,broker_info,1} => {any,[{c,atom,any,unknown}]},{emqx_license_proto_v2,remote_connection_counts,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx,remove_config,2} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},any],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},{c,map,{[{{c,atom,[config],unknown},optional,{c,union,[{c,atom,[undefined],unknown},none,none,none,{c,list,{any,{c,nil,[],unknown}},unknown},none,none,none,{c,map,{[],{c,atom,any,unknown},any},unknown}],unknown}},{{c,atom,[post_config_update],unknown},optional,{c,map,{[],{c,atom,any,unknown},any},unknown}},{{c,atom,[raw_config],unknown},optional,{c,union,[{c,atom,[undefined],unknown},none,none,none,{c,list,{any,{c,nil,[],unknown}},unknown},none,none,none,{c,map,{[],{c,binary,{8,0},unknown},any},unknown}],unknown}}],none,none},unknown}],{2,{c,atom,[ok],unknown}}}]}],unknown},[{c,list,{{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,nil,[],unknown}},nonempty},{c,map,{[{{c,atom,[lazy_evaluator],unknown},optional,{c,function,{{c,product,[{c,function,{any,any},unknown}],unknown},any},unknown}},{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_authn_api,lookup_from_local_node,2} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},{c,tuple,[{c,atom,any,unknown},{c,union,[{c,atom,[not_found_resource],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}],{2,any}}],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},{c,tuple,[{c,atom,any,unknown},{c,atom,[connected,connecting,disconnected,stopped],unknown},{c,map,{[{{c,atom,[counters],unknown},mandatory,{c,map,{[],any,any},unknown}},{{c,atom,[gauges],unknown},mandatory,{c,map,{[],any,any},unknown}},{{c,atom,[rate],unknown},mandatory,{c,map,{[],any,any},unknown}},{{c,atom,[slides],unknown},mandatory,{c,map,{[],any,any},unknown}}],none,none},unknown},{c,map,{[{{c,atom,[counters],unknown},optional,{c,map,{[],any,any},unknown}},{{c,atom,[gauges],unknown},optional,{c,map,{[],any,any},unknown}},{{c,atom,[rate],unknown},optional,{c,map,{[],any,any},unknown}},{{c,atom,[slides],unknown},optional,{c,map,{[],any,any},unknown}}],none,none},unknown}],{4,any}}],{2,{c,atom,[ok],unknown}}}]}],unknown},[{c,atom,any,unknown},{c,binary,{8,0},unknown}]},{emqx_alarm,deactivate,1} => {any,[any]},{emqx_mgmt,do_kickout_clients,1} => {{c,atom,[ok],unknown},[{c,list,{any,{c,nil,[],unknown}},unknown}]},{emqx_mgmt_data_backup_proto_v1,delete_file,3} => {any,[{c,atom,any,unknown},{c,binary,{8,0},unknown},{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none],unknown}]},{emqx_bridge_v2_api,get_metrics_from_local_node_v6,3} => {{c,map,{[{{c,atom,[dropped],unknown},mandatory,{c,number,any,integer}},{{c,atom,['dropped.expired'],unknown},mandatory,{c,number,any,integer}},{{c,atom,['dropped.other'],unknown},mandatory,{c,number,any,integer}},{{c,atom,['dropped.queue_full'],unknown},mandatory,{c,number,any,integer}},{{c,atom,['dropped.resource_not_found'],unknown},mandatory,{c,number,any,integer}},{{c,atom,['dropped.resource_stopped'],unknown},mandatory,{c,number,any,integer}},{{c,atom,[failed],unknown},mandatory,{c,number,any,integer}},{{c,atom,[inflight],unknown},mandatory,any},{{c,atom,[late_reply],unknown},mandatory,{c,number,any,integer}},{{c,atom,[matched],unknown},mandatory,{c,number,any,integer}},{{c,atom,[queuing],unknown},mandatory,any},{{c,atom,[rate],unknown},mandatory,any},{{c,atom,[rate_last5m],unknown},mandatory,any},{{c,atom,[rate_max],unknown},mandatory,any},{{c,atom,[received],unknown},mandatory,{c,number,any,integer}},{{c,atom,[retried],unknown},mandatory,{c,number,any,integer}},{{c,atom,[success],unknown},mandatory,{c,number,any,integer}}],none,none},unknown},[{c,atom,[actions,sources],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_proto_v2,deactivate_alarm,2} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}]},{emqx_broker,subscriptions_via_topic,1} => {{c,list,{any,{c,nil,[],unknown}},unknown},[any]},{emqx_node_rebalance_agent,enable,3} => {any,[any,any,any]},{emqx_ds_proto_v3,add_generation,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,atom,any,unknown}]},{emqx_management_proto_v5,list_subscriptions,1} => {any,[{c,atom,any,unknown}]},{emqx_topic_metrics,reset,1} => {any,[any]},{emqx_mgmt,broker_info,0} => {{c,map,{[{{c,atom,[node],unknown},mandatory,{c,atom,any,unknown}},{{c,atom,[node_status],unknown},mandatory,{c,atom,[running],unknown}},{{c,atom,[otp_release],unknown},mandatory,{c,binary,{8,0},unknown}}],any,any},unknown},[]},{emqx_node_rebalance_purge_proto_v1,stop,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_bridge_proto_v4,start_bridges_to_all_nodes,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_conf_proto_v1,remove_config,2} => {any,[{c,list,{{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,nil,[],unknown}},nonempty},{c,map,{[{{c,atom,[lazy_evaluator],unknown},optional,{c,function,{{c,product,[{c,function,{any,any},unknown}],unknown},any},unknown}},{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_cm_proto_v2,lookup_client,2} => {any,[{c,atom,any,unknown},{c,tuple_set,[{2,[{c,tuple,[{c,atom,[clientid],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}],{2,{c,atom,[clientid],unknown}}},{c,tuple,[{c,atom,[username],unknown},{c,union,[{c,atom,[undefined],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}],{2,{c,atom,[username],unknown}}}]}],unknown}]},{emqx_cm,takeover_session,2} => {{c,union,[{c,atom,[none,ok,undefined],unknown},none,none,none,{c,list,{{c,tuple,[{c,atom,any,unknown},any],{2,any}},{c,nil,[],unknown}},unknown},none,{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},any],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[expired],unknown},{c,union,[none,none,none,none,none,none,{c,tuple,[{c,atom,[session],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},any,{c,atom,[false,true],unknown},{c,map,{[],any,any},unknown},{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none],unknown},{c,atom,[false,true],unknown},{c,opaque,[{opaque,emqx_inflight,inflight,0,{c,tuple,[any,any,any],{3,any}}}],unknown},{c,tuple,[any,any,any,any,any,any,any,any,any,any,any],{11,any}},{c,number,{int_rng,1,1114111},integer},{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none],unknown},{c,map,{[],any,any},unknown},{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none],unknown},{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none],unknown},{c,number,{int_rng,1,pos_inf},integer}],{15,{c,atom,[session],unknown}}},none,{c,map,{[{{c,atom,[id],unknown},mandatory,{c,binary,{8,0},unknown}},{{c,atom,[inflight],unknown},mandatory,{c,tuple,[any,any,any,any,any,any,any,any,any,any],{10,any}}},{{c,atom,[props],unknown},mandatory,{c,map,{[],any,any},unknown}},{{c,atom,[replay],unknown},optional,{c,list,{any,{c,nil,[],unknown}},nonempty}},{{c,atom,[s],unknown},mandatory,{c,opaque,[{opaque,emqx_persistent_session_ds_state,t,0,{c,map,{[],any,any},unknown}}],unknown}},{{c,atom,[timer_bump_last_alive_at],unknown},optional,{c,identifier,[reference],unknown}},{{c,atom,[timer_get_streams],unknown},optional,{c,identifier,[reference],unknown}},{{c,atom,[timer_pull],unknown},optional,{c,identifier,[reference],unknown}},{{c,atom,[timer_retry_replay],unknown},optional,{c,identifier,[reference],unknown}}],none,none},unknown}],unknown}],{2,{c,atom,[expired],unknown}}},{c,tuple,[{c,atom,[ok],unknown},{c,union,[none,none,none,none,{c,list,{{c,tuple,[any,any,any],{3,any}},{c,nil,[],unknown}},unknown},none,none,none,{c,map,{[],any,any},unknown}],unknown}],{2,{c,atom,[ok],unknown}}},{c,tuple,[{c,atom,[persistent],unknown},{c,union,[none,none,none,none,none,none,{c,tuple,[{c,atom,[session],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},any,{c,atom,[false,true],unknown},{c,map,{[],any,any},unknown},{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none],unknown},{c,atom,[false,true],unknown},{c,opaque,[{opaque,emqx_inflight,inflight,0,{c,tuple,[any,any,any],{3,any}}}],unknown},{c,tuple,[any,any,any,any,any,any,any,any,any,any,any],{11,any}},{c,number,{int_rng,1,1114111},integer},{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none],unknown},{c,map,{[],any,any},unknown},{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none],unknown},{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none],unknown},{c,number,{int_rng,1,pos_inf},integer}],{15,{c,atom,[session],unknown}}},none,{c,map,{[{{c,atom,[id],unknown},mandatory,{c,binary,{8,0},unknown}},{{c,atom,[inflight],unknown},mandatory,{c,tuple,[any,any,any,any,any,any,any,any,any,any],{10,any}}},{{c,atom,[props],unknown},mandatory,{c,map,{[],any,any},unknown}},{{c,atom,[replay],unknown},optional,{c,list,{any,{c,nil,[],unknown}},nonempty}},{{c,atom,[s],unknown},mandatory,{c,opaque,[{opaque,emqx_persistent_session_ds_state,t,0,{c,map,{[],any,any},unknown}}],unknown}},{{c,atom,[timer_bump_last_alive_at],unknown},optional,{c,identifier,[reference],unknown}},{{c,atom,[timer_get_streams],unknown},optional,{c,identifier,[reference],unknown}},{{c,atom,[timer_pull],unknown},optional,{c,identifier,[reference],unknown}},{{c,atom,[timer_retry_replay],unknown},optional,{c,identifier,[reference],unknown}}],none,none},unknown}],unknown}],{2,{c,atom,[persistent],unknown}}}]},{4,[{c,tuple,[{c,atom,[living],unknown},{c,atom,any,unknown},{c,identifier,[pid],unknown},any],{4,{c,atom,[living],unknown}}}]}],unknown},none,{c,map,{[],{c,atom,any,unknown},any},unknown}],unknown},[any,any]},{emqx_topic_metrics_proto_v1,reset,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,binary,{8,0},unknown}]},{emqx_management_proto_v4,list_subscriptions,1} => {any,[{c,atom,any,unknown}]},{emqx_bridge_proto_v2,stop_bridge_to_node,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_telemetry_proto_v1,get_node_uuid,1} => {any,[{c,atom,any,unknown}]},{emqx_delayed_proto_v3,delete_delayed_message,2} => {any,[{c,atom,any,unknown},{c,binary,{8,0},unknown}]},{emqx_bridge_proto_v5,restart_bridge_to_node,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_topic_metrics,metrics,0} => {{c,list,{{c,map,{[{{c,atom,[create_time],unknown},mandatory,any},{{c,atom,[metrics],unknown},mandatory,{c,map,{[],any,any},unknown}},{{c,atom,[reset_time],unknown},optional,any},{{c,atom,[topic],unknown},mandatory,any}],none,none},unknown},{c,nil,[],unknown}},unknown},[]},{emqx_bridge_resource,stop,2} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},any],{2,{c,atom,[error],unknown}}},none,none],unknown},[any,any]},{emqx_node_rebalance_proto_v2,available_nodes,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_ds_replication_layer,do_drop_db_v1,1} => {{c,atom,[ok],unknown},[{c,atom,any,unknown}]},{emqx_authn_proto_v1,lookup_from_all_nodes,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,atom,any,unknown},{c,binary,{8,0},unknown}]},{emqx_resource_proto_v1,remove,1} => {any,[{c,binary,{8,0},unknown}]},{emqx_eviction_agent,evict_connections,1} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},{c,atom,[disabled],unknown}],{2,{c,atom,[error],unknown}}},none,none],unknown},[any]},{emqx_management_proto_v3,unsubscribe_batch,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,list,{{c,binary,{8,0},unknown},{c,nil,[],unknown}},unknown}]},{emqx_retainer_proto_v2,wait_dispatch_complete,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none],unknown}]},{emqx_node_rebalance_agent,enable,1} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},{c,atom,[eviction_agent_busy,invalid_coordinator],unknown}],{2,{c,atom,[error],unknown}}},none,none],unknown},[{c,identifier,[pid],unknown}]},{emqx_ds_proto_v3,next,5} => {any,[{c,atom,any,unknown},{c,atom,any,unknown},{c,binary,{8,0},unknown},{c,opaque,[{opaque,emqx_ds_storage_layer,iterator,0,{c,map,{[{{c,number,{int_set,[1]},integer},mandatory,{c,number,{int_set,[2]},integer}},{{c,number,{int_set,[2]},integer},mandatory,{c,number,{int_rng,0,1114111},integer}},{{c,number,{int_set,[3]},integer},mandatory,any}],none,none},unknown}}],unknown},{c,number,{int_rng,1,pos_inf},integer}]},{emqx_management_proto_v5,broker_info,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_trace,trace_file_detail,1} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},{c,map,{[{{c,atom,[file],unknown},mandatory,{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,union,[{c,atom,any,unknown},none,none,none,{c,list,{any,{c,nil,[],unknown}},unknown},{c,number,{int_rng,0,1114111},integer},none,none,none],unknown},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}},{{c,atom,[node],unknown},mandatory,{c,binary,{8,0},unknown}},{{c,atom,[reason],unknown},mandatory,{c,atom,any,unknown}}],none,none},unknown}],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},{c,map,{[{{c,atom,[mtime],unknown},mandatory,{c,union,[{c,atom,[undefined],unknown},none,none,none,none,{c,number,{int_rng,0,pos_inf},integer},{c,tuple,[{c,tuple,[any,any,any],{3,any}},{c,tuple,[any,any,any],{3,any}}],{2,any}},none,none],unknown}},{{c,atom,[node],unknown},mandatory,{c,binary,{8,0},unknown}},{{c,atom,[size],unknown},mandatory,{c,union,[{c,atom,[undefined],unknown},none,none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none],unknown}}],none,none},unknown}],{2,{c,atom,[ok],unknown}}}]}],unknown},[{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,union,[{c,atom,any,unknown},none,none,none,{c,list,{any,{c,nil,[],unknown}},unknown},{c,number,{int_rng,0,1114111},integer},none,none,none],unknown},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_node_rebalance_status,rebalance_status,0} => {{c,tuple,[{c,atom,any,unknown},{c,union,[{c,atom,[disabled],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[enabled],unknown},{c,map,{[],any,any},unknown}],{2,{c,atom,[enabled],unknown}}},none,none],unknown}],{2,any}},[]},{emqx_node_rebalance_api_proto_v1,node_rebalance_stop,1} => {any,[{c,atom,any,unknown}]},{emqx_ds_replication_layer,do_update_iterator_v2,4} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[ok],unknown},{c,opaque,[{opaque,emqx_ds_storage_layer,iterator,0,{c,map,{[{{c,number,{int_set,[1]},integer},mandatory,{c,number,{int_set,[2]},integer}},{{c,number,{int_set,[2]},integer},mandatory,{c,number,{int_rng,0,1114111},integer}},{{c,number,{int_set,[3]},integer},mandatory,any}],none,none},unknown}}],unknown}],{2,{c,atom,[ok],unknown}}}]},{3,[{c,tuple,[{c,atom,[error],unknown},{c,atom,[unrecoverable],unknown},{c,atom,[generation_not_found],unknown}],{3,{c,atom,[error],unknown}}}]}],unknown},[{c,atom,any,unknown},{c,binary,{8,0},unknown},{c,opaque,[{opaque,emqx_ds_storage_layer,iterator,0,{c,map,{[{{c,number,{int_set,[1]},integer},mandatory,{c,number,{int_set,[2]},integer}},{{c,number,{int_set,[2]},integer},mandatory,{c,number,{int_rng,0,1114111},integer}},{{c,number,{int_set,[3]},integer},mandatory,any}],none,none},unknown}}],unknown},{c,binary,{8,0},unknown}]},{emqx_node_rebalance_api_proto_v2,node_rebalance_purge_start,2} => {any,[{c,atom,any,unknown},{c,map,{[{{c,atom,[purge_rate],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}}],none,none},unknown}]},{emqx_bridge_proto_v4,stop_bridges_to_all_nodes,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_retainer_proto_v2,active_mnesia_indices,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_cm,do_get_chan_stats,2} => {any,[any,any]},{emqx_gateway_cm,do_call,4} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown},any]},{emqx_alarm,delete_all_deactivated_alarms,0} => {any,[]},{emqx_node_rebalance_proto_v2,enable_rebalance_agent,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,identifier,[pid],unknown}]},{emqx_ds_proto_v3,make_iterator,6} => {any,[{c,atom,any,unknown},{c,atom,any,unknown},{c,binary,{8,0},unknown},{c,opaque,[{opaque,emqx_ds_storage_layer,stream_v1,0,{c,map,{[{{c,number,{int_set,[1]},integer},mandatory,{c,number,{int_set,[1]},integer}},{{c,number,{int_set,[2]},integer},mandatory,{c,number,{int_rng,0,1114111},integer}},{{c,number,{int_set,[3]},integer},mandatory,any}],none,none},unknown}}],unknown},{c,list,{{c,union,[{c,atom,['','#','+'],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,nil,[],unknown}},unknown},{c,number,{int_rng,0,pos_inf},integer}]},{emqx_bridge_proto_v5,lookup_from_all_nodes,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_gateway_cm,do_takeover_session,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_metrics,all,0} => {{c,list,{{c,tuple,[any,{c,number,any,integer}],{2,any}},{c,nil,[],unknown}},unknown},[]},{emqx_metrics_proto_v1,get_metrics,4} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none],unknown}]},{emqx_ds_proto_v3,drop_generation,4} => {any,[{c,atom,any,unknown},{c,atom,any,unknown},{c,binary,{8,0},unknown},{c,number,{int_rng,0,1114111},integer}]},{emqx_retainer_mnesia,active_indices,0} => {{c,tuple,[any,any],{2,any}},[]},{emqx_management_proto_v5,get_full_config,1} => {any,[{c,atom,any,unknown}]},{emqx_mgmt_api_listeners,do_list_listeners,0} => {{c,map,{[],{c,binary,{40,32},unknown},{c,union,[{c,atom,any,unknown},none,none,none,{c,list,{{c,map,{[],any,any},unknown},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}},unknown},[]},{emqx_persistent_session_ds,do_ensure_all_iterators_closed,1} => {{c,atom,[ok],unknown},[any]},{emqx_bridge_proto_v3,list_bridges_on_nodes,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_conf_proto_v2,get_override_config_file,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_ft_storage_fs_proxy,pread_local,4} => {any,[any,any,any,any]},{emqx_mgmt_trace_proto_v1,get_trace_size,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_bridge_proto_v4,lookup_from_all_nodes,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_conf_proto_v3,get_hocon_config,2} => {any,[{c,atom,any,unknown},{c,binary,{8,0},unknown}]},{emqx_cm_proto_v2,kickout_client,2} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}]},{emqx_node_rebalance_evacuation,is_node_available,0} => {{c,atom,any,unknown},[]},{emqx_telemetry_proto_v1,get_cluster_uuid,1} => {any,[{c,atom,any,unknown}]},{emqx_node_rebalance_status,evacuation_status,0} => {{c,tuple,[{c,atom,any,unknown},{c,union,[{c,atom,[disabled],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[enabled],unknown},{c,map,{[{{c,atom,[conn_evict_rate],unknown},mandatory,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[current_conns],unknown},mandatory,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[current_sessions],unknown},mandatory,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[initial_conns],unknown},mandatory,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[initial_sessions],unknown},mandatory,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[migrate_to],unknown},mandatory,{c,union,[{c,atom,[undefined],unknown},none,none,none,{c,list,{any,{c,nil,[],unknown}},unknown},none,none,none,none],unknown}},{{c,atom,[server_reference],unknown},mandatory,{c,union,[{c,atom,[undefined],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}},{{c,atom,[sess_evict_rate],unknown},mandatory,{c,number,{int_rng,1,pos_inf},integer}}],none,none},unknown}],{2,{c,atom,[enabled],unknown}}},none,none],unknown}],{2,any}},[]},{emqx_mgmt_data_backup,delete_file,1} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},{c,atom,any,unknown}],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},{c,binary,{8,0},unknown}],{2,{c,atom,[ok],unknown}}}]}],unknown},none,none],unknown},[{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{any,{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,nil,[],unknown},none,none,none,none],unknown}},unknown},{c,number,{int_rng,0,1114111},integer},none,none,none],unknown},{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,nil,[],unknown},none,none,none,none],unknown}},unknown},none,none,none,none],unknown}]},{emqx_mgmt_api_plugins_proto_v1,delete_package,1} => {any,[{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_bridge_proto_v6,start_bridge_to_node,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_management_proto_v5,subscribe,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,list,{{c,tuple,[{c,binary,{8,0},unknown},{c,map,{[{{c,atom,[nl],unknown},mandatory,{c,number,{int_set,[0,1]},integer}},{{c,atom,[qos],unknown},mandatory,{c,number,{int_set,[0,1,2]},integer}},{{c,atom,[rap],unknown},mandatory,{c,number,{int_set,[0,1]},integer}},{{c,atom,[rh],unknown},mandatory,{c,number,{int_set,[0,1,2]},integer}}],{c,atom,any,unknown},any},unknown}],{2,any}},{c,nil,[],unknown}},unknown}]},{emqx_router_proto_v1,get_routing_schema_vsn,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_ds_proto_v4,update_iterator,5} => {any,[{c,atom,any,unknown},{c,atom,any,unknown},{c,binary,{8,0},unknown},{c,opaque,[{opaque,emqx_ds_storage_layer,iterator,0,{c,map,{[{{c,number,{int_set,[1]},integer},mandatory,{c,number,{int_set,[2]},integer}},{{c,number,{int_set,[2]},integer},mandatory,{c,number,{int_rng,0,1114111},integer}},{{c,number,{int_set,[3]},integer},mandatory,any}],none,none},unknown}}],unknown},{c,binary,{8,0},unknown}]},{emqx_metrics_worker,get_metrics,2} => {{c,map,{[{{c,atom,[counters],unknown},mandatory,{c,map,{[],any,any},unknown}},{{c,atom,[gauges],unknown},mandatory,{c,map,{[],any,any},unknown}},{{c,atom,[rate],unknown},mandatory,{c,map,{[],any,any},unknown}},{{c,atom,[slides],unknown},mandatory,{c,map,{[],any,any},unknown}}],none,none},unknown},[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}]},{erlang,send,2} => {any,[any,any]},{emqx_mgmt_data_backup_proto_v1,import_file,4} => {any,[{c,atom,any,unknown},{c,atom,any,unknown},{c,binary,{8,0},unknown},{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none],unknown}]},{emqx_trace,trace_file,1} => {{c,tuple_set,[{3,[{c,tuple,[{c,atom,[error],unknown},{c,list,{{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}},unknown},{c,atom,any,unknown}],{3,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},{c,list,{{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}},unknown},{c,binary,{8,0},unknown}],{3,{c,atom,[ok],unknown}}}]}],unknown},[{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,union,[{c,atom,any,unknown},none,none,none,{c,list,{any,{c,nil,[],unknown}},unknown},{c,number,{int_rng,0,1114111},integer},none,none,none],unknown},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_bridge_proto_v5,v2_lookup_from_all_nodes,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_broker,dispatch,2} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},{c,atom,[no_subscribers,not_running],unknown}],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},{c,number,{int_rng,0,pos_inf},integer}],{2,{c,atom,[ok],unknown}}}]}],unknown},[{c,binary,{8,0},unknown},{c,tuple,[{c,atom,[delivery],unknown},{c,identifier,[pid],unknown},{c,tuple,[{c,atom,[message],unknown},{c,binary,{8,0},unknown},any,{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,map,{[],{c,atom,any,unknown},{c,atom,[false,true],unknown}},unknown},{c,map,{[{{c,atom,[allow_publish],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[peerhost],unknown},optional,{c,tuple_set,[{4,[{c,tuple,[any,any,any,any],{4,any}}]},{8,[{c,tuple,[any,any,any,any,any,any,any,any],{8,any}}]}],unknown}},{{c,atom,[properties],unknown},optional,{c,map,{[],any,any},unknown}},{{c,atom,[proto_ver],unknown},optional,{c,union,[none,{c,binary,{8,0},unknown},none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none],unknown}},{{c,atom,[protocol],unknown},optional,{c,atom,any,unknown}},{{c,atom,[username],unknown},optional,{c,union,[{c,atom,[undefined],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}}],{c,atom,any,unknown},any},unknown},{c,binary,{8,0},unknown},{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{any,{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,nil,[],unknown},none,none,none,none],unknown}},unknown},{c,number,{int_rng,0,255},integer},none,none,none],unknown},{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,nil,[],unknown},none,none,none,none],unknown}},unknown},none,none,none,none],unknown},{c,number,any,integer},any],{10,{c,atom,[message],unknown}}}],{3,{c,atom,[delivery],unknown}}}]},{emqx_bridge_v2,start,2} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},any],{2,{c,atom,[error],unknown}}},none,none],unknown},[{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_bridge_proto_v4,stop_bridge_to_node,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_bridge_proto_v1,lookup_from_all_nodes,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_node_rebalance_evacuation,start,1} => {any,[{c,map,{[],any,any},unknown}]},{emqx_node_rebalance_proto_v2,purge_sessions,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,number,{int_rng,0,pos_inf},integer}]},{emqx_gateway_cm_proto_v1,get_chan_stats,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_conf_proto_v2,remove_config,3} => {any,[{c,atom,any,unknown},{c,list,{{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,nil,[],unknown}},nonempty},{c,map,{[{{c,atom,[lazy_evaluator],unknown},optional,{c,function,{{c,product,[{c,function,{any,any},unknown}],unknown},any},unknown}},{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_gateway_cm_proto_v1,cast,4} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown},any]},{emqx_bridge_proto_v2,restart_bridge_to_node,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_connector_proto_v1,list_connectors_on_nodes,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_gateway_cm_proto_v1,call,5} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown},any,{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none],unknown}]},{emqx_eviction_agent,evict_session_channel,3} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},any],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},{c,union,[{c,atom,[undefined],unknown},none,none,{c,identifier,[pid],unknown},none,none,none,none,none],unknown}],{2,{c,atom,[ok],unknown}}}]},{3,[{c,tuple,[{c,atom,[ok],unknown},{c,union,[{c,atom,[undefined],unknown},none,none,{c,identifier,[pid],unknown},none,none,none,none,none],unknown},any],{3,{c,atom,[ok],unknown}}}]}],unknown},[any,{c,map,{[{{c,atom,[clean_start],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[clientid],unknown},optional,{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}},{{c,atom,[conn_mod],unknown},mandatory,{c,atom,any,unknown}},{{c,atom,[conn_props],unknown},optional,{c,map,{[],{c,atom,any,unknown},any},unknown}},{{c,atom,[connected],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[connected_at],unknown},optional,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[disconnected_at],unknown},optional,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[expiry_interval],unknown},optional,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[keepalive],unknown},optional,{c,number,{int_rng,0,1114111},integer}},{{c,atom,[peercert],unknown},optional,{c,union,[{c,atom,[nossl,undefined],unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,union,[{c,atom,any,unknown},none,none,none,none,none,{c,tuple,any,{any,any}},none,none],unknown},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}},{{c,atom,[peername],unknown},mandatory,{c,tuple,[{c,union,[{c,atom,[local,undefined,unspec],unknown},none,none,none,none,none,{c,tuple_set,[{4,[{c,tuple,[{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer}],{4,any}}]},{8,[{c,tuple,[{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer}],{8,any}}]}],unknown},none,none],unknown},any],{2,any}}},{{c,atom,[proto_name],unknown},optional,{c,binary,{8,0},unknown}},{{c,atom,[proto_ver],unknown},optional,{c,union,[none,{c,binary,{8,0},unknown},none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none],unknown}},{{c,atom,[receive_maximum],unknown},optional,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[sockname],unknown},mandatory,{c,tuple,[{c,union,[{c,atom,[local,undefined,unspec],unknown},none,none,none,none,none,{c,tuple_set,[{4,[{c,tuple,[{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer}],{4,any}}]},{8,[{c,tuple,[{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer}],{8,any}}]}],unknown},none,none],unknown},any],{2,any}}},{{c,atom,[socktype],unknown},mandatory,{c,atom,any,unknown}},{{c,atom,[username],unknown},optional,{c,union,[{c,atom,[undefined],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}}],{c,atom,any,unknown},any},unknown},{c,map,{[{{c,atom,[anonymous],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[auth_result],unknown},optional,{c,atom,[bad_authentication_method,bad_clientid_or_password,bad_username_or_password,banned,client_identifier_not_valid,not_authorized,server_busy,server_unavailable,success],unknown}},{{c,atom,[clientid],unknown},mandatory,{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}},{{c,atom,[cn],unknown},optional,{c,binary,{8,0},unknown}},{{c,atom,[dn],unknown},optional,{c,binary,{8,0},unknown}},{{c,atom,[is_bridge],unknown},mandatory,{c,atom,[false,true],unknown}},{{c,atom,[is_superuser],unknown},mandatory,{c,atom,[false,true],unknown}},{{c,atom,[mountpoint],unknown},mandatory,{c,union,[{c,atom,[undefined],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}},{{c,atom,[password],unknown},optional,{c,union,[{c,atom,[undefined],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}},{{c,atom,[peerhost],unknown},mandatory,{c,tuple_set,[{4,[{c,tuple,[{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer}],{4,any}}]},{8,[{c,tuple,[{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer}],{8,any}}]}],unknown}},{{c,atom,[protocol],unknown},mandatory,{c,atom,any,unknown}},{{c,atom,[sockport],unknown},mandatory,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[username],unknown},mandatory,{c,union,[{c,atom,[undefined],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}},{{c,atom,[ws_cookie],unknown},optional,{c,union,[{c,atom,[undefined],unknown},none,none,none,{c,list,{any,{c,nil,[],unknown}},unknown},none,none,none,none],unknown}},{{c,atom,[zone],unknown},mandatory,{c,atom,any,unknown}}],{c,atom,any,unknown},any},unknown}]},{emqx_management_proto_v2,get_full_config,1} => {any,[{c,atom,any,unknown}]},{emqx_management_proto_v1,subscribe,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,list,{{c,tuple,[{c,binary,{8,0},unknown},{c,map,{[{{c,atom,[nl],unknown},mandatory,{c,number,{int_set,[0,1]},integer}},{{c,atom,[qos],unknown},mandatory,{c,number,{int_set,[0,1,2]},integer}},{{c,atom,[rap],unknown},mandatory,{c,number,{int_set,[0,1]},integer}},{{c,atom,[rh],unknown},mandatory,{c,number,{int_set,[0,1,2]},integer}}],{c,atom,any,unknown},any},unknown}],{2,any}},{c,nil,[],unknown}},unknown}]},{emqx_bridge_v2_api,lookup_from_local_node_v6,3} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},{c,atom,[not_found],unknown}],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},any],{2,{c,atom,[ok],unknown}}}]}],unknown},[{c,atom,[actions,sources],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_node_rebalance_proto_v2,disconnected_session_counts,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_node_rebalance_status_proto_v1,evacuation_status,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_bridge_proto_v4,restart_bridge_to_node,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_bridge_proto_v6,v2_lookup_from_all_nodes_v6,4} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,atom,[actions,sources],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_proto_v2,get_metrics,1} => {any,[{c,atom,any,unknown}]},{emqx_resource,remove_local,1} => {{c,atom,[ok],unknown},[{c,binary,{8,0},unknown}]},{emqx_bridge_proto_v5,start_bridges_to_all_nodes,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_gateway_cm_proto_v1,get_chann_conn_mod,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_mgmt_cluster_proto_v2,invite_node,2} => {any,[{c,atom,any,unknown},{c,atom,any,unknown}]},{emqx_gateway_cm_proto_v1,set_chan_info,4} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown},{c,map,{[],{c,atom,any,unknown},any},unknown}]},{emqx_shared_sub_proto_v1,send,4} => {any,[{c,atom,any,unknown},{c,identifier,[pid],unknown},{c,binary,{8,0},unknown},any]},{emqx_delayed_proto_v2,clear_all,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_ds_replication_layer,do_make_iterator_v2,5} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[ok],unknown},{c,opaque,[{opaque,emqx_ds_storage_layer,iterator,0,{c,map,{[{{c,number,{int_set,[1]},integer},mandatory,{c,number,{int_set,[2]},integer}},{{c,number,{int_set,[2]},integer},mandatory,{c,number,{int_rng,0,1114111},integer}},{{c,number,{int_set,[3]},integer},mandatory,any}],none,none},unknown}}],unknown}],{2,{c,atom,[ok],unknown}}}]},{3,[{c,tuple,[{c,atom,[error],unknown},{c,atom,[unrecoverable],unknown},{c,atom,[generation_not_found],unknown}],{3,{c,atom,[error],unknown}}}]}],unknown},[{c,atom,any,unknown},{c,binary,{8,0},unknown},{c,opaque,[{opaque,emqx_ds_storage_layer,stream,0,{c,list,{any,any},nonempty}}],unknown},{c,list,{{c,union,[{c,atom,['','#','+'],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,nil,[],unknown}},unknown},{c,number,{int_rng,0,pos_inf},integer}]},{emqx_alarm,get_alarms,1} => {any,[{c,atom,[activated,all,deactivated],unknown}]},{emqx_gateway_cm,do_call,5} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown},any,any]},{emqx_node_rebalance_proto_v2,connection_counts,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_mgmt_trace_proto_v2,trace_file,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,union,[{c,atom,any,unknown},none,none,none,{c,list,{any,{c,nil,[],unknown}},unknown},{c,number,{int_rng,0,1114111},integer},none,none,none],unknown},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_conf_proto_v2,get_config,2} => {any,[{c,atom,any,unknown},{c,list,{{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,nil,[],unknown}},unknown}]},{emqx_conf_proto_v3,reset,3} => {any,[{c,atom,any,unknown},{c,list,{{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,nil,[],unknown}},nonempty},{c,map,{[{{c,atom,[lazy_evaluator],unknown},optional,{c,function,{{c,product,[{c,function,{any,any},unknown}],unknown},any},unknown}},{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_dashboard_monitor,current_rate,1} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[badrpc],unknown},any],{2,{c,atom,[badrpc],unknown}}},{c,tuple,[{c,atom,[ok],unknown},any],{2,{c,atom,[ok],unknown}}}]}],unknown},[{c,atom,any,unknown}]},{emqx_node_rebalance_evacuation,stop,0} => {any,[]},{emqx_bridge_proto_v6,get_metrics_from_all_nodes,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_mgmt_api_plugins_proto_v2,ensure_action,2} => {any,[{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,atom,[restart,start,stop],unknown}]},{emqx_bridge_v2,list,1} => {any,[{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_bridge_proto_v6,v2_start_bridge_on_node_v6,4} => {any,[{c,atom,any,unknown},{c,atom,[actions,sources],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_node_rebalance_proto_v3,enable_rebalance_agent,4} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,identifier,[pid],unknown},any,{c,map,{[{{c,atom,[allow_connections],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_node_rebalance_status_proto_v2,evacuation_status,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_resource_proto_v1,reset_metrics,1} => {any,[{c,binary,{8,0},unknown}]},{emqx_conf_proto_v3,update,3} => {any,[{c,list,{{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,nil,[],unknown}},nonempty},any,{c,map,{[{{c,atom,[lazy_evaluator],unknown},optional,{c,function,{{c,product,[{c,function,{any,any},unknown}],unknown},any},unknown}},{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_eviction_agent_proto_v1,evict_session_channel,4} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,map,{[{{c,atom,[clean_start],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[clientid],unknown},optional,{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}},{{c,atom,[conn_mod],unknown},mandatory,{c,atom,any,unknown}},{{c,atom,[conn_props],unknown},optional,{c,map,{[],{c,atom,any,unknown},any},unknown}},{{c,atom,[connected],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[connected_at],unknown},optional,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[disconnected_at],unknown},optional,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[expiry_interval],unknown},optional,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[keepalive],unknown},optional,{c,number,{int_rng,0,1114111},integer}},{{c,atom,[peercert],unknown},optional,{c,union,[{c,atom,[nossl,undefined],unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,union,[{c,atom,any,unknown},none,none,none,none,none,{c,tuple,any,{any,any}},none,none],unknown},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}},{{c,atom,[peername],unknown},mandatory,{c,tuple,[{c,union,[{c,atom,[local,undefined,unspec],unknown},none,none,none,none,none,{c,tuple_set,[{4,[{c,tuple,[{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer}],{4,any}}]},{8,[{c,tuple,[{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer}],{8,any}}]}],unknown},none,none],unknown},any],{2,any}}},{{c,atom,[proto_name],unknown},optional,{c,binary,{8,0},unknown}},{{c,atom,[proto_ver],unknown},optional,{c,union,[none,{c,binary,{8,0},unknown},none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none],unknown}},{{c,atom,[receive_maximum],unknown},optional,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[sockname],unknown},mandatory,{c,tuple,[{c,union,[{c,atom,[local,undefined,unspec],unknown},none,none,none,none,none,{c,tuple_set,[{4,[{c,tuple,[{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer}],{4,any}}]},{8,[{c,tuple,[{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer}],{8,any}}]}],unknown},none,none],unknown},any],{2,any}}},{{c,atom,[socktype],unknown},mandatory,{c,atom,any,unknown}},{{c,atom,[username],unknown},optional,{c,union,[{c,atom,[undefined],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}}],{c,atom,any,unknown},any},unknown},{c,map,{[{{c,atom,[anonymous],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[auth_result],unknown},optional,{c,atom,[bad_authentication_method,bad_clientid_or_password,bad_username_or_password,banned,client_identifier_not_valid,not_authorized,server_busy,server_unavailable,success],unknown}},{{c,atom,[clientid],unknown},mandatory,{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}},{{c,atom,[cn],unknown},optional,{c,binary,{8,0},unknown}},{{c,atom,[dn],unknown},optional,{c,binary,{8,0},unknown}},{{c,atom,[is_bridge],unknown},mandatory,{c,atom,[false,true],unknown}},{{c,atom,[is_superuser],unknown},mandatory,{c,atom,[false,true],unknown}},{{c,atom,[mountpoint],unknown},mandatory,{c,union,[{c,atom,[undefined],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}},{{c,atom,[password],unknown},optional,{c,union,[{c,atom,[undefined],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}},{{c,atom,[peerhost],unknown},mandatory,{c,tuple_set,[{4,[{c,tuple,[{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer}],{4,any}}]},{8,[{c,tuple,[{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer}],{8,any}}]}],unknown}},{{c,atom,[protocol],unknown},mandatory,{c,atom,any,unknown}},{{c,atom,[sockport],unknown},mandatory,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[username],unknown},mandatory,{c,union,[{c,atom,[undefined],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}},{{c,atom,[ws_cookie],unknown},optional,{c,union,[{c,atom,[undefined],unknown},none,none,none,{c,list,{any,{c,nil,[],unknown}},unknown},none,none,none,none],unknown}},{{c,atom,[zone],unknown},mandatory,{c,atom,any,unknown}}],{c,atom,any,unknown},any},unknown}]},{emqx_resource_proto_v1,create,5} => {any,[{c,binary,{8,0},unknown},{c,binary,{8,0},unknown},{c,atom,any,unknown},any,{c,map,{[{{c,atom,[auto_restart_interval],unknown},optional,{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,1,pos_inf},integer},none,none,none],unknown}},{{c,atom,[auto_retry_interval],unknown},optional,{c,number,any,integer}},{{c,atom,[batch_size],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[batch_time],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[health_check_interval],unknown},optional,{c,number,any,integer}},{{c,atom,[health_check_timeout],unknown},optional,{c,number,any,integer}},{{c,atom,[inflight_window],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[max_buffer_bytes],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[query_mode],unknown},optional,{c,atom,[async,no_queries,simple_async,simple_async_internal_buffer,simple_sync,simple_sync_internal_buffer,sync],unknown}},{{c,atom,[resume_interval],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[spawn_buffer_workers],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[start_after_created],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[start_timeout],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[wait_for_resource_ready],unknown},optional,{c,number,any,integer}},{{c,atom,[worker_pool_size],unknown},optional,{c,number,{int_rng,0,pos_inf},integer}}],none,none},unknown}]},{emqx_mgmt_api_plugins,describe_package,1} => {{c,tuple,[{c,atom,any,unknown},{c,list,{{c,map,{[],any,any},unknown},{c,nil,[],unknown}},unknown}],{2,any}},[{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_conf_proto_v3,get_override_config_file,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_exhook_mgr,server_info,1} => {any,[any]},{emqx_ds_proto_v3,list_generations_with_lifetimes,3} => {any,[{c,atom,any,unknown},{c,atom,any,unknown},{c,binary,{8,0},unknown}]},{emqx_bridge_proto_v3,restart_bridges_to_all_nodes,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_proto_v1,clean_authz_cache,2} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}]},{emqx_node_rebalance,start,1} => {any,[{c,map,{[],any,any},unknown}]},{emqx_gateway_cm_proto_v1,lookup_by_clientid,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}]},{emqx_conf_proto_v1,reset,3} => {any,[{c,atom,any,unknown},{c,list,{{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,nil,[],unknown}},nonempty},{c,map,{[{{c,atom,[lazy_evaluator],unknown},optional,{c,function,{{c,product,[{c,function,{any,any},unknown}],unknown},any},unknown}},{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_ft_storage_fs_proto_v1,multilist,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,tuple,[{c,binary,{8,0},unknown},{c,binary,{8,0},unknown}],{2,any}},{c,atom,[fragment,result],unknown}]},{emqx_cm,takeover_finish,2} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},{c,atom,[noproc,timeout,unexpected_exception],unknown}],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},any],{2,{c,atom,[ok],unknown}}}]}],unknown},none,none],unknown},[{c,atom,any,unknown},{c,identifier,[pid],unknown}]},{emqx_node_rebalance_proto_v1,session_counts,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_node_rebalance_api_proto_v2,node_rebalance_start,2} => {any,[{c,atom,any,unknown},{c,map,{[{{c,atom,[abs_conn_threshold],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[abs_sess_threshold],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[conn_evict_rate],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[nodes],unknown},optional,{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}},{{c,atom,[rel_conn_threshold],unknown},optional,{c,number,any,unknown}},{{c,atom,[rel_sess_threshold],unknown},optional,{c,number,any,unknown}},{{c,atom,[sess_evict_rate],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[wait_health_check],unknown},optional,{c,number,any,unknown}},{{c,atom,[wait_takeover],unknown},optional,{c,number,any,unknown}}],none,none},unknown}]},{emqx_prometheus_proto_v2,stop,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_prometheus_proto_v1,start,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_bridge_proto_v6,start_bridges_to_all_nodes,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_gateway_cm,do_get_chan_stats,3} => {any,[any,any,any]},{emqx_node_rebalance_status_proto_v2,local_status,1} => {any,[{c,atom,any,unknown}]},{emqx_proto_v1,get_metrics,1} => {any,[{c,atom,any,unknown}]},{emqx_mgmt_data_backup,list_files,0} => {{c,list,{any,{c,nil,[],unknown}},unknown},[]},{emqx_bridge_proto_v4,get_metrics_from_all_nodes,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_connector_proto_v1,start_connector_to_node,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_cm_proto_v1,get_chan_info,2} => {any,[{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx,update_config,3} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},any],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},{c,map,{[{{c,atom,[config],unknown},optional,{c,union,[{c,atom,[undefined],unknown},none,none,none,{c,list,{any,{c,nil,[],unknown}},unknown},none,none,none,{c,map,{[],{c,atom,any,unknown},any},unknown}],unknown}},{{c,atom,[post_config_update],unknown},optional,{c,map,{[],{c,atom,any,unknown},any},unknown}},{{c,atom,[raw_config],unknown},optional,{c,union,[{c,atom,[undefined],unknown},none,none,none,{c,list,{any,{c,nil,[],unknown}},unknown},none,none,none,{c,map,{[],{c,binary,{8,0},unknown},any},unknown}],unknown}}],none,none},unknown}],{2,{c,atom,[ok],unknown}}}]}],unknown},[{c,list,{{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,nil,[],unknown}},nonempty},any,{c,map,{[{{c,atom,[lazy_evaluator],unknown},optional,{c,function,{{c,product,[{c,function,{any,any},unknown}],unknown},any},unknown}},{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_shared_sub_proto_v1,dispatch_with_ack,5} => {any,[{c,identifier,[pid],unknown},{c,union,[{c,atom,['_'],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,binary,{8,0},unknown},{c,tuple,[{c,atom,[message],unknown},{c,binary,{8,0},unknown},any,{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,map,{[],{c,atom,any,unknown},{c,atom,[false,true],unknown}},unknown},{c,map,{[{{c,atom,[allow_publish],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[peerhost],unknown},optional,{c,tuple_set,[{4,[{c,tuple,[{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer}],{4,any}}]},{8,[{c,tuple,[{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer}],{8,any}}]}],unknown}},{{c,atom,[properties],unknown},optional,{c,map,{[],{c,atom,any,unknown},any},unknown}},{{c,atom,[proto_ver],unknown},optional,{c,union,[none,{c,binary,{8,0},unknown},none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none],unknown}},{{c,atom,[protocol],unknown},optional,{c,atom,any,unknown}},{{c,atom,[username],unknown},optional,{c,union,[{c,atom,[undefined],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}}],{c,atom,any,unknown},any},unknown},{c,binary,{8,0},unknown},{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{any,{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,nil,[],unknown},none,none,none,none],unknown}},unknown},{c,number,{int_rng,0,255},integer},none,none,none],unknown},{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,nil,[],unknown},none,none,none,none],unknown}},unknown},none,none,none,none],unknown},{c,number,any,integer},any],{10,{c,atom,[message],unknown}}},{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none],unknown}]},{emqx_gateway_cm,do_kick_session,4} => {{c,atom,[ok],unknown},[{c,atom,any,unknown},any,{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_persistent_session_ds,do_open_iterator,3} => {{c,tuple,[{c,atom,[error],unknown},{c,atom,[not_implemented],unknown}],{2,{c,atom,[error],unknown}}},[any,any,any]},{emqx_node_rebalance_proto_v3,disable_rebalance_agent,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,identifier,[pid],unknown}]},{emqx_cm_proto_v1,takeover_session,2} => {any,[{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_node_rebalance_proto_v2,evict_sessions,4} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,number,{int_rng,0,pos_inf},integer},{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,atom,[connected,connecting,disconnected,idle,reauthenticating],unknown}]},{emqx_bridge_proto_v5,stop_bridge_to_node,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_conf_app,get_override_config_file,0} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},{c,map,{[{{c,atom,[msg],unknown},mandatory,any},{{c,atom,[node],unknown},mandatory,{c,atom,any,unknown}},{{c,atom,[release],unknown},mandatory,{c,list,{any,{c,nil,[],unknown}},nonempty}},{{c,atom,[wall_clock],unknown},mandatory,{c,tuple,[any,any],{2,any}}}],none,none},unknown}],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},any],{2,{c,atom,[ok],unknown}}}]}],unknown},[]},{emqx_rule_engine_proto_v1,reset_metrics,1} => {any,[{c,binary,{8,0},unknown}]},{emqx_ds_proto_v4,add_generation,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,atom,any,unknown}]},{emqx_bridge_proto_v5,stop_bridges_to_all_nodes,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_mgmt_data_backup,maybe_copy_and_import,2} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[bardrpc],unknown},any],{2,{c,atom,[bardrpc],unknown}}},{c,tuple,[{c,atom,[error],unknown},any],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},{c,map,{[{{c,atom,[config_errors],unknown},mandatory,{c,map,{[],{c,list,{any,{c,nil,[],unknown}},unknown},{c,tuple,[any,any],{2,any}}},unknown}},{{c,atom,[db_errors],unknown},mandatory,{c,map,{[],{c,atom,any,unknown},{c,tuple,[any,any],{2,any}}},unknown}}],none,none},unknown}],{2,{c,atom,[ok],unknown}}}]}],unknown},[any,{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_ft_storage_exporter_fs_proto_v1,list_exports,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,map,{[{{c,atom,[following],unknown},optional,any},{{c,atom,[limit],unknown},optional,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[transfer],unknown},optional,{c,tuple,[{c,binary,{8,0},unknown},{c,binary,{8,0},unknown}],{2,any}}}],none,none},unknown}]},{emqx_ft_storage_exporter_fs_proto_v1,read_export_file,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},none,none,none,{c,list,{{c,union,[{c,atom,any,unknown},none,none,none,{c,list,{any,{c,nil,[],unknown}},unknown},{c,number,{int_rng,0,1114111},integer},none,none,none],unknown},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_management_proto_v3,get_full_config,1} => {any,[{c,atom,any,unknown}]},{emqx_management_proto_v3,subscribe,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,list,{{c,tuple,[{c,binary,{8,0},unknown},{c,map,{[{{c,atom,[nl],unknown},mandatory,{c,number,{int_set,[0,1]},integer}},{{c,atom,[qos],unknown},mandatory,{c,number,{int_set,[0,1,2]},integer}},{{c,atom,[rap],unknown},mandatory,{c,number,{int_set,[0,1]},integer}},{{c,atom,[rh],unknown},mandatory,{c,number,{int_set,[0,1,2]},integer}}],{c,atom,any,unknown},any},unknown}],{2,any}},{c,nil,[],unknown}},unknown}]},{emqx_management_proto_v1,list_listeners,1} => {any,[{c,atom,any,unknown}]},{emqx_conf_proto_v1,update,4} => {any,[{c,atom,any,unknown},{c,list,{{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,nil,[],unknown}},nonempty},any,{c,map,{[{{c,atom,[lazy_evaluator],unknown},optional,{c,function,{{c,product,[{c,function,{any,any},unknown}],unknown},any},unknown}},{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_eviction_agent_proto_v2,all_channels_count,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none],unknown}]},{emqx_resource,reset_metrics_local,1} => {{c,atom,[ok],unknown},[{c,binary,{8,0},unknown}]},{emqx_node_rebalance_purge_proto_v1,start,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,map,{[{{c,atom,[purge_rate],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}}],none,none},unknown}]},{emqx_bridge_v2,list,0} => {any,[]},{emqx_proto_v2,clean_pem_cache,1} => {any,[{c,atom,any,unknown}]},{emqx_mgmt_cluster_proto_v2,connected_replicants,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_mgmt_data_backup_proto_v1,list_files,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none],unknown}]},{emqx_delayed,delete_delayed_message,1} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},{c,atom,[not_found],unknown}],{2,{c,atom,[error],unknown}}},none,none],unknown},[any]},{emqx_node_rebalance_proto_v3,session_counts,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_mgmt_api_trace,get_trace_size,0} => {{c,map,{[],any,any},unknown},[]},{emqx_conf_proto_v3,reset,2} => {any,[{c,list,{{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,nil,[],unknown}},nonempty},{c,map,{[{{c,atom,[lazy_evaluator],unknown},optional,{c,function,{{c,product,[{c,function,{any,any},unknown}],unknown},any},unknown}},{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_node_rebalance_proto_v3,evict_sessions,4} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,number,{int_rng,0,pos_inf},integer},{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,atom,[connected,connecting,disconnected,idle,reauthenticating],unknown}]},{emqx_bridge_proto_v1,stop_bridge_to_node,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_management_proto_v4,unsubscribe_batch,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,list,{{c,binary,{8,0},unknown},{c,nil,[],unknown}},unknown}]},{emqx_management_proto_v5,list_listeners,1} => {any,[{c,atom,any,unknown}]},{emqx_node_rebalance_api_proto_v2,node_rebalance_evacuation_stop,1} => {any,[{c,atom,any,unknown}]},{emqx_conf_proto_v2,update,3} => {any,[{c,list,{{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,nil,[],unknown}},nonempty},any,{c,map,{[{{c,atom,[lazy_evaluator],unknown},optional,{c,function,{{c,product,[{c,function,{any,any},unknown}],unknown},any},unknown}},{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_resource,recreate_local,4} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},{c,atom,[not_found,updating_to_incorrect_resource_type],unknown}],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},{c,map,{[{{c,atom,[added_channels],unknown},mandatory,any},{{c,atom,[callback_mode],unknown},mandatory,{c,atom,[always_sync,async_if_possible],unknown}},{{c,atom,[config],unknown},mandatory,any},{{c,atom,[error],unknown},mandatory,any},{{c,atom,[id],unknown},mandatory,{c,binary,{8,0},unknown}},{{c,atom,[mod],unknown},mandatory,{c,atom,any,unknown}},{{c,atom,[query_mode],unknown},mandatory,{c,atom,[async,no_queries,simple_async,simple_async_internal_buffer,simple_sync,simple_sync_internal_buffer,sync],unknown}},{{c,atom,[state],unknown},mandatory,any},{{c,atom,[status],unknown},mandatory,{c,atom,[connected,connecting,disconnected,stopped],unknown}}],none,none},unknown}],{2,{c,atom,[ok],unknown}}}]}],unknown},[{c,binary,{8,0},unknown},{c,atom,any,unknown},any,{c,map,{[{{c,atom,[auto_restart_interval],unknown},optional,{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,1,pos_inf},integer},none,none,none],unknown}},{{c,atom,[auto_retry_interval],unknown},optional,{c,number,any,integer}},{{c,atom,[batch_size],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[batch_time],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[health_check_interval],unknown},optional,{c,number,any,integer}},{{c,atom,[health_check_timeout],unknown},optional,{c,number,any,integer}},{{c,atom,[inflight_window],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[max_buffer_bytes],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[query_mode],unknown},optional,{c,atom,[async,no_queries,simple_async,simple_async_internal_buffer,simple_sync,simple_sync_internal_buffer,sync],unknown}},{{c,atom,[resume_interval],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[spawn_buffer_workers],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[start_after_created],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[start_timeout],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[wait_for_resource_ready],unknown},optional,{c,number,any,integer}},{{c,atom,[worker_pool_size],unknown},optional,{c,number,{int_rng,0,pos_inf},integer}}],none,none},unknown}]},{emqx_gateway_cm_proto_v1,set_chan_stats,4} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown},{c,list,{{c,tuple,[{c,atom,any,unknown},any],{2,any}},{c,nil,[],unknown}},unknown}]},{emqx_conf_proto_v1,get_all,1} => {any,[{c,list,{{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,nil,[],unknown}},unknown}]},{emqx_management_proto_v5,kickout_clients,2} => {any,[{c,atom,any,unknown},{c,list,{{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,nil,[],unknown}},unknown}]},{emqx_plugins_proto_v1,get_tar,3} => {any,[{c,atom,any,unknown},{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none],unknown}]},{emqx_management_proto_v1,call_client,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},any]},{emqx_gateway_cm,do_cast,4} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown},any]},{emqx_proto_v1,clean_authz_cache,1} => {any,[{c,atom,any,unknown}]},{emqx_bridge_proto_v6,v2_get_metrics_from_all_nodes_v6,4} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,atom,[actions,sources],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_bridge_v2,start,3} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},any],{2,{c,atom,[error],unknown}}},none,none],unknown},[{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_broker_proto_v1,forward,3} => {any,[{c,atom,any,unknown},{c,binary,{8,0},unknown},{c,tuple,[{c,atom,[delivery],unknown},{c,identifier,[pid],unknown},{c,tuple,[{c,atom,[message],unknown},{c,binary,{8,0},unknown},any,{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,map,{[],{c,atom,any,unknown},{c,atom,[false,true],unknown}},unknown},{c,map,{[{{c,atom,[allow_publish],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[peerhost],unknown},optional,{c,tuple_set,[{4,[{c,tuple,[{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer}],{4,any}}]},{8,[{c,tuple,[{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer}],{8,any}}]}],unknown}},{{c,atom,[properties],unknown},optional,{c,map,{[],{c,atom,any,unknown},any},unknown}},{{c,atom,[proto_ver],unknown},optional,{c,union,[none,{c,binary,{8,0},unknown},none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none],unknown}},{{c,atom,[protocol],unknown},optional,{c,atom,any,unknown}},{{c,atom,[username],unknown},optional,{c,union,[{c,atom,[undefined],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}}],{c,atom,any,unknown},any},unknown},{c,binary,{8,0},unknown},{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{any,{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,nil,[],unknown},none,none,none,none],unknown}},unknown},{c,number,{int_rng,0,255},integer},none,none,none],unknown},{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,nil,[],unknown},none,none,none,none],unknown}},unknown},none,none,none,none],unknown},{c,number,any,integer},any],{10,{c,atom,[message],unknown}}}],{3,{c,atom,[delivery],unknown}}}]},{emqx,get_config,2} => {any,[any,any]},{emqx_mgmt_api_plugins_proto_v2,install_package,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,binary,{8,0},unknown}]},{emqx_ft_storage_fs_proto_v1,list_assemblers,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,tuple,[{c,binary,{8,0},unknown},{c,binary,{8,0},unknown}],{2,any}}]},{emqx_ds_proto_v4,drop_db,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,atom,any,unknown}]},{emqx_mgmt_trace_proto_v2,read_trace_file,4} => {any,[{c,atom,any,unknown},{c,binary,{8,0},unknown},{c,number,{int_rng,0,pos_inf},integer},{c,number,{int_rng,0,pos_inf},integer}]},{emqx_bridge_v2_api,get_metrics_from_local_node,2} => {{c,map,{[{{c,atom,[dropped],unknown},mandatory,{c,number,any,integer}},{{c,atom,['dropped.expired'],unknown},mandatory,{c,number,any,integer}},{{c,atom,['dropped.other'],unknown},mandatory,{c,number,any,integer}},{{c,atom,['dropped.queue_full'],unknown},mandatory,{c,number,any,integer}},{{c,atom,['dropped.resource_not_found'],unknown},mandatory,{c,number,any,integer}},{{c,atom,['dropped.resource_stopped'],unknown},mandatory,{c,number,any,integer}},{{c,atom,[failed],unknown},mandatory,{c,number,any,integer}},{{c,atom,[inflight],unknown},mandatory,any},{{c,atom,[late_reply],unknown},mandatory,{c,number,any,integer}},{{c,atom,[matched],unknown},mandatory,{c,number,any,integer}},{{c,atom,[queuing],unknown},mandatory,any},{{c,atom,[rate],unknown},mandatory,any},{{c,atom,[rate_last5m],unknown},mandatory,any},{{c,atom,[rate_max],unknown},mandatory,any},{{c,atom,[received],unknown},mandatory,{c,number,any,integer}},{{c,atom,[retried],unknown},mandatory,{c,number,any,integer}},{{c,atom,[success],unknown},mandatory,{c,number,any,integer}}],none,none},unknown},[{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_bridge_proto_v1,stop_bridges_to_all_nodes,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_cm,do_get_chann_conn_mod,2} => {any,[any,any]},{emqx_node_rebalance_proto_v1,disable_rebalance_agent,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,identifier,[pid],unknown}]},{emqx_bridge_proto_v3,stop_bridges_to_all_nodes,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_gateway_cm_proto_v1,kick_session,4} => {any,[{c,atom,any,unknown},{c,atom,[discard,kick],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_bridge_proto_v2,start_bridge_to_node,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_management_proto_v2,unsubscribe,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,binary,{8,0},unknown}]},{emqx_bridge_proto_v3,stop_bridge_to_node,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_bridge_proto_v5,get_metrics_from_all_nodes,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_persistent_session_ds_proto_v1,open_iterator,4} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,list,{{c,union,[{c,atom,['','#','+'],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,nil,[],unknown}},unknown},{c,number,{int_rng,0,pos_inf},integer},any]},{emqx_management_proto_v5,node_info,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_broker_proto_v1,list_client_subscriptions,2} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}]},{emqx_node_rebalance_purge,start,1} => {any,[{c,map,{[],any,any},unknown}]},{emqx_shared_sub,do_dispatch_with_ack,4} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},any],{2,{c,atom,[error],unknown}}},none,none],unknown},[{c,identifier,[pid,port],unknown},any,any,{c,tuple,[{c,atom,[message],unknown},{c,binary,{8,0},unknown},any,{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,map,{[],{c,atom,any,unknown},{c,atom,[false,true],unknown}},unknown},{c,map,{[{{c,atom,[allow_publish],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[peerhost],unknown},optional,{c,tuple_set,[{4,[{c,tuple,[{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer}],{4,any}}]},{8,[{c,tuple,[{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer}],{8,any}}]}],unknown}},{{c,atom,[properties],unknown},optional,{c,map,{[],{c,atom,any,unknown},any},unknown}},{{c,atom,[proto_ver],unknown},optional,{c,union,[none,{c,binary,{8,0},unknown},none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none],unknown}},{{c,atom,[protocol],unknown},optional,{c,atom,any,unknown}},{{c,atom,[username],unknown},optional,{c,union,[{c,atom,[undefined],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}}],{c,atom,any,unknown},any},unknown},{c,binary,{8,0},unknown},{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{any,{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,nil,[],unknown},none,none,none,none],unknown}},unknown},{c,number,{int_rng,0,255},integer},none,none,none],unknown},{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,nil,[],unknown},none,none,none,none],unknown}},unknown},none,none,none,none],unknown},{c,number,any,integer},any],{10,{c,atom,[message],unknown}}}]},{emqx_management_proto_v1,node_info,1} => {any,[{c,atom,any,unknown}]},{emqx_resource,create_local,5} => {{c,tuple,[{c,atom,[ok],unknown},{c,map,{[{{c,atom,[added_channels],unknown},mandatory,any},{{c,atom,[callback_mode],unknown},mandatory,{c,atom,[always_sync,async_if_possible],unknown}},{{c,atom,[config],unknown},mandatory,any},{{c,atom,[error],unknown},mandatory,any},{{c,atom,[id],unknown},mandatory,{c,binary,{8,0},unknown}},{{c,atom,[mod],unknown},mandatory,{c,atom,any,unknown}},{{c,atom,[query_mode],unknown},mandatory,{c,atom,[async,no_queries,simple_async,simple_async_internal_buffer,simple_sync,simple_sync_internal_buffer,sync],unknown}},{{c,atom,[state],unknown},mandatory,any},{{c,atom,[status],unknown},mandatory,{c,atom,[connected,connecting,disconnected,stopped],unknown}}],none,none},unknown}],{2,{c,atom,[ok],unknown}}},[{c,binary,{8,0},unknown},{c,binary,{8,0},unknown},{c,atom,any,unknown},any,{c,map,{[{{c,atom,[auto_restart_interval],unknown},optional,{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,1,pos_inf},integer},none,none,none],unknown}},{{c,atom,[auto_retry_interval],unknown},optional,{c,number,any,integer}},{{c,atom,[batch_size],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[batch_time],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[health_check_interval],unknown},optional,{c,number,any,integer}},{{c,atom,[health_check_timeout],unknown},optional,{c,number,any,integer}},{{c,atom,[inflight_window],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[max_buffer_bytes],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[query_mode],unknown},optional,{c,atom,[async,no_queries,simple_async,simple_async_internal_buffer,simple_sync,simple_sync_internal_buffer,sync],unknown}},{{c,atom,[resume_interval],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[spawn_buffer_workers],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[start_after_created],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[start_timeout],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[wait_for_resource_ready],unknown},optional,{c,number,any,integer}},{{c,atom,[worker_pool_size],unknown},optional,{c,number,{int_rng,0,pos_inf},integer}}],none,none},unknown}]},{emqx_node_rebalance_proto_v3,disconnected_session_counts,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_cm,do_kick_session,3} => {{c,atom,[ok],unknown},[any,{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_management_proto_v1,get_full_config,1} => {any,[{c,atom,any,unknown}]},{emqx_node_rebalance_proto_v1,enable_rebalance_agent,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,identifier,[pid],unknown}]},{emqx_bridge_proto_v5,start_bridge_to_node,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_management_proto_v4,unsubscribe,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,binary,{8,0},unknown}]},{emqx_mgmt_api_plugins_proto_v2,describe_package,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_cm,kick_session,1} => {{c,atom,[ok],unknown},[{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}]},{emqx_ds_proto_v1,make_iterator,6} => {any,[{c,atom,any,unknown},{c,atom,any,unknown},{c,binary,{8,0},unknown},{c,opaque,[{opaque,emqx_ds_storage_layer,stream_v1,0,{c,map,{[{{c,number,{int_set,[1]},integer},mandatory,{c,number,{int_set,[1]},integer}},{{c,number,{int_set,[2]},integer},mandatory,{c,number,{int_rng,0,1114111},integer}},{{c,number,{int_set,[3]},integer},mandatory,any}],none,none},unknown}}],unknown},{c,list,{{c,union,[{c,atom,['','#','+'],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,nil,[],unknown}},unknown},{c,number,{int_rng,0,pos_inf},integer}]},{emqx_delayed,clear_all_local,0} => {{c,atom,[ok],unknown},[]},{emqx_management_proto_v2,subscribe,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,list,{{c,tuple,[{c,binary,{8,0},unknown},{c,map,{[{{c,atom,[nl],unknown},mandatory,{c,number,{int_set,[0,1]},integer}},{{c,atom,[qos],unknown},mandatory,{c,number,{int_set,[0,1,2]},integer}},{{c,atom,[rap],unknown},mandatory,{c,number,{int_set,[0,1]},integer}},{{c,atom,[rh],unknown},mandatory,{c,number,{int_set,[0,1,2]},integer}}],{c,atom,any,unknown},any},unknown}],{2,any}},{c,nil,[],unknown}},unknown}]},{emqx_conf_proto_v3,get_config,2} => {any,[{c,atom,any,unknown},{c,list,{{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,nil,[],unknown}},unknown}]},{emqx_mgmt_api_plugins_proto_v2,delete_package,1} => {any,[{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_ds_proto_v4,make_iterator,6} => {any,[{c,atom,any,unknown},{c,atom,any,unknown},{c,binary,{8,0},unknown},{c,opaque,[{opaque,emqx_ds_storage_layer,stream,0,{c,list,{any,any},nonempty}}],unknown},{c,list,{{c,union,[{c,atom,['','#','+'],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,nil,[],unknown}},unknown},{c,number,{int_rng,0,pos_inf},integer}]},{emqx_node_rebalance_proto_v1,available_nodes,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_bridge_resource,restart,2} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},any],{2,{c,atom,[error],unknown}}},none,none],unknown},[any,any]},{emqx_slow_subs_proto_v1,clear_history,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_node_rebalance_agent,disable,1} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},{c,atom,[already_disabled,invalid_coordinator],unknown}],{2,{c,atom,[error],unknown}}},none,none],unknown},[{c,identifier,[pid],unknown}]},{emqx_proto_v2,clean_authz_cache,1} => {any,[{c,atom,any,unknown}]},{emqx_slow_subs_proto_v1,get_history,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_authz_api_sources,lookup_from_local_node,1} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},{c,tuple,[{c,atom,any,unknown},{c,union,[{c,atom,[not_found_resource],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}],{2,any}}],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},{c,tuple,[{c,atom,any,unknown},{c,atom,[connected,connecting,disconnected,stopped],unknown},{c,map,{[{{c,atom,[counters],unknown},mandatory,{c,map,{[],any,any},unknown}},{{c,atom,[gauges],unknown},mandatory,{c,map,{[],any,any},unknown}},{{c,atom,[rate],unknown},mandatory,{c,map,{[],any,any},unknown}},{{c,atom,[slides],unknown},mandatory,{c,map,{[],any,any},unknown}}],none,none},unknown},{c,map,{[{{c,atom,[counters],unknown},optional,{c,map,{[],any,any},unknown}},{{c,atom,[gauges],unknown},optional,{c,map,{[],any,any},unknown}},{{c,atom,[rate],unknown},optional,{c,map,{[],any,any},unknown}},{{c,atom,[slides],unknown},optional,{c,map,{[],any,any},unknown}}],none,none},unknown}],{4,any}}],{2,{c,atom,[ok],unknown}}}]}],unknown},[any]},{emqx_ft_storage_fs_proxy,lookup_local_assembler,1} => {any,[any]},{emqx_connector,list,0} => {any,[]},{emqx_ds_proto_v2,get_streams,5} => {any,[{c,atom,any,unknown},{c,atom,any,unknown},{c,binary,{8,0},unknown},{c,list,{{c,union,[{c,atom,['','#','+'],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,nil,[],unknown}},unknown},{c,number,{int_rng,0,pos_inf},integer}]},{emqx_eviction_agent,evict_sessions,3} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},{c,atom,[disabled],unknown}],{2,{c,atom,[error],unknown}}},none,none],unknown},[any,{c,union,[{c,atom,any,unknown},none,none,none,{c,list,{any,{c,nil,[],unknown}},unknown},none,none,none,none],unknown},any]},{emqx_conf_proto_v3,remove_config,2} => {any,[{c,list,{{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,nil,[],unknown}},nonempty},{c,map,{[{{c,atom,[lazy_evaluator],unknown},optional,{c,function,{{c,product,[{c,function,{any,any},unknown}],unknown},any},unknown}},{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_management_proto_v5,call_client,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},any]},{emqx_bridge_proto_v5,v2_list_bridges_on_nodes,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_cm_proto_v1,kickout_client,2} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}]},{emqx_mgmt_api_plugins_proto_v1,describe_package,1} => {any,[{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_node_rebalance_proto_v3,evict_connections,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,number,{int_rng,0,pos_inf},integer}]},{emqx_dashboard_proto_v1,current_rate,1} => {any,[{c,atom,any,unknown}]},{emqx_ds_proto_v3,update_iterator,5} => {any,[{c,atom,any,unknown},{c,atom,any,unknown},{c,binary,{8,0},unknown},{c,opaque,[{opaque,emqx_ds_storage_layer,iterator,0,{c,map,{[{{c,number,{int_set,[1]},integer},mandatory,{c,number,{int_set,[2]},integer}},{{c,number,{int_set,[2]},integer},mandatory,{c,number,{int_rng,0,1114111},integer}},{{c,number,{int_set,[3]},integer},mandatory,any}],none,none},unknown}}],unknown},{c,binary,{8,0},unknown}]},{emqx_bridge_proto_v1,restart_bridge_to_node,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_mgmt_api_configs,get_full_config,0} => {{c,map,{[],any,any},unknown},[]},{emqx_bridge_proto_v3,restart_bridge_to_node,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_management_proto_v1,unsubscribe,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,binary,{8,0},unknown}]},{emqx_bridge_proto_v3,list_bridges,1} => {any,[{c,atom,any,unknown}]},{emqx_prometheus_proto_v2,raw_prom_data,4} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,atom,any,unknown},{c,atom,any,unknown},{c,list,{any,{c,nil,[],unknown}},unknown}]},{emqx_license_proto_v1,remote_connection_counts,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_node_rebalance_proto_v3,enable_rebalance_agent,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,identifier,[pid],unknown},any]},{emqx_conf_proto_v2,reset,3} => {any,[{c,atom,any,unknown},{c,list,{{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,nil,[],unknown}},nonempty},{c,map,{[{{c,atom,[lazy_evaluator],unknown},optional,{c,function,{{c,product,[{c,function,{any,any},unknown}],unknown},any},unknown}},{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_ds_proto_v3,get_streams,5} => {any,[{c,atom,any,unknown},{c,atom,any,unknown},{c,binary,{8,0},unknown},{c,list,{{c,union,[{c,atom,['','#','+'],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,nil,[],unknown}},unknown},{c,number,{int_rng,0,pos_inf},integer}]},{emqx_resource_proto_v1,recreate,4} => {any,[{c,binary,{8,0},unknown},{c,atom,any,unknown},any,{c,map,{[{{c,atom,[auto_restart_interval],unknown},optional,{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,1,pos_inf},integer},none,none,none],unknown}},{{c,atom,[auto_retry_interval],unknown},optional,{c,number,any,integer}},{{c,atom,[batch_size],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[batch_time],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[health_check_interval],unknown},optional,{c,number,any,integer}},{{c,atom,[health_check_timeout],unknown},optional,{c,number,any,integer}},{{c,atom,[inflight_window],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[max_buffer_bytes],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[query_mode],unknown},optional,{c,atom,[async,no_queries,simple_async,simple_async_internal_buffer,simple_sync,simple_sync_internal_buffer,sync],unknown}},{{c,atom,[resume_interval],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[spawn_buffer_workers],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[start_after_created],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[start_timeout],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[wait_for_resource_ready],unknown},optional,{c,number,any,integer}},{{c,atom,[worker_pool_size],unknown},optional,{c,number,{int_rng,0,pos_inf},integer}}],none,none},unknown}]},{emqx_node_rebalance_status_proto_v1,local_status,1} => {any,[{c,atom,any,unknown}]},{emqx_delayed_proto_v3,delete_delayed_messages_by_topic_name,2} => {any,[{c,list,{any,{c,nil,[],unknown}},unknown},{c,binary,{8,0},unknown}]},{emqx_gateway_cm_proto_v1,get_chan_info,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_mgmt_api_plugins_proto_v2,get_plugins,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_conf_proto_v3,get_config,3} => {any,[{c,atom,any,unknown},{c,list,{{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,nil,[],unknown}},unknown},any]},{emqx_topic_metrics,reset,0} => {any,[]},{emqx_gateway_cm,do_get_chan_info,3} => {{c,union,[{c,atom,[undefined],unknown},none,none,none,none,none,none,none,{c,map,{[{{c,atom,[node],unknown},mandatory,{c,atom,any,unknown}}],any,any},unknown}],unknown},[any,any,any]},{emqx_bridge_proto_v4,restart_bridges_to_all_nodes,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_node_rebalance_api_proto_v1,node_rebalance_start,2} => {any,[{c,atom,any,unknown},{c,map,{[{{c,atom,[abs_conn_threshold],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[abs_sess_threshold],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[conn_evict_rate],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[nodes],unknown},optional,{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}},{{c,atom,[rel_conn_threshold],unknown},optional,{c,number,any,unknown}},{{c,atom,[rel_sess_threshold],unknown},optional,{c,number,any,unknown}},{{c,atom,[sess_evict_rate],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[wait_health_check],unknown},optional,{c,number,any,unknown}},{{c,atom,[wait_takeover],unknown},optional,{c,number,any,unknown}}],none,none},unknown}]},{emqx_node_rebalance_api_proto_v1,node_rebalance_evacuation_start,2} => {any,[{c,atom,any,unknown},{c,map,{[{{c,atom,[conn_evict_rate],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[migrate_to],unknown},optional,{c,union,[{c,atom,[undefined],unknown},none,none,none,{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}},{{c,atom,[server_reference],unknown},optional,{c,union,[{c,atom,[undefined],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}},{{c,atom,[sess_evict_rate],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[wait_health_check],unknown},optional,{c,number,any,unknown}},{{c,atom,[wait_takeover],unknown},optional,{c,number,any,unknown}}],none,none},unknown}]},{emqx_router,get_schema_vsn,0} => {any,[]},{emqx_mgmt_cluster_proto_v3,connected_replicants,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_rule_engine,reset_metrics_for_rule,1} => {{c,atom,[ok],unknown},[{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}]},{emqx_slow_subs,clear_history,0} => {any,[]},{emqx_connector_proto_v1,start_connectors_to_all_nodes,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_prometheus,do_start,0} => {{c,atom,[ok],unknown},[]},{emqx_conf_proto_v1,get_config,2} => {any,[{c,atom,any,unknown},{c,list,{{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,nil,[],unknown}},unknown}]},{emqx_bridge_proto_v3,lookup_from_all_nodes,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_node_rebalance_api_proto_v2,node_rebalance_stop,1} => {any,[{c,atom,any,unknown}]},{emqx_node_rebalance_proto_v2,session_counts,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_conf_proto_v3,sync_data_from_node,1} => {any,[{c,atom,any,unknown}]},{emqx_bridge_proto_v2,list_bridges,1} => {any,[{c,atom,any,unknown}]},{emqx_exhook_proto_v1,server_hooks_metrics,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,binary,{8,0},unknown}]},{emqx_ds_proto_v1,drop_db,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,atom,any,unknown}]},{emqx_gateway_api_listeners_proto_v1,listeners_cluster_status,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,list,{any,{c,nil,[],unknown}},unknown}]},{emqx_proto_v2,get_stats,1} => {any,[{c,atom,any,unknown}]},{emqx_management_proto_v3,unsubscribe,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,binary,{8,0},unknown}]},{emqx_node_rebalance_proto_v1,evict_connections,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,number,{int_rng,0,pos_inf},integer}]},{emqx_prometheus_proto_v2,start,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_topic_metrics_proto_v1,metrics,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_ds_proto_v4,store_batch,5} => {any,[{c,atom,any,unknown},{c,atom,any,unknown},{c,binary,{8,0},unknown},{c,map,{[{{c,number,{int_set,[1]},integer},mandatory,{c,number,{int_set,[3]},integer}},{{c,number,{int_set,[2]},integer},mandatory,{c,list,{{c,tuple,[{c,atom,[message],unknown},{c,binary,{8,0},unknown},any,{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,map,{[],{c,atom,any,unknown},{c,atom,[false,true],unknown}},unknown},{c,map,{[{{c,atom,[allow_publish],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[peerhost],unknown},optional,{c,tuple_set,[{4,[{c,tuple,[{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer}],{4,any}}]},{8,[{c,tuple,[{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer}],{8,any}}]}],unknown}},{{c,atom,[properties],unknown},optional,{c,map,{[],{c,atom,any,unknown},any},unknown}},{{c,atom,[proto_ver],unknown},optional,{c,union,[none,{c,binary,{8,0},unknown},none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none],unknown}},{{c,atom,[protocol],unknown},optional,{c,atom,any,unknown}},{{c,atom,[username],unknown},optional,{c,union,[{c,atom,[undefined],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}}],{c,atom,any,unknown},any},unknown},{c,binary,{8,0},unknown},{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{any,{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,nil,[],unknown},none,none,none,none],unknown}},unknown},{c,number,{int_rng,0,255},integer},none,none,none],unknown},{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,nil,[],unknown},none,none,none,none],unknown}},unknown},none,none,none,none],unknown},{c,number,any,integer},any],{10,{c,atom,[message],unknown}}},{c,nil,[],unknown}},unknown}}],none,none},unknown},{c,map,{[{{c,atom,[atomic],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[sync],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_cm_proto_v1,get_chann_conn_mod,2} => {any,[{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_ds_proto_v3,store_batch,5} => {any,[{c,atom,any,unknown},{c,atom,any,unknown},{c,binary,{8,0},unknown},{c,map,{[{{c,number,{int_set,[1]},integer},mandatory,{c,number,{int_set,[3]},integer}},{{c,number,{int_set,[2]},integer},mandatory,{c,list,{{c,tuple,[{c,atom,[message],unknown},{c,binary,{8,0},unknown},any,{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,map,{[],{c,atom,any,unknown},{c,atom,[false,true],unknown}},unknown},{c,map,{[{{c,atom,[allow_publish],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[peerhost],unknown},optional,{c,tuple_set,[{4,[{c,tuple,[{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer}],{4,any}}]},{8,[{c,tuple,[{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer}],{8,any}}]}],unknown}},{{c,atom,[properties],unknown},optional,{c,map,{[],{c,atom,any,unknown},any},unknown}},{{c,atom,[proto_ver],unknown},optional,{c,union,[none,{c,binary,{8,0},unknown},none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none],unknown}},{{c,atom,[protocol],unknown},optional,{c,atom,any,unknown}},{{c,atom,[username],unknown},optional,{c,union,[{c,atom,[undefined],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}}],{c,atom,any,unknown},any},unknown},{c,binary,{8,0},unknown},{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{any,{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,nil,[],unknown},none,none,none,none],unknown}},unknown},{c,number,{int_rng,0,255},integer},none,none,none],unknown},{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,nil,[],unknown},none,none,none,none],unknown}},unknown},none,none,none,none],unknown},{c,number,any,integer},any],{10,{c,atom,[message],unknown}}},{c,nil,[],unknown}},unknown}}],none,none},unknown},{c,map,{[{{c,atom,[atomic],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[sync],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_management_proto_v4,call_client,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},any]},{emqx_mgmt,do_call_client,2} => {any,[{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},any]},{emqx_gateway_api_listeners,do_listeners_cluster_status,1} => {{c,map,{[],any,any},unknown},[{c,list,{any,{c,nil,[],unknown}},unknown}]},{emqx_ft_storage_fs_reader,read,2} => {any,[{c,identifier,[pid],unknown},{c,number,{int_rng,1,pos_inf},integer}]},{emqx_ds_proto_v1,store_batch,5} => {any,[{c,atom,any,unknown},{c,atom,any,unknown},{c,binary,{8,0},unknown},{c,map,{[{{c,number,{int_set,[1]},integer},mandatory,{c,number,{int_set,[3]},integer}},{{c,number,{int_set,[2]},integer},mandatory,{c,list,{{c,tuple,[{c,atom,[message],unknown},{c,binary,{8,0},unknown},any,{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,map,{[],{c,atom,any,unknown},{c,atom,[false,true],unknown}},unknown},{c,map,{[{{c,atom,[allow_publish],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[peerhost],unknown},optional,{c,tuple_set,[{4,[{c,tuple,[{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer}],{4,any}}]},{8,[{c,tuple,[{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer}],{8,any}}]}],unknown}},{{c,atom,[properties],unknown},optional,{c,map,{[],{c,atom,any,unknown},any},unknown}},{{c,atom,[proto_ver],unknown},optional,{c,union,[none,{c,binary,{8,0},unknown},none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none],unknown}},{{c,atom,[protocol],unknown},optional,{c,atom,any,unknown}},{{c,atom,[username],unknown},optional,{c,union,[{c,atom,[undefined],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}}],{c,atom,any,unknown},any},unknown},{c,binary,{8,0},unknown},{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{any,{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,nil,[],unknown},none,none,none,none],unknown}},unknown},{c,number,{int_rng,0,255},integer},none,none,none],unknown},{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,nil,[],unknown},none,none,none,none],unknown}},unknown},none,none,none,none],unknown},{c,number,any,integer},any],{10,{c,atom,[message],unknown}}},{c,nil,[],unknown}},unknown}}],none,none},unknown},{c,map,{[{{c,atom,[atomic],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[sync],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_proto_v1,clean_pem_cache,1} => {any,[{c,atom,any,unknown}]},{emqx_delayed,do_delete_delayed_messages_by_topic_name,1} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},{c,atom,[not_found],unknown}],{2,{c,atom,[error],unknown}}},none,none],unknown},[{c,binary,{8,0},unknown}]},{emqx_resource_proto_v2,reset_metrics,1} => {any,[{c,binary,{8,0},unknown}]},{emqx_mgmt_api_plugins,ensure_action,2} => {{c,atom,[ok],unknown},[{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,atom,[restart,start,stop],unknown}]},{emqx_bridge_proto_v5,v2_start_bridge_to_all_nodes,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_cm_proto_v1,get_chan_stats,2} => {any,[{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_delayed_proto_v3,clear_all,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_bridge_proto_v5,list_bridges_on_nodes,1} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown}]},{emqx_conf_proto_v2,sync_data_from_node,1} => {any,[{c,atom,any,unknown}]},{emqx_node_rebalance_proto_v3,disable_rebalance_agent,3} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,identifier,[pid],unknown},any]},{emqx_gateway_cm,do_set_chan_info,4} => {{c,atom,[false,true],unknown},[any,any,any,any]},{emqx_conf_proto_v1,remove_config,3} => {any,[{c,atom,any,unknown},{c,list,{{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,nil,[],unknown}},nonempty},{c,map,{[{{c,atom,[lazy_evaluator],unknown},optional,{c,function,{{c,product,[{c,function,{any,any},unknown}],unknown},any},unknown}},{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_dashboard_monitor,do_sample,2} => {any,[{c,atom,any,unknown},any]},{emqx_slow_subs_api,get_history,0} => {{c,list,{{c,map,{[{{c,atom,[clientid],unknown},mandatory,{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}},{{c,atom,[last_update_time],unknown},mandatory,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[node],unknown},mandatory,{c,atom,any,unknown}},{{c,atom,[timespan],unknown},mandatory,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[topic],unknown},mandatory,{c,binary,{8,0},unknown}}],none,none},unknown},{c,nil,[],unknown}},unknown},[]},{emqx_bridge_api,lookup_from_local_node,2} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},{c,atom,[not_bridge_v1_compatible,not_found],unknown}],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},any],{2,{c,atom,[ok],unknown}}}]},{3,[{c,tuple,[{c,atom,[ok],unknown},{c,atom,[actions,sources],unknown},{c,map,{[{{c,atom,[error],unknown},mandatory,{c,union,[none,{c,binary,{8,0},unknown},none,none,none,none,{c,tuple_set,[{3,[{c,tuple,[{c,atom,[error],unknown},{c,binary,{8,0},unknown},{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,list,{any,{c,union,[none,{c,binary,{8,0},unknown},none,none,{c,nil,[],unknown},none,none,none,none],unknown}},unknown},none,none,none,none],unknown}],{3,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[incomplete],unknown},{c,binary,{8,0},unknown},{c,binary,{8,0},unknown}],{3,{c,atom,[incomplete],unknown}}}]}],unknown},none,none],unknown}},{{c,atom,[name],unknown},mandatory,{c,binary,{8,0},unknown}},{{c,atom,[raw_config],unknown},mandatory,{c,map,{[],any,any},unknown}},{{c,atom,[resource_data],unknown},mandatory,{c,map,{[{{c,atom,[added_channels],unknown},optional,any},{{c,atom,[callback_mode],unknown},optional,{c,atom,[always_sync,async_if_possible],unknown}},{{c,atom,[config],unknown},optional,any},{{c,atom,[error],unknown},optional,any},{{c,atom,[id],unknown},optional,{c,binary,{8,0},unknown}},{{c,atom,[mod],unknown},optional,{c,atom,any,unknown}},{{c,atom,[query_mode],unknown},optional,{c,atom,[async,no_queries,simple_async,simple_async_internal_buffer,simple_sync,simple_sync_internal_buffer,sync],unknown}},{{c,atom,[state],unknown},optional,any},{{c,atom,[status],unknown},optional,{c,atom,[connected,connecting,disconnected,stopped],unknown}}],none,none},unknown}},{{c,atom,[status],unknown},mandatory,{c,atom,[connected,connecting,disconnected,stopped],unknown}},{{c,atom,[type],unknown},mandatory,{c,binary,{8,0},unknown}}],none,none},unknown}],{3,{c,atom,[ok],unknown}}}]}],unknown},[{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}]},{emqx_management_proto_v2,broker_info,1} => {any,[{c,atom,any,unknown}]},{emqx_ds_replication_layer,do_make_iterator_v1,5} => {none,[any,any,any,any,any]},{emqx_bridge,list,0} => {{c,list,{any,{c,nil,[],unknown}},unknown},[]},{emqx_eviction_agent_proto_v2,evict_session_channel,4} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,map,{[{{c,atom,[clean_start],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[clientid],unknown},optional,{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}},{{c,atom,[conn_mod],unknown},mandatory,{c,atom,any,unknown}},{{c,atom,[conn_props],unknown},optional,{c,map,{[],{c,atom,any,unknown},any},unknown}},{{c,atom,[connected],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[connected_at],unknown},optional,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[disconnected_at],unknown},optional,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[expiry_interval],unknown},optional,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[keepalive],unknown},optional,{c,number,{int_rng,0,1114111},integer}},{{c,atom,[peercert],unknown},optional,{c,union,[{c,atom,[nossl,undefined],unknown},{c,binary,{8,0},unknown},none,none,{c,list,{{c,union,[{c,atom,any,unknown},none,none,none,none,none,{c,tuple,any,{any,any}},none,none],unknown},{c,nil,[],unknown}},unknown},none,none,none,none],unknown}},{{c,atom,[peername],unknown},mandatory,{c,tuple,[{c,union,[{c,atom,[local,undefined,unspec],unknown},none,none,none,none,none,{c,tuple_set,[{4,[{c,tuple,[{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer}],{4,any}}]},{8,[{c,tuple,[{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer}],{8,any}}]}],unknown},none,none],unknown},any],{2,any}}},{{c,atom,[proto_name],unknown},optional,{c,binary,{8,0},unknown}},{{c,atom,[proto_ver],unknown},optional,{c,union,[none,{c,binary,{8,0},unknown},none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none],unknown}},{{c,atom,[receive_maximum],unknown},optional,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[sockname],unknown},mandatory,{c,tuple,[{c,union,[{c,atom,[local,undefined,unspec],unknown},none,none,none,none,none,{c,tuple_set,[{4,[{c,tuple,[{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer}],{4,any}}]},{8,[{c,tuple,[{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer}],{8,any}}]}],unknown},none,none],unknown},any],{2,any}}},{{c,atom,[socktype],unknown},mandatory,{c,atom,any,unknown}},{{c,atom,[username],unknown},optional,{c,union,[{c,atom,[undefined],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}}],{c,atom,any,unknown},any},unknown},{c,map,{[{{c,atom,[anonymous],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[auth_result],unknown},optional,{c,atom,[bad_authentication_method,bad_clientid_or_password,bad_username_or_password,banned,client_identifier_not_valid,not_authorized,server_busy,server_unavailable,success],unknown}},{{c,atom,[clientid],unknown},mandatory,{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}},{{c,atom,[cn],unknown},optional,{c,binary,{8,0},unknown}},{{c,atom,[dn],unknown},optional,{c,binary,{8,0},unknown}},{{c,atom,[is_bridge],unknown},mandatory,{c,atom,[false,true],unknown}},{{c,atom,[is_superuser],unknown},mandatory,{c,atom,[false,true],unknown}},{{c,atom,[mountpoint],unknown},mandatory,{c,union,[{c,atom,[undefined],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}},{{c,atom,[password],unknown},optional,{c,union,[{c,atom,[undefined],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}},{{c,atom,[peerhost],unknown},mandatory,{c,tuple_set,[{4,[{c,tuple,[{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer}],{4,any}}]},{8,[{c,tuple,[{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer}],{8,any}}]}],unknown}},{{c,atom,[protocol],unknown},mandatory,{c,atom,any,unknown}},{{c,atom,[sockport],unknown},mandatory,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[username],unknown},mandatory,{c,union,[{c,atom,[undefined],unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown}},{{c,atom,[ws_cookie],unknown},optional,{c,union,[{c,atom,[undefined],unknown},none,none,none,{c,list,{any,{c,nil,[],unknown}},unknown},none,none,none,none],unknown}},{{c,atom,[zone],unknown},mandatory,{c,atom,any,unknown}}],{c,atom,any,unknown},any},unknown}]},{emqx_management_proto_v5,unsubscribe_batch,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,{8,0},unknown},none,none,none,none,none,none,none],unknown},{c,list,{{c,binary,{8,0},unknown},{c,nil,[],unknown}},unknown}]},{emqx_node_rebalance_proto_v3,enable_rebalance_agent,2} => {any,[{c,list,{{c,atom,any,unknown},{c,nil,[],unknown}},unknown},{c,identifier,[pid],unknown}]}}}. diff --git a/apps/emqx_bridge_s3/src/emqx_bridge_s3_upload.erl b/apps/emqx_bridge_s3/src/emqx_bridge_s3_upload.erl index 8b7c3216e..6c5ee5d0e 100644 --- a/apps/emqx_bridge_s3/src/emqx_bridge_s3_upload.erl +++ b/apps/emqx_bridge_s3/src/emqx_bridge_s3_upload.erl @@ -238,12 +238,12 @@ convert_actions(undefined, _) -> convert_action(Conf = #{<<"parameters">> := Params, <<"resource_opts">> := ResourceOpts}, _) -> case Params of - #{<<"mode">> := <<"direct">>} -> + #{<<"mode">> := <<"aggregated">>} -> + Conf; + #{} -> %% NOTE: Disable batching for direct uploads. NResourceOpts = ResourceOpts#{<<"batch_size">> => 1, <<"batch_time">> => 0}, - Conf#{<<"resource_opts">> := NResourceOpts}; - #{} -> - Conf + Conf#{<<"resource_opts">> := NResourceOpts} end. %% Interpreting options diff --git a/apps/emqx_dashboard/include/emqx_dashboard.hrl b/apps/emqx_dashboard/include/emqx_dashboard.hrl index c2d3479cf..b2e2c1bae 100644 --- a/apps/emqx_dashboard/include/emqx_dashboard.hrl +++ b/apps/emqx_dashboard/include/emqx_dashboard.hrl @@ -73,14 +73,14 @@ -define(GAUGE_SAMPLER_LIST, [ disconnected_durable_sessions, - durable_subscriptions, + subscriptions_durable, subscriptions, topics, connections, live_connections ]). --define(SAMPLER_LIST, ?GAUGE_SAMPLER_LIST ++ ?DELTA_SAMPLER_LIST). +-define(SAMPLER_LIST, (?GAUGE_SAMPLER_LIST ++ ?DELTA_SAMPLER_LIST)). -define(DELTA_SAMPLER_RATE_MAP, #{ received => received_msg_rate, @@ -102,6 +102,11 @@ ] ++ ?LICENSE_QUOTA ). +-define(CLUSTERONLY_SAMPLER_LIST, [ + subscriptions_durable, + disconnected_durable_sessions +]). + -if(?EMQX_RELEASE_EDITION == ee). -define(LICENSE_QUOTA, [license_quota]). -else. diff --git a/apps/emqx_dashboard/src/emqx_dashboard_monitor.erl b/apps/emqx_dashboard/src/emqx_dashboard_monitor.erl index a11d875f3..a82be6a11 100644 --- a/apps/emqx_dashboard/src/emqx_dashboard_monitor.erl +++ b/apps/emqx_dashboard/src/emqx_dashboard_monitor.erl @@ -118,8 +118,7 @@ current_rate(all) -> current_rate_cluster(); current_rate(Node) when Node == node() -> try - {ok, Rate} = do_call(current_rate), - {ok, adjust_individual_node_metrics(Rate)} + do_call(current_rate) catch _E:R -> ?SLOG(warning, #{msg => "dashboard_monitor_error", reason => R}), @@ -222,8 +221,11 @@ do_sample(Node, Time) -> Res end. -do_sample([], _Time, Res) -> - Res; +do_sample([], _Time, Samples) -> + maps:map( + fun(_TS, Sample) -> adjust_synthetic_cluster_metrics(Sample) end, + Samples + ); do_sample([Node | Nodes], Time, Res) -> case do_sample(Node, Time) of {badrpc, Reason} -> @@ -237,22 +239,27 @@ match_spec(infinity) -> match_spec(Time) -> [{{'_', '$1', '_'}, [{'>=', '$1', Time}], ['$_']}]. -merge_cluster_samplers(Node, Cluster) -> - maps:fold(fun merge_cluster_samplers/3, Cluster, Node). +merge_cluster_samplers(NodeSamples, Cluster) -> + maps:fold(fun merge_cluster_samplers/3, Cluster, NodeSamples). -merge_cluster_samplers(TS, NodeData, Cluster) -> +merge_cluster_samplers(TS, NodeSample, Cluster) -> case maps:get(TS, Cluster, undefined) of undefined -> - Cluster#{TS => NodeData}; - ClusterData -> - Cluster#{TS => merge_cluster_sampler_map(NodeData, ClusterData)} + Cluster#{TS => NodeSample}; + ClusterSample -> + Cluster#{TS => merge_cluster_sampler_map(NodeSample, ClusterSample)} end. merge_cluster_sampler_map(M1, M2) -> Fun = fun - (topics, Map) -> - Map#{topics => maps:get(topics, M1)}; + (Key, Map) when + %% cluster-synced values + Key =:= topics; + Key =:= subscriptions_durable; + Key =:= disconnected_durable_sessions + -> + Map#{Key => maps:get(Key, M1)}; (Key, Map) -> Map#{Key => maps:get(Key, M1, 0) + maps:get(Key, M2, 0)} end, @@ -283,10 +290,6 @@ merge_cluster_rate(Node, Cluster) -> end, maps:fold(Fun, Cluster, Node). -adjust_individual_node_metrics(Metrics0) -> - %% ensure renamed - emqx_utils_maps:rename(durable_subscriptions, subscriptions_durable, Metrics0). - adjust_synthetic_cluster_metrics(Metrics0) -> DSSubs = maps:get(subscriptions_durable, Metrics0, 0), RamSubs = maps:get(subscriptions, Metrics0, 0), @@ -445,7 +448,7 @@ stats(connections) -> emqx_stats:getstat('connections.count'); stats(disconnected_durable_sessions) -> emqx_persistent_session_bookkeeper:get_disconnected_session_count(); -stats(durable_subscriptions) -> +stats(subscriptions_durable) -> emqx_stats:getstat('durable_subscriptions.count'); stats(live_connections) -> emqx_stats:getstat('live_connections.count'); diff --git a/apps/emqx_dashboard/src/emqx_dashboard_monitor_api.erl b/apps/emqx_dashboard/src/emqx_dashboard_monitor_api.erl index 2560f8f2a..fafa821e3 100644 --- a/apps/emqx_dashboard/src/emqx_dashboard_monitor_api.erl +++ b/apps/emqx_dashboard/src/emqx_dashboard_monitor_api.erl @@ -202,11 +202,10 @@ swagger_desc(persisted) -> swagger_desc_format("Messages saved to the durable storage "); swagger_desc(disconnected_durable_sessions) -> <<"Disconnected durable sessions at the time of sampling.", ?APPROXIMATE_DESC>>; -swagger_desc(durable_subscriptions) -> +swagger_desc(subscriptions_durable) -> <<"Subscriptions from durable sessions at the time of sampling.", ?APPROXIMATE_DESC>>; swagger_desc(subscriptions) -> - <<"Subscriptions at the time of sampling (not considering durable sessions).", - ?APPROXIMATE_DESC>>; + <<"Subscriptions at the time of sampling.", ?APPROXIMATE_DESC>>; swagger_desc(topics) -> <<"Count topics at the time of sampling.", ?APPROXIMATE_DESC>>; swagger_desc(connections) -> @@ -252,8 +251,4 @@ swagger_desc_format(Format, Type) -> maybe_reject_cluster_only_metrics(<<"all">>, Rates) -> Rates; maybe_reject_cluster_only_metrics(_Node, Rates) -> - ClusterOnlyMetrics = [ - subscriptions_durable, - disconnected_durable_sessions - ], - maps:without(ClusterOnlyMetrics, Rates). + maps:without(?CLUSTERONLY_SAMPLER_LIST, Rates). diff --git a/apps/emqx_dashboard/test/emqx_dashboard_monitor_SUITE.erl b/apps/emqx_dashboard/test/emqx_dashboard_monitor_SUITE.erl index edf7c9bbf..8f561deca 100644 --- a/apps/emqx_dashboard/test/emqx_dashboard_monitor_SUITE.erl +++ b/apps/emqx_dashboard/test/emqx_dashboard_monitor_SUITE.erl @@ -224,13 +224,16 @@ t_monitor_current_api(_) -> ], ?assert(maps:is_key(<<"subscriptions_durable">>, Rate)), ?assert(maps:is_key(<<"disconnected_durable_sessions">>, Rate)), - ClusterOnlyMetrics = [durable_subscriptions, disconnected_durable_sessions], {ok, NodeRate} = request(["monitor_current", "nodes", node()]), - [ - ?assert(maps:is_key(atom_to_binary(Key, utf8), NodeRate), #{key => Key, rates => NodeRate}) - || Key <- maps:values(?DELTA_SAMPLER_RATE_MAP) ++ ?GAUGE_SAMPLER_LIST, - not lists:member(Key, ClusterOnlyMetrics) - ], + ExpectedKeys = lists:map( + fun atom_to_binary/1, + (?GAUGE_SAMPLER_LIST ++ maps:values(?DELTA_SAMPLER_RATE_MAP)) -- ?CLUSTERONLY_SAMPLER_LIST + ), + ?assertEqual( + [], + ExpectedKeys -- maps:keys(NodeRate), + NodeRate + ), ?assertNot(maps:is_key(<<"subscriptions_durable">>, NodeRate)), ?assertNot(maps:is_key(<<"subscriptions_ram">>, NodeRate)), ?assertNot(maps:is_key(<<"disconnected_durable_sessions">>, NodeRate)), @@ -426,6 +429,21 @@ t_persistent_session_stats(Config) -> ?ON(N1, request(["monitor_current"])) ) end), + %% Verify that historical metrics are in line with the current ones. + ?assertMatch( + {ok, [ + #{ + <<"time_stamp">> := _, + <<"connections">> := 3, + <<"disconnected_durable_sessions">> := 1, + <<"topics">> := 8, + <<"subscriptions">> := 8, + <<"subscriptions_ram">> := 4, + <<"subscriptions_durable">> := 4 + } + ]}, + ?ON(N1, request(["monitor"], "latest=1")) + ), {ok, {ok, _}} = ?wait_async_action( emqtt:disconnect(PSClient2), diff --git a/apps/emqx_durable_storage/src/emqx_ds_replication_layer.erl b/apps/emqx_durable_storage/src/emqx_ds_replication_layer.erl index ee4e71812..836e9df07 100644 --- a/apps/emqx_durable_storage/src/emqx_ds_replication_layer.erl +++ b/apps/emqx_durable_storage/src/emqx_ds_replication_layer.erl @@ -566,7 +566,11 @@ list_nodes() -> EXPR catch error:RPCError__ = {erpc, _} -> - {error, recoverable, RPCError__} + {error, recoverable, RPCError__}; + %% Note: remote node never _throws_ unrecoverable errors, so + %% we can assume that all exceptions are transient. + EC__:RPCError__:Stack__ -> + {error, recoverable, #{EC__ => RPCError__, stacktrace => Stack__}} end ). @@ -605,13 +609,7 @@ ra_add_generation(DB, Shard) -> ?tag => add_generation, ?since => emqx_ds:timestamp_us() }, - Servers = emqx_ds_replication_layer_shard:servers(DB, Shard, leader_preferred), - case ra:process_command(Servers, Command, ?RA_TIMEOUT) of - {ok, Result, _Leader} -> - Result; - Error -> - error(Error, [DB, Shard]) - end. + ra_command(DB, Shard, Command, 10). ra_update_config(DB, Shard, Opts) -> Command = #{ @@ -619,20 +617,20 @@ ra_update_config(DB, Shard, Opts) -> ?config => Opts, ?since => emqx_ds:timestamp_us() }, - Servers = emqx_ds_replication_layer_shard:servers(DB, Shard, leader_preferred), - case ra:process_command(Servers, Command, ?RA_TIMEOUT) of - {ok, Result, _Leader} -> - Result; - Error -> - error(Error, [DB, Shard]) - end. + ra_command(DB, Shard, Command, 10). ra_drop_generation(DB, Shard, GenId) -> Command = #{?tag => drop_generation, ?generation => GenId}, + ra_command(DB, Shard, Command, 10). + +ra_command(DB, Shard, Command, Retries) -> Servers = emqx_ds_replication_layer_shard:servers(DB, Shard, leader_preferred), case ra:process_command(Servers, Command, ?RA_TIMEOUT) of {ok, Result, _Leader} -> Result; + _Error when Retries > 0 -> + timer:sleep(?RA_TIMEOUT), + ra_command(DB, Shard, Command, Retries - 1); Error -> error(Error, [DB, Shard]) end. diff --git a/apps/emqx_durable_storage/src/emqx_ds_storage_layer.erl b/apps/emqx_durable_storage/src/emqx_ds_storage_layer.erl index 2245e81c5..f35792c17 100644 --- a/apps/emqx_durable_storage/src/emqx_ds_storage_layer.erl +++ b/apps/emqx_durable_storage/src/emqx_ds_storage_layer.erl @@ -591,6 +591,7 @@ init({ShardId, Options}) -> shard = Shard }, commit_metadata(S), + ?tp(debug, ds_storage_init_state, #{shard => ShardId, s => S}), {ok, S}. format_status(Status) -> @@ -625,7 +626,6 @@ handle_call(#call_list_generations_with_lifetimes{}, _From, S) -> {reply, Generations, S}; handle_call(#call_drop_generation{gen_id = GenId}, _From, S0) -> {Reply, S} = handle_drop_generation(S0, GenId), - commit_metadata(S), {reply, Reply, S}; handle_call(#call_take_snapshot{}, _From, S) -> Snapshot = handle_take_snapshot(S), @@ -774,6 +774,21 @@ handle_drop_generation(S0, GenId) -> shard = OldShard, cf_refs = OldCFRefs } = S0, + %% 1. Commit the metadata first, so other functions are less + %% likely to see stale data, and replicas don't end up + %% inconsistent state, where generation's column families are + %% absent, but its metadata is still present. + %% + %% Note: in theory, this operation may be interrupted in the + %% middle. This will leave column families hanging. + Shard = maps:remove(?GEN_KEY(GenId), OldShard), + Schema = maps:remove(?GEN_KEY(GenId), OldSchema), + S1 = S0#s{ + shard = Shard, + schema = Schema + }, + commit_metadata(S1), + %% 2. Now, actually drop the data from RocksDB: #{module := Mod, cf_refs := GenCFRefs} = GenSchema, #{?GEN_KEY(GenId) := #{data := RuntimeData}} = OldShard, try @@ -793,13 +808,7 @@ handle_drop_generation(S0, GenId) -> ) end, CFRefs = OldCFRefs -- GenCFRefs, - Shard = maps:remove(?GEN_KEY(GenId), OldShard), - Schema = maps:remove(?GEN_KEY(GenId), OldSchema), - S = S0#s{ - cf_refs = CFRefs, - shard = Shard, - schema = Schema - }, + S = S1#s{cf_refs = CFRefs}, {ok, S}. -spec open_generation(shard_id(), rocksdb:db_handle(), cf_refs(), gen_id(), generation_schema()) -> diff --git a/apps/emqx_durable_storage/test/emqx_ds_replication_SUITE.erl b/apps/emqx_durable_storage/test/emqx_ds_replication_SUITE.erl index 941e20641..1b2a21105 100644 --- a/apps/emqx_durable_storage/test/emqx_ds_replication_SUITE.erl +++ b/apps/emqx_durable_storage/test/emqx_ds_replication_SUITE.erl @@ -25,8 +25,8 @@ -define(DB, testdb). --define(ON(NODE, BODY), - erpc:call(NODE, erlang, apply, [fun() -> BODY end, []]) +-define(ON(NODES, BODY), + emqx_ds_test_helpers:on(NODES, fun() -> BODY end) ). opts() -> @@ -476,6 +476,84 @@ t_rebalance_offline_restarts(Config) -> ?retry(1000, 20, ?assertEqual([], emqx_ds_test_helpers:transitions(N1, ?DB))), ?assertEqual(lists:sort([S1, S2]), ds_repl_meta(N1, db_sites, [?DB])). +t_drop_generation(Config) -> + Apps = [appspec(emqx_durable_storage)], + [_, _, NS3] = + NodeSpecs = emqx_cth_cluster:mk_nodespecs( + [ + {t_drop_generation1, #{apps => Apps}}, + {t_drop_generation2, #{apps => Apps}}, + {t_drop_generation3, #{apps => Apps}} + ], + #{ + work_dir => emqx_cth_suite:work_dir(?FUNCTION_NAME, Config) + } + ), + + Nodes = [N1, _, N3] = emqx_cth_cluster:start(NodeSpecs), + ?check_trace( + try + %% Initialize DB on all 3 nodes. + Opts = opts(#{n_shards => 1, n_sites => 3, replication_factor => 3}), + ?assertEqual( + [{ok, ok} || _ <- Nodes], + erpc:multicall(Nodes, emqx_ds, open_db, [?DB, Opts]) + ), + timer:sleep(1000), + %% Create a generation while all nodes are online: + ?ON(N1, ?assertMatch(ok, emqx_ds:add_generation(?DB))), + ?ON( + Nodes, + ?assertEqual( + [{<<"0">>, 1}, {<<"0">>, 2}], + maps:keys(emqx_ds:list_generations_with_lifetimes(?DB)) + ) + ), + %% Drop generation while all nodes are online: + ?ON(N1, ?assertMatch(ok, emqx_ds:drop_generation(?DB, {<<"0">>, 1}))), + ?ON( + Nodes, + ?assertEqual( + [{<<"0">>, 2}], + maps:keys(emqx_ds:list_generations_with_lifetimes(?DB)) + ) + ), + %% Ston N3, then create and drop generation when it's offline: + ok = emqx_cth_cluster:stop_node(N3), + ?ON( + N1, + begin + ok = emqx_ds:add_generation(?DB), + ok = emqx_ds:drop_generation(?DB, {<<"0">>, 2}) + end + ), + %% Restart N3 and verify that it reached the consistent state: + emqx_cth_cluster:restart(NS3), + ok = ?ON(N3, emqx_ds:open_db(?DB, Opts)), + %% N3 can be in unstalbe state right now, but it still + %% must successfully return streams: + ?ON( + Nodes, + ?assertEqual([], emqx_ds:get_streams(?DB, ['#'], 0)) + ), + timer:sleep(1000), + ?ON( + Nodes, + ?assertEqual( + [{<<"0">>, 3}], + maps:keys(emqx_ds:list_generations_with_lifetimes(?DB)) + ) + ) + after + emqx_cth_cluster:stop(Nodes) + end, + fun(Trace) -> + %% TODO: some idempotency errors still happen + %% ?assertMatch([], ?of_kind(ds_storage_layer_failed_to_drop_generation, Trace)), + true + end + ). + %% shard_server_info(Node, DB, Shard, Site, Info) -> diff --git a/apps/emqx_durable_storage/test/emqx_ds_test_helpers.erl b/apps/emqx_durable_storage/test/emqx_ds_test_helpers.erl index f3ad1c151..4fed1d57b 100644 --- a/apps/emqx_durable_storage/test/emqx_ds_test_helpers.erl +++ b/apps/emqx_durable_storage/test/emqx_ds_test_helpers.erl @@ -23,9 +23,31 @@ -include_lib("stdlib/include/assert.hrl"). -define(ON(NODE, BODY), - erpc:call(NODE, erlang, apply, [fun() -> BODY end, []]) + emqx_ds_test_helpers:on(NODE, fun() -> BODY end) ). +-spec on([node()] | node(), fun(() -> A)) -> A | [A]. +on(Node, Fun) when is_atom(Node) -> + [Ret] = on([Node], Fun), + Ret; +on(Nodes, Fun) -> + Results = erpc:multicall(Nodes, erlang, apply, [Fun, []]), + lists:map( + fun + ({_Node, {ok, Result}}) -> + Result; + ({Node, Error}) -> + ct:pal("Error on node ~p", [Node]), + case Error of + {error, {exception, Reason, Stack}} -> + erlang:raise(error, Reason, Stack); + _ -> + error(Error) + end + end, + lists:zip(Nodes, Results) + ). + %% RPC mocking mock_rpc() -> diff --git a/apps/emqx_license/include/emqx_license.hrl b/apps/emqx_license/include/emqx_license.hrl index 35aa62f5b..820782d5e 100644 --- a/apps/emqx_license/include/emqx_license.hrl +++ b/apps/emqx_license/include/emqx_license.hrl @@ -32,6 +32,7 @@ -define(MEDIUM_CUSTOMER, 1). -define(LARGE_CUSTOMER, 2). -define(BUSINESS_CRITICAL_CUSTOMER, 3). +-define(BYOC_CUSTOMER, 4). -define(EVALUATION_CUSTOMER, 10). -define(EXPIRED_DAY, -90). diff --git a/apps/emqx_license/src/emqx_license_parser.erl b/apps/emqx_license/src/emqx_license_parser.erl index 67ad801bc..af466638a 100644 --- a/apps/emqx_license/src/emqx_license_parser.erl +++ b/apps/emqx_license/src/emqx_license_parser.erl @@ -29,6 +29,7 @@ | ?MEDIUM_CUSTOMER | ?LARGE_CUSTOMER | ?BUSINESS_CRITICAL_CUSTOMER + | ?BYOC_CUSTOMER | ?EVALUATION_CUSTOMER. -type license_type() :: ?OFFICIAL | ?TRIAL. diff --git a/apps/emqx_management/src/emqx_mgmt_api_clients.erl b/apps/emqx_management/src/emqx_mgmt_api_clients.erl index f8a62205a..ecef5b720 100644 --- a/apps/emqx_management/src/emqx_mgmt_api_clients.erl +++ b/apps/emqx_management/src/emqx_mgmt_api_clients.erl @@ -141,14 +141,16 @@ schema("/clients_v2") -> parameters => fields(list_clients_v2_inputs), responses => #{ 200 => - emqx_dashboard_swagger:schema_with_example(?R_REF(list_clients_v2_response), #{ - <<"data">> => [client_example()], - <<"meta">> => #{ - <<"count">> => 1, - <<"cursor">> => <<"g2wAAAADYQFhAm0AAAACYzJq">>, - <<"hasnext">> => true - } - }), + %% TODO: unhide after API is ready + %% emqx_dashboard_swagger:schema_with_example(?R_REF(list_clients_v2_response), #{ + %% <<"data">> => [client_example()], + %% <<"meta">> => #{ + %% <<"count">> => 1, + %% <<"cursor">> => <<"g2wAAAADYQFhAm0AAAACYzJq">>, + %% <<"hasnext">> => true + %% } + %% }), + emqx_dashboard_swagger:schema_with_example(map(), #{}), 400 => emqx_dashboard_swagger:error_codes( ['INVALID_PARAMETER'], <<"Invalid parameters">> diff --git a/apps/emqx_management/src/emqx_mgmt_api_ds.erl b/apps/emqx_management/src/emqx_mgmt_api_ds.erl index 94d025469..5d0bd8763 100644 --- a/apps/emqx_management/src/emqx_mgmt_api_ds.erl +++ b/apps/emqx_management/src/emqx_mgmt_api_ds.erl @@ -307,7 +307,7 @@ get_site(get, #{bindings := #{site := Site}}) -> ?NOT_FOUND(<<"Site not found: ", Site/binary>>); true -> Node = emqx_ds_replication_layer_meta:node(Site), - IsUp = lists:member(Node, [node() | nodes()]), + IsUp = mria:cluster_status(Node) =:= running, Shards = shards_of_site(Site), ?OK(#{ node => Node, diff --git a/apps/emqx_management/src/emqx_mgmt_api_plugins.erl b/apps/emqx_management/src/emqx_mgmt_api_plugins.erl index ed5f016b3..a60131cfc 100644 --- a/apps/emqx_management/src/emqx_mgmt_api_plugins.erl +++ b/apps/emqx_management/src/emqx_mgmt_api_plugins.erl @@ -20,6 +20,7 @@ -include_lib("typerefl/include/types.hrl"). -include_lib("emqx/include/logger.hrl"). -include_lib("emqx_plugins/include/emqx_plugins.hrl"). +-include_lib("erlavro/include/erlavro.hrl"). -dialyzer({no_match, [format_plugin_avsc_and_i18n/1]}). @@ -506,14 +507,20 @@ plugin_config(get, #{bindings := #{name := NameVsn}}) -> {404, plugin_not_found_msg()} end; plugin_config(put, #{bindings := #{name := NameVsn}, body := AvroJsonMap}) -> + Nodes = emqx:running_nodes(), case emqx_plugins:describe(NameVsn) of {ok, _} -> case emqx_plugins:decode_plugin_config_map(NameVsn, AvroJsonMap) of - {ok, AvroValueConfig} -> - Nodes = emqx:running_nodes(), + {ok, ?plugin_without_config_schema} -> + %% no plugin avro schema, just put the json map as-is + _Res = emqx_mgmt_api_plugins_proto_v3:update_plugin_config( + Nodes, NameVsn, AvroJsonMap, ?plugin_without_config_schema + ), + {204}; + {ok, AvroValue} -> %% cluster call with config in map (binary key-value) _Res = emqx_mgmt_api_plugins_proto_v3:update_plugin_config( - Nodes, NameVsn, AvroJsonMap, AvroValueConfig + Nodes, NameVsn, AvroJsonMap, AvroValue ), {204}; {error, Reason} -> @@ -604,9 +611,13 @@ ensure_action(Name, restart) -> ok. %% for RPC plugin avro encoded config update -do_update_plugin_config(NameVsn, AvroJsonMap, PluginConfigMap) -> - %% TODO: maybe use `PluginConfigMap` to validate config - emqx_plugins:put_config(NameVsn, AvroJsonMap, PluginConfigMap). +-spec do_update_plugin_config( + name_vsn(), map(), avro_value() | ?plugin_without_config_schema +) -> + ok. +do_update_plugin_config(NameVsn, AvroJsonMap, AvroValue) -> + %% TODO: maybe use `AvroValue` to validate config + emqx_plugins:put_config(NameVsn, AvroJsonMap, AvroValue). %%-------------------------------------------------------------------- %% Helper functions diff --git a/apps/emqx_management/src/proto/emqx_mgmt_api_plugins_proto_v3.erl b/apps/emqx_management/src/proto/emqx_mgmt_api_plugins_proto_v3.erl index 641d35f70..d221a5e2a 100644 --- a/apps/emqx_management/src/proto/emqx_mgmt_api_plugins_proto_v3.erl +++ b/apps/emqx_management/src/proto/emqx_mgmt_api_plugins_proto_v3.erl @@ -28,6 +28,7 @@ ]). -include_lib("emqx/include/bpapi.hrl"). +-include_lib("emqx_plugins/include/emqx_plugins.hrl"). introduced_in() -> "5.7.0". @@ -56,14 +57,14 @@ ensure_action(Name, Action) -> [node()], binary() | string(), binary(), - map() + map() | ?plugin_without_config_schema ) -> emqx_rpc:multicall_result(). -update_plugin_config(Nodes, NameVsn, AvroJsonMap, PluginConfig) -> +update_plugin_config(Nodes, NameVsn, AvroJsonMap, MaybeAvroValue) -> rpc:multicall( Nodes, emqx_mgmt_api_plugins, do_update_plugin_config, - [NameVsn, AvroJsonMap, PluginConfig], + [NameVsn, AvroJsonMap, MaybeAvroValue], 10000 ). diff --git a/apps/emqx_management/test/emqx_mgmt_api_alarms_SUITE.erl b/apps/emqx_management/test/emqx_mgmt_api_alarms_SUITE.erl index a0ff5fc93..cfb9444ad 100644 --- a/apps/emqx_management/test/emqx_mgmt_api_alarms_SUITE.erl +++ b/apps/emqx_management/test/emqx_mgmt_api_alarms_SUITE.erl @@ -19,6 +19,7 @@ -compile(nowarn_export_all). -include_lib("eunit/include/eunit.hrl"). +-include_lib("common_test/include/ct.hrl"). -define(ACT_ALARM, test_act_alarm). -define(DE_ACT_ALARM, test_de_act_alarm). @@ -27,11 +28,18 @@ all() -> emqx_common_test_helpers:all(?MODULE). init_per_suite(Config) -> - emqx_mgmt_api_test_util:init_suite(), - Config. + Apps = emqx_cth_suite:start( + [ + emqx, + emqx_management, + emqx_mgmt_api_test_util:emqx_dashboard() + ], + #{work_dir => emqx_cth_suite:work_dir(Config)} + ), + [{suite_apps, Apps} | Config]. -end_per_suite(_) -> - emqx_mgmt_api_test_util:end_suite(). +end_per_suite(Config) -> + ok = emqx_cth_suite:stop(?config(suite_apps, Config)). t_alarms_api(_) -> ok = emqx_alarm:activate(?ACT_ALARM), diff --git a/apps/emqx_management/test/emqx_mgmt_api_api_keys_SUITE.erl b/apps/emqx_management/test/emqx_mgmt_api_api_keys_SUITE.erl index b0d6e6323..177216b42 100644 --- a/apps/emqx_management/test/emqx_mgmt_api_api_keys_SUITE.erl +++ b/apps/emqx_management/test/emqx_mgmt_api_api_keys_SUITE.erl @@ -56,11 +56,18 @@ groups() -> ]. init_per_suite(Config) -> - emqx_mgmt_api_test_util:init_suite([emqx_conf, emqx_management]), - Config. + Apps = emqx_cth_suite:start( + [ + emqx_conf, + emqx_management, + emqx_mgmt_api_test_util:emqx_dashboard() + ], + #{work_dir => emqx_cth_suite:work_dir(Config)} + ), + [{suite_apps, Apps} | Config]. -end_per_suite(_) -> - emqx_mgmt_api_test_util:end_suite([emqx_conf, emqx_management]). +end_per_suite(Config) -> + ok = emqx_cth_suite:stop(?config(suite_apps, Config)). t_bootstrap_file(_) -> TestPath = <<"/api/v5/status">>, diff --git a/apps/emqx_management/test/emqx_mgmt_api_banned_SUITE.erl b/apps/emqx_management/test/emqx_mgmt_api_banned_SUITE.erl index 36c200258..e08ff594b 100644 --- a/apps/emqx_management/test/emqx_mgmt_api_banned_SUITE.erl +++ b/apps/emqx_management/test/emqx_mgmt_api_banned_SUITE.erl @@ -19,6 +19,7 @@ -compile(nowarn_export_all). -include_lib("eunit/include/eunit.hrl"). +-include_lib("common_test/include/ct.hrl"). -define(EXPIRATION_TIME, 31536000). @@ -26,11 +27,18 @@ all() -> emqx_common_test_helpers:all(?MODULE). init_per_suite(Config) -> - emqx_mgmt_api_test_util:init_suite(), - Config. + Apps = emqx_cth_suite:start( + [ + emqx, + emqx_management, + emqx_mgmt_api_test_util:emqx_dashboard() + ], + #{work_dir => emqx_cth_suite:work_dir(Config)} + ), + [{suite_apps, Apps} | Config]. -end_per_suite(_) -> - emqx_mgmt_api_test_util:end_suite(). +end_per_suite(Config) -> + ok = emqx_cth_suite:stop(?config(suite_apps, Config)). t_create(_Config) -> Now = erlang:system_time(second), diff --git a/apps/emqx_management/test/emqx_mgmt_api_cluster_SUITE.erl b/apps/emqx_management/test/emqx_mgmt_api_cluster_SUITE.erl index d1438b3ee..f18e73533 100644 --- a/apps/emqx_management/test/emqx_mgmt_api_cluster_SUITE.erl +++ b/apps/emqx_management/test/emqx_mgmt_api_cluster_SUITE.erl @@ -41,9 +41,12 @@ init_per_testcase(TC = t_cluster_invite_api_timeout, Config0) -> init_per_testcase(TC = t_cluster_invite_async, Config0) -> Config = [{tc_name, TC} | Config0], [{cluster, cluster(Config)} | setup(Config)]; -init_per_testcase(_TC, Config) -> - emqx_mgmt_api_test_util:init_suite(?APPS), - Config. +init_per_testcase(TC, Config) -> + Apps = emqx_cth_suite:start( + ?APPS ++ [emqx_mgmt_api_test_util:emqx_dashboard()], + #{work_dir => emqx_cth_suite:work_dir(TC, Config)} + ), + [{tc_apps, Apps} | Config]. end_per_testcase(t_cluster_topology_api_replicants, Config) -> emqx_cth_cluster:stop(?config(cluster, Config)), @@ -54,8 +57,8 @@ end_per_testcase(t_cluster_invite_api_timeout, Config) -> end_per_testcase(t_cluster_invite_async, Config) -> emqx_cth_cluster:stop(?config(cluster, Config)), cleanup(Config); -end_per_testcase(_TC, _Config) -> - emqx_mgmt_api_test_util:end_suite(?APPS). +end_per_testcase(_TC, Config) -> + ok = emqx_cth_suite:stop(?config(tc_apps, Config)). t_cluster_topology_api_empty_resp(_) -> ClusterTopologyPath = emqx_mgmt_api_test_util:api_path(["cluster", "topology"]), diff --git a/apps/emqx_management/test/emqx_mgmt_api_configs_SUITE.erl b/apps/emqx_management/test/emqx_mgmt_api_configs_SUITE.erl index a3ff23b83..678a00cad 100644 --- a/apps/emqx_management/test/emqx_mgmt_api_configs_SUITE.erl +++ b/apps/emqx_management/test/emqx_mgmt_api_configs_SUITE.erl @@ -25,11 +25,18 @@ all() -> emqx_common_test_helpers:all(?MODULE). init_per_suite(Config) -> - emqx_mgmt_api_test_util:init_suite([emqx_conf]), - Config. + Apps = emqx_cth_suite:start( + [ + emqx_conf, + emqx_management, + emqx_mgmt_api_test_util:emqx_dashboard() + ], + #{work_dir => emqx_cth_suite:work_dir(Config)} + ), + [{suite_apps, Apps} | Config]. -end_per_suite(_) -> - emqx_mgmt_api_test_util:end_suite([emqx_conf]). +end_per_suite(Config) -> + ok = emqx_cth_suite:stop(?config(suite_apps, Config)). init_per_testcase(TestCase = t_configs_node, Config) -> ?MODULE:TestCase({'init', Config}); diff --git a/apps/emqx_management/test/emqx_mgmt_api_listeners_SUITE.erl b/apps/emqx_management/test/emqx_mgmt_api_listeners_SUITE.erl index 07885d93d..02a098f28 100644 --- a/apps/emqx_management/test/emqx_mgmt_api_listeners_SUITE.erl +++ b/apps/emqx_management/test/emqx_mgmt_api_listeners_SUITE.erl @@ -74,13 +74,10 @@ init_group_apps(Config, CTConfig) -> [ {emqx_conf, Config}, emqx_management, - {emqx_dashboard, "dashboard.listeners.http { enable = true, bind = 18083 }"} + emqx_mgmt_api_test_util:emqx_dashboard() ], - #{ - work_dir => emqx_cth_suite:work_dir(CTConfig) - } + #{work_dir => emqx_cth_suite:work_dir(CTConfig)} ), - {ok, _} = emqx_common_test_http:create_default_app(), [{suite_apps, Apps} | CTConfig]. end_per_group(_Group, Config) -> diff --git a/apps/emqx_management/test/emqx_mgmt_api_metrics_SUITE.erl b/apps/emqx_management/test/emqx_mgmt_api_metrics_SUITE.erl index 03b3437f4..ebbf17d27 100644 --- a/apps/emqx_management/test/emqx_mgmt_api_metrics_SUITE.erl +++ b/apps/emqx_management/test/emqx_mgmt_api_metrics_SUITE.erl @@ -19,16 +19,24 @@ -compile(nowarn_export_all). -include_lib("eunit/include/eunit.hrl"). +-include_lib("common_test/include/ct.hrl"). all() -> emqx_common_test_helpers:all(?MODULE). init_per_suite(Config) -> - emqx_mgmt_api_test_util:init_suite(), - Config. + Apps = emqx_cth_suite:start( + [ + emqx, + emqx_management, + emqx_mgmt_api_test_util:emqx_dashboard() + ], + #{work_dir => emqx_cth_suite:work_dir(Config)} + ), + [{suite_apps, Apps} | Config]. -end_per_suite(_) -> - emqx_mgmt_api_test_util:end_suite(). +end_per_suite(Config) -> + ok = emqx_cth_suite:stop(?config(suite_apps, Config)). t_metrics_api(_) -> {ok, MetricsResponse} = request_helper("metrics?aggregate=true"), diff --git a/apps/emqx_management/test/emqx_mgmt_api_nodes_SUITE.erl b/apps/emqx_management/test/emqx_mgmt_api_nodes_SUITE.erl index f64d1240b..1a0ea8903 100644 --- a/apps/emqx_management/test/emqx_mgmt_api_nodes_SUITE.erl +++ b/apps/emqx_management/test/emqx_mgmt_api_nodes_SUITE.erl @@ -29,11 +29,10 @@ init_per_suite(Config) -> [ emqx_conf, emqx_management, - {emqx_dashboard, "dashboard.listeners.http { enable = true, bind = 18083 }"} + emqx_mgmt_api_test_util:emqx_dashboard() ], #{work_dir => emqx_cth_suite:work_dir(Config)} ), - {ok, _} = emqx_common_test_http:create_default_app(), [{suite_apps, Apps} | Config]. end_per_suite(Config) -> diff --git a/apps/emqx_management/test/emqx_mgmt_api_plugins_SUITE.erl b/apps/emqx_management/test/emqx_mgmt_api_plugins_SUITE.erl index e563ba262..dcb6bf5f0 100644 --- a/apps/emqx_management/test/emqx_mgmt_api_plugins_SUITE.erl +++ b/apps/emqx_management/test/emqx_mgmt_api_plugins_SUITE.erl @@ -34,24 +34,23 @@ all() -> init_per_suite(Config) -> WorkDir = proplists:get_value(data_dir, Config), - ok = filelib:ensure_dir(WorkDir), DemoShDir1 = string:replace(WorkDir, "emqx_mgmt_api_plugins", "emqx_plugins"), DemoShDir = lists:flatten(string:replace(DemoShDir1, "emqx_management", "emqx_plugins")), - OrigInstallDir = emqx_plugins:get_config_interal(install_dir, undefined), + Apps = emqx_cth_suite:start( + [ + emqx_conf, + emqx_plugins, + emqx_management, + emqx_mgmt_api_test_util:emqx_dashboard() + ], + #{work_dir => emqx_cth_suite:work_dir(Config)} + ), ok = filelib:ensure_dir(DemoShDir), - emqx_mgmt_api_test_util:init_suite([emqx_conf, emqx_plugins]), emqx_plugins:put_config_internal(install_dir, DemoShDir), - [{demo_sh_dir, DemoShDir}, {orig_install_dir, OrigInstallDir} | Config]. + [{apps, Apps}, {demo_sh_dir, DemoShDir} | Config]. end_per_suite(Config) -> - emqx_common_test_helpers:boot_modules(all), - %% restore config - case proplists:get_value(orig_install_dir, Config) of - undefined -> ok; - OrigInstallDir -> emqx_plugins:put_config_internal(install_dir, OrigInstallDir) - end, - emqx_mgmt_api_test_util:end_suite([emqx_plugins, emqx_conf]), - ok. + ok = emqx_cth_suite:stop(?config(apps, Config)). init_per_testcase(t_cluster_update_order = TestCase, Config0) -> Config = [{api_port, 18085} | Config0], diff --git a/apps/emqx_management/test/emqx_mgmt_api_trace_SUITE.erl b/apps/emqx_management/test/emqx_mgmt_api_trace_SUITE.erl index ce29a67f6..d55532987 100644 --- a/apps/emqx_management/test/emqx_mgmt_api_trace_SUITE.erl +++ b/apps/emqx_management/test/emqx_mgmt_api_trace_SUITE.erl @@ -24,6 +24,7 @@ -include_lib("stdlib/include/zip.hrl"). -include_lib("snabbkaffe/include/snabbkaffe.hrl"). -include_lib("emqx/include/logger.hrl"). +-include_lib("common_test/include/ct.hrl"). %%-------------------------------------------------------------------- %% Setups @@ -33,11 +34,18 @@ all() -> emqx_common_test_helpers:all(?MODULE). init_per_suite(Config) -> - emqx_mgmt_api_test_util:init_suite(), - Config. + Apps = emqx_cth_suite:start( + [ + emqx, + emqx_management, + emqx_mgmt_api_test_util:emqx_dashboard() + ], + #{work_dir => emqx_cth_suite:work_dir(Config)} + ), + [{apps, Apps} | Config]. -end_per_suite(_) -> - emqx_mgmt_api_test_util:end_suite(). +end_per_suite(Config) -> + ok = emqx_cth_suite:stop(?config(apps, Config)). t_http_test(_Config) -> emqx_trace:clear(), diff --git a/apps/emqx_plugins/include/emqx_plugins.hrl b/apps/emqx_plugins/include/emqx_plugins.hrl index 66f23d4b0..3c7621ca7 100644 --- a/apps/emqx_plugins/include/emqx_plugins.hrl +++ b/apps/emqx_plugins/include/emqx_plugins.hrl @@ -25,6 +25,7 @@ -define(CONFIG_FORMAT_MAP, config_format_map). -define(plugin_conf_not_found, plugin_conf_not_found). +-define(plugin_without_config_schema, plugin_without_config_schema). -type schema_name() :: binary(). -type avsc_path() :: string(). diff --git a/apps/emqx_plugins/src/emqx_plugins.erl b/apps/emqx_plugins/src/emqx_plugins.erl index ae97e7f5f..961855e17 100644 --- a/apps/emqx_plugins/src/emqx_plugins.erl +++ b/apps/emqx_plugins/src/emqx_plugins.erl @@ -161,7 +161,9 @@ ensure_installed(NameVsn) -> ok = purge(NameVsn), case ensure_exists_and_installed(NameVsn) of ok -> - maybe_post_op_after_installed(NameVsn); + maybe_post_op_after_installed(NameVsn), + _ = maybe_ensure_plugin_config(NameVsn), + ok; {error, _Reason} = Err -> Err end @@ -328,10 +330,11 @@ get_config_bin(NameVsn) -> %% @doc Update plugin's config. %% RPC call from Management API or CLI. -%% the plugin config Json Map and plugin config ALWAYS be valid before calling this function. -put_config(NameVsn, ConfigJsonMap, DecodedPluginConfig) when not is_binary(NameVsn) -> - put_config(bin(NameVsn), ConfigJsonMap, DecodedPluginConfig); -put_config(NameVsn, ConfigJsonMap, _DecodedPluginConfig) -> +%% The plugin config Json Map was valid by avro schema +%% Or: if no and plugin config ALWAYS be valid before calling this function. +put_config(NameVsn, ConfigJsonMap, AvroValue) when not is_binary(NameVsn) -> + put_config(bin(NameVsn), ConfigJsonMap, AvroValue); +put_config(NameVsn, ConfigJsonMap, _AvroValue) -> HoconBin = hocon_pp:do(ConfigJsonMap, #{}), ok = backup_and_write_hocon_bin(NameVsn, HoconBin), %% TODO: callback in plugin's on_config_changed (config update by mgmt API) @@ -369,10 +372,30 @@ list() -> %%-------------------------------------------------------------------- %% Package utils --spec decode_plugin_config_map(name_vsn(), map() | binary()) -> {ok, map()} | {error, any()}. -decode_plugin_config_map(NameVsn, AvroJsonMap) when is_map(AvroJsonMap) -> - decode_plugin_config_map(NameVsn, emqx_utils_json:encode(AvroJsonMap)); -decode_plugin_config_map(NameVsn, AvroJsonBin) -> +-spec decode_plugin_config_map(name_vsn(), map() | binary()) -> + {ok, map() | ?plugin_without_config_schema} + | {error, any()}. +decode_plugin_config_map(NameVsn, AvroJsonMap) -> + case with_plugin_avsc(NameVsn) of + true -> + case emqx_plugins_serde:lookup_serde(NameVsn) of + {error, not_found} -> + Reason = "plugin_config_schema_serde_not_found", + ?SLOG(error, #{ + msg => Reason, name_vsn => NameVsn, plugin_with_avro_schema => true + }), + {error, Reason}; + {ok, _Serde} -> + do_decode_plugin_config_map(NameVsn, AvroJsonMap) + end; + false -> + ?SLOG(debug, #{name_vsn => NameVsn, plugin_with_avro_schema => false}), + {ok, ?plugin_without_config_schema} + end. + +do_decode_plugin_config_map(NameVsn, AvroJsonMap) when is_map(AvroJsonMap) -> + do_decode_plugin_config_map(NameVsn, emqx_utils_json:encode(AvroJsonMap)); +do_decode_plugin_config_map(NameVsn, AvroJsonBin) -> case emqx_plugins_serde:decode(NameVsn, AvroJsonBin) of {ok, Config} -> {ok, Config}; {error, ReasonMap} -> {error, ReasonMap} @@ -533,6 +556,7 @@ ensure_state(NameVsn, Position, State, ConfLocation) -> fun() -> ensure_configured(Item, Position, ConfLocation) end ); {error, Reason} -> + ?SLOG(error, #{msg => "ensure_plugin_states_failed", reason => Reason}), {error, Reason} end. @@ -1100,9 +1124,31 @@ for_plugins(ActionFun) -> ok end. -maybe_post_op_after_installed(NameVsn) -> +maybe_post_op_after_installed(NameVsn0) -> + NameVsn = wrap_to_list(NameVsn0), _ = maybe_load_config_schema(NameVsn), - _ = ensure_state(NameVsn, no_move, false, global), + ok = maybe_ensure_state(NameVsn). + +maybe_ensure_state(NameVsn) -> + EnsureStateFun = fun(#{name_vsn := NV, enable := Bool}, AccIn) -> + case NV of + NameVsn -> + %% Configured, using existed cluster config + _ = ensure_state(NV, no_move, Bool, global), + AccIn#{ensured => true}; + _ -> + AccIn + end + end, + case lists:foldl(EnsureStateFun, #{ensured => false}, configured()) of + #{ensured := true} -> + ok; + #{ensured := false} -> + ?SLOG(info, #{msg => "plugin_not_configured", name_vsn => NameVsn}), + %% Clean installation, no config, ensure with `Enable = false` + _ = ensure_state(NameVsn, no_move, false, global), + ok + end, ok. maybe_load_config_schema(NameVsn) -> @@ -1114,7 +1160,7 @@ maybe_load_config_schema(NameVsn) -> _ = maybe_create_config_dir(NameVsn). do_load_config_schema(NameVsn, AvscPath) -> - case emqx_plugins_serde:add_schema(NameVsn, AvscPath) of + case emqx_plugins_serde:add_schema(bin(NameVsn), AvscPath) of ok -> ok; {error, already_exists} -> ok; {error, _Reason} -> ok @@ -1144,6 +1190,7 @@ do_create_config_dir(NameVsn) -> end end. +-spec maybe_ensure_plugin_config(name_vsn()) -> ok. maybe_ensure_plugin_config(NameVsn) -> maybe true ?= with_plugin_avsc(NameVsn), @@ -1152,10 +1199,13 @@ maybe_ensure_plugin_config(NameVsn) -> _ -> ok end. +-spec ensure_plugin_config(name_vsn()) -> ok. ensure_plugin_config(NameVsn) -> %% fetch plugin hocon config from cluster Nodes = [N || N <- mria:running_nodes(), N /= node()], ensure_plugin_config(NameVsn, Nodes). + +-spec ensure_plugin_config(name_vsn(), list()) -> ok. ensure_plugin_config(NameVsn, []) -> ?SLOG(debug, #{ msg => "default_plugin_config_used", @@ -1167,7 +1217,9 @@ ensure_plugin_config(NameVsn, Nodes) -> case get_plugin_config_from_any_node(Nodes, NameVsn, []) of {ok, ConfigMap} when is_map(ConfigMap) -> HoconBin = hocon_pp:do(ConfigMap, #{}), - ok = file:write_file(plugin_config_file(NameVsn), HoconBin), + Path = plugin_config_file(NameVsn), + ok = filelib:ensure_dir(Path), + ok = file:write_file(Path, HoconBin), ensure_config_map(NameVsn); _ -> ?SLOG(error, #{msg => "config_not_found_from_cluster", name_vsn => NameVsn}), @@ -1176,6 +1228,7 @@ ensure_plugin_config(NameVsn, Nodes) -> cp_default_config_file(NameVsn) end. +-spec cp_default_config_file(name_vsn()) -> ok. cp_default_config_file(NameVsn) -> %% always copy default hocon file into config dir when can not get config from other nodes Source = default_plugin_config_file(NameVsn), @@ -1184,9 +1237,10 @@ cp_default_config_file(NameVsn) -> true ?= filelib:is_regular(Source), %% destination path not existed (not configured) true ?= (not filelib:is_regular(Destination)), + ok = filelib:ensure_dir(Destination), case file:copy(Source, Destination) of {ok, _} -> - ok; + ensure_config_map(NameVsn); {error, Reason} -> ?SLOG(warning, #{ msg => "failed_to_copy_plugin_default_hocon_config", @@ -1200,19 +1254,32 @@ cp_default_config_file(NameVsn) -> end. ensure_config_map(NameVsn) -> - with_plugin_avsc(NameVsn) andalso - do_ensure_config_map(NameVsn). - -do_ensure_config_map(NameVsn) -> case read_plugin_hocon(NameVsn, #{read_mode => ?JSON_MAP}) of {ok, ConfigJsonMap} -> - {ok, Config} = decode_plugin_config_map(NameVsn, ConfigJsonMap), - put_config(NameVsn, ConfigJsonMap, Config); + case with_plugin_avsc(NameVsn) of + true -> + do_ensure_config_map(NameVsn, ConfigJsonMap); + false -> + put_config(NameVsn, ConfigJsonMap, ?plugin_without_config_schema) + end; _ -> ?SLOG(warning, #{msg => "failed_to_read_plugin_config_hocon", name_vsn => NameVsn}), ok end. +do_ensure_config_map(NameVsn, ConfigJsonMap) -> + case decode_plugin_config_map(NameVsn, ConfigJsonMap) of + {ok, AvroValue} -> + put_config(NameVsn, ConfigJsonMap, AvroValue); + {error, Reason} -> + ?SLOG(error, #{ + msg => "plugin_config_validation_failed", + name_vsn => NameVsn, + reason => Reason + }), + ok + end. + %% @private Backup the current config to a file with a timestamp suffix and %% then save the new config to the config file. backup_and_write_hocon_bin(NameVsn, HoconBin) -> @@ -1301,23 +1368,23 @@ read_file_fun(Path, ErrMsg, #{read_mode := ?JSON_MAP}) -> %% Directorys -spec plugin_dir(name_vsn()) -> string(). plugin_dir(NameVsn) -> - wrap_list_path(filename:join([install_dir(), NameVsn])). + wrap_to_list(filename:join([install_dir(), NameVsn])). -spec plugin_priv_dir(name_vsn()) -> string(). plugin_priv_dir(NameVsn) -> case read_plugin_info(NameVsn, #{fill_readme => false}) of {ok, #{<<"name">> := Name, <<"metadata_vsn">> := Vsn}} -> AppDir = make_name_vsn_string(Name, Vsn), - wrap_list_path(filename:join([plugin_dir(NameVsn), AppDir, "priv"])); + wrap_to_list(filename:join([plugin_dir(NameVsn), AppDir, "priv"])); _ -> - wrap_list_path(filename:join([install_dir(), NameVsn, "priv"])) + wrap_to_list(filename:join([install_dir(), NameVsn, "priv"])) end. -spec plugin_config_dir(name_vsn()) -> string() | {error, Reason :: string()}. plugin_config_dir(NameVsn) -> case parse_name_vsn(NameVsn) of {ok, NameAtom, _Vsn} -> - wrap_list_path(filename:join([emqx:data_dir(), "plugins", atom_to_list(NameAtom)])); + wrap_to_list(filename:join([emqx:data_dir(), "plugins", atom_to_list(NameAtom)])); {error, Reason} -> ?SLOG(warning, #{ msg => "failed_to_generate_plugin_config_dir_for_plugin", @@ -1330,32 +1397,32 @@ plugin_config_dir(NameVsn) -> %% Files -spec pkg_file_path(name_vsn()) -> string(). pkg_file_path(NameVsn) -> - wrap_list_path(filename:join([install_dir(), bin([NameVsn, ".tar.gz"])])). + wrap_to_list(filename:join([install_dir(), bin([NameVsn, ".tar.gz"])])). -spec info_file_path(name_vsn()) -> string(). info_file_path(NameVsn) -> - wrap_list_path(filename:join([plugin_dir(NameVsn), "release.json"])). + wrap_to_list(filename:join([plugin_dir(NameVsn), "release.json"])). -spec avsc_file_path(name_vsn()) -> string(). avsc_file_path(NameVsn) -> - wrap_list_path(filename:join([plugin_priv_dir(NameVsn), "config_schema.avsc"])). + wrap_to_list(filename:join([plugin_priv_dir(NameVsn), "config_schema.avsc"])). -spec plugin_config_file(name_vsn()) -> string(). plugin_config_file(NameVsn) -> - wrap_list_path(filename:join([plugin_config_dir(NameVsn), "config.hocon"])). + wrap_to_list(filename:join([plugin_config_dir(NameVsn), "config.hocon"])). %% should only used when plugin installing -spec default_plugin_config_file(name_vsn()) -> string(). default_plugin_config_file(NameVsn) -> - wrap_list_path(filename:join([plugin_priv_dir(NameVsn), "config.hocon"])). + wrap_to_list(filename:join([plugin_priv_dir(NameVsn), "config.hocon"])). -spec i18n_file_path(name_vsn()) -> string(). i18n_file_path(NameVsn) -> - wrap_list_path(filename:join([plugin_priv_dir(NameVsn), "config_i18n.json"])). + wrap_to_list(filename:join([plugin_priv_dir(NameVsn), "config_i18n.json"])). -spec readme_file(name_vsn()) -> string(). readme_file(NameVsn) -> - wrap_list_path(filename:join([plugin_dir(NameVsn), "README.md"])). + wrap_to_list(filename:join([plugin_dir(NameVsn), "README.md"])). running_apps() -> lists:map( @@ -1387,5 +1454,5 @@ bin(A) when is_atom(A) -> atom_to_binary(A, utf8); bin(L) when is_list(L) -> unicode:characters_to_binary(L, utf8); bin(B) when is_binary(B) -> B. -wrap_list_path(Path) -> +wrap_to_list(Path) -> binary_to_list(iolist_to_binary(Path)). diff --git a/apps/emqx_utils/src/emqx_placeholder.erl b/apps/emqx_utils/src/emqx_placeholder.erl index 409e41aff..84000669d 100644 --- a/apps/emqx_utils/src/emqx_placeholder.erl +++ b/apps/emqx_utils/src/emqx_placeholder.erl @@ -265,11 +265,16 @@ lookup_var(Var, Value) when Var == ?PH_VAR_THIS orelse Var == [] -> Value; lookup_var([Prop | Rest], Data0) -> Data = - case emqx_utils_json:safe_decode(Data0, [return_maps]) of - {ok, Data1} -> - Data1; - {error, _} -> - Data0 + case is_map(Data0) of + true -> + Data0; + false -> + case emqx_utils_json:safe_decode(Data0, [return_maps]) of + {ok, Data1} -> + Data1; + {error, _} -> + Data0 + end end, case lookup(Prop, Data) of {ok, Value} -> @@ -293,12 +298,10 @@ lookup(Prop, Data) when is_binary(Prop) -> end. do_one_lookup(Key, Data) -> - try - {ok, maps:get(Key, Data)} - catch - error:{badkey, _} -> - {error, undefined}; - error:{badmap, _} -> + case Data of + #{Key := Value} -> + {ok, Value}; + _ -> {error, undefined} end. diff --git a/changes/ce/perf-13118.en.md b/changes/ce/perf-13118.en.md new file mode 100644 index 000000000..ef74daedd --- /dev/null +++ b/changes/ce/perf-13118.en.md @@ -0,0 +1 @@ +Improve performance of template rendering in bridges. diff --git a/changes/e5.7.0.en.md b/changes/e5.7.0.en.md new file mode 100644 index 000000000..4a1a7b802 --- /dev/null +++ b/changes/e5.7.0.en.md @@ -0,0 +1,182 @@ +# e5.7.0 + +## Enhancements + +#### MQTT + +Implemented Durable Sessions, which persists MQTT Persistent Sessions and their messages to disk, and continuously replicates session metadata and MQTT messages among multiple nodes in the EMQX cluster. This achieves effective failover and recovery mechanisms, ensuring service continuity and high availability, thereby enhancing system reliability. + +Added metrics related to EMQX durable storage to Prometheus: + +- `emqx_ds_egress_batches` +- `emqx_ds_egress_batches_retry` +- `emqx_ds_egress_batches_failed` +- `emqx_ds_egress_messages` +- `emqx_ds_egress_bytes` +- `emqx_ds_egress_flush_time` +- `emqx_ds_store_batch_time` +- `emqx_ds_builtin_next_time` +- `emqx_ds_storage_bitfield_lts_counter_seek` +- `emqx_ds_storage_bitfield_lts_counter_next` +- `emqx_ds_storage_bitfield_lts_counter_collision` + +Note: these metrics are only visible when session persistence is enabled. +The number of persisted messages has also been added to the Dashboard. + +#### Security + +- [#12947](https://github.com/emqx/emqx/pull/12947) For JWT authentication, support new `disconnect_after_expire` option. When enabled, the client will be disconnected after the JWT token expires. + +Note: This is a breaking change. This option is enabled by default, so the default behavior is changed. Previously, the clients with actual JWTs could connect to the broker and stay connected even after the JWT token expired. Now, the client will be disconnected after the JWT token expires. To preserve the previous behavior, set `disconnect_after_expire` to `false`. + +#### Data Processing and Integration + +- [#12711](https://github.com/emqx/emqx/pull/12711) Added schema validation feature. With this feature, once validations are configured for certain topic filters, the configured checks are run against published messages. If the checking results are not accepted by validation, the message is dropped and the client may be disconnected, depending on the configuration. + +- [#12899](https://github.com/emqx/emqx/pull/12899) For RocketMQ data integration, added support for namespace and key dispatch strategy. + +- [#12671](https://github.com/emqx/emqx/pull/12671) An `unescape` function has been added to the rule engine SQL language to handle the expansion of escape sequences in strings. This addition has been done because string literals in the SQL language don't support any escape codes (e.g., `\n` and `\t`). This enhancement allows for more flexible string manipulation within SQL expressions. + +- [#12898](https://github.com/emqx/emqx/pull/12898) IoTDB bridge support for iotdb 1.3.0 and batch insert(batch_size/batch_time) options. + +- [#12934](https://github.com/emqx/emqx/pull/12934) Added CSV format file aggregation for AWS S3 action. + +#### Observability + +- [#12827](https://github.com/emqx/emqx/pull/12827) It is now possible to trace rules with a new Rule ID trace filter as well as with the Client ID filter. For testing purposes, it is now also possible to use a new HTTP API endpoint (rules/:id/test) to artificially apply a rule and optionally stop its actions after they have been rendered. +- [#12863](https://github.com/emqx/emqx/pull/12863) You can now format trace log entries as JSON objects by setting the formatter parameter to "json" when creating the trace pattern. + +#### Extensibility + +- [#12872](https://github.com/emqx/emqx/pull/12872) Implemented Client Attributes feature. It allows setting additional properties for each client using key-value pairs. Property values can be generated from MQTT client connection information (such as username, client ID, TLS certificate) or set from data accompanying successful authentication returns. Properties can be used in EMQX for authentication, authorization, data integration, and MQTT extension functions. Compared to using static properties like client ID directly, client properties offer greater flexibility in various business scenarios, simplifying the development process and enhancing adaptability and efficiency in development work. + + **Initialization of `client_attrs`** + + The `client_attrs` fields can be initially populated from one of the following `clientinfo` fields: + + - `cn`: The common name from the TLS client's certificate. + - `dn`: The distinguished name from the TLS client's certificate, that is, the certificate "Subject". + - `clientid`: The MQTT client ID provided by the client. + - `username`: The username provided by the client. + - `user_property`: Extract a property value from 'User-Property' of the MQTT CONNECT packet. + + **Extension through Authentication Responses** + + Additional attributes may be merged into `client_attrs` from authentication responses. Supported + authentication backends include: + + - **HTTP**: Attributes can be included in the JSON object of the HTTP response body through a + `client_attrs` field. + + - **JWT**: Attributes can be included via a `client_attrs` claim within the JWT. + + **Usage in Authentication and Authorization** + + If `client_attrs` is initialized before authentication, it can be used in external authentication + requests. For instance, `${client_attrs.property1}` can be used within request templates + directed at an HTTP server for authenticity validation. + + - The `client_attrs` can be utilized in authorization configurations or request templates, enhancing + flexibility and control. Examples include: In `acl.conf`, use `{allow, all, all, ["${client_attrs.namespace}/#"]}` to apply permissions based on the `namespace` attribute. + + - In other authorization backends, `${client_attrs.namespace}` can be used within request templates to dynamically include client attributes. + +- [#12910](https://github.com/emqx/emqx/pull/12910) Added plugin configuration management and schema validation. It is also possible to annotate the schema with metadata to facilitate UI rendering in the Dashboard. See more details in the [plugin template](https://github.com/emqx/emqx-plugin-template/pull/126) and [plugin documentation](../extensions/plugins.md). + +#### Operations and Management + +- [#12923](https://github.com/emqx/emqx/pull/12923) Provided more specific error when importing wrong format into builtin authenticate database. + +- [#12940](https://github.com/emqx/emqx/pull/12940) Added `ignore_readonly` argument to `PUT /configs` API. + + Before this change, EMQX would return 400 (BAD_REQUEST) if the raw config included read-only root keys (`cluster`, `rpc`, and `node`). + + After this enhancement it can be called as `PUT /configs?ignore_readonly=true`, EMQX will in this case ignore readonly root config keys, and apply the rest. For observability purposes, an info level message is logged if any readonly keys are dropped. + + Also fixed an exception when config has bad HOCON syntax (returns 500). Now bad syntax will cause the API to return 400 (BAD_REQUEST). + +- [#12957](https://github.com/emqx/emqx/pull/12957) Started building packages for macOS 14 (Apple Silicon) and Ubuntu 24.04 Noble Numbat (LTS). + +## Bug Fixes + +#### Security + +- [#12887](https://github.com/emqx/emqx/pull/12887) Fixed MQTT enhanced auth with sasl scram. + +- [#12962](https://github.com/emqx/emqx/pull/12962) TLS clients can now verify server hostname against wildcard certificate. For example, if a certificate is issued for host `*.example.com`, TLS clients is able to verify server hostnames like `srv1.example.com`. + +#### MQTT + +- [#12996](https://github.com/emqx/emqx/pull/12996) Fixed process leak in `emqx_retainer` application. Previously, client disconnection while receiving retained messages could cause a process leak. + +#### Data Processing and Integration + +- [#12653](https://github.com/emqx/emqx/pull/12653) The rule engine function `bin2hexstr` now supports bitstring inputs with a bit size that is not divisible by 8. Such bitstrings can be returned by the rule engine function `subbits`. + +- [#12657](https://github.com/emqx/emqx/pull/12657) The rule engine SQL-based language previously did not allow putting any expressions as array elements in array literals (only constants and variable references were allowed). This has now been fixed so that one can use any expressions as array elements. + + The following is now permitted, for example: + + ```bash + select + [21 + 21, abs(-abs(-2)), [1 + 1], 4] as my_array + from "t/#" + ``` + +- [#12932](https://github.com/emqx/emqx/pull/12932) Previously, if a HTTP action request received a 503 (Service Unavailable) status, it was marked as a failure and the request was not retried. This has now been fixed so that the request is retried a configurable number of times. + +- [#12948](https://github.com/emqx/emqx/pull/12948) Fixed an issue where sensitive HTTP header values like `Authorization` would be substituted by `******` after updating a connector. + +- [#12895](https://github.com/emqx/emqx/pull/12895) Added some missing config keys for the DynamoDB connector and the action. + +- [#13018](https://github.com/emqx/emqx/pull/13018) Reduced log spamming when connection goes down in a Postgres/Timescale/Matrix connector. + +- [#13118](https://github.com/emqx/emqx/pull/13118) Fix a performance issue in the rule engine template rendering. + +#### Observability + +- [#12765](https://github.com/emqx/emqx/pull/12765) Make sure stats `subscribers.count` `subscribers.max` contains shared-subscribers. It only contains non-shared subscribers previously. + +#### Operations and Management + +- [#12812](https://github.com/emqx/emqx/pull/12812) Made resource health checks non-blocking operations. This means that operations such as updating or removing a resource won't be blocked by a lengthy running health check. + +- [#12830](https://github.com/emqx/emqx/pull/12830) Made channel (action/source) health checks non-blocking operations. This means that operations such as updating or removing an action/source data integration won't be blocked by a lengthy running health check. + +- [#12993](https://github.com/emqx/emqx/pull/12993) Fixed listener config update API when handling an unknown zone. + + Before this fix, when a listener config is updated with an unknown zone, for example `{"zone": "unknown"}`, the change would be accepted, causing all clients to crash when connected. + After this fix, updating the listener with an unknown zone name will get a "Bad request" response. + +- [#13012](https://github.com/emqx/emqx/pull/13012) The MQTT listerners config option `access_rules` has been improved in the following ways: + + * The listener no longer crash with an incomprehensible error message if a non-valid access rule is configured. Instead a configuration error is generated. + * One can now add several rules in a single string by separating them by comma (for example, "allow 10.0.1.0/24, deny all"). + +- [#13041](https://github.com/emqx/emqx/pull/13041) Improved HTTP authentication error log message. If HTTP content-type header is missing for POST method, it now emits a meaningful error message instead of a less readable exception with stack trace. + +- [#13077](https://github.com/emqx/emqx/pull/13077) This fix makes EMQX only read action configurations from the global configuration when the connector starts or restarts, and instead stores the latest configurations for the actions in the connector. Previously, updates to action configurations would sometimes not take effect without disabling and enabling the action. This means that an action could sometimes run with the old (previous) configuration even though it would look like the action configuration has been updated successfully. + +- [#13090](https://github.com/emqx/emqx/pull/13090) Attempting to start an action or source whose connector is disabled will no longer attempt to start the connector itself. + +- [#12871](https://github.com/emqx/emqx/pull/12871) Fixed startup process of evacuated node. Previously, if a node was evacuated and stoped without stopping evacuation, it would not start back. + +- [#12888](https://github.com/emqx/emqx/pull/12888) Fixed License related configuration loss after importing backup data. + +#### Gateways + +- [#12909](https://github.com/emqx/emqx/pull/12909) Fixed UDP listener process handling on errors or closure, The fix ensures the UDP listener is cleanly stopped and restarted as needed if these error conditions occur. + +- [#13001](https://github.com/emqx/emqx/pull/13001) Fixed an issue where the syskeeper forwarder would never reconnect when the connection was lost. + +- [#13010](https://github.com/emqx/emqx/pull/13010) Fixed the issue where the JT/T 808 gateway could not correctly reply to the REGISTER_ACK message when requesting authentication from the registration service failed. + +## Breaking Changes + +- [#12947](https://github.com/emqx/emqx/pull/12947) For JWT authentication, a new boolean option `disconnect_after_expire` has been added with default value set to `true`. When enabled, the client will be disconnected after the JWT token expires. + + Previously, the clients with actual JWTs could connect to the broker and stay connected even after the JWT token expired. Now, the client will be disconnected after the JWT token expires. To preserve the previous behavior, set `disconnect_after_expire` to `false`. + +- [#12957](https://github.com/emqx/emqx/pull/12957) Stopped building packages for macOS 12. + +- [#12895](https://github.com/emqx/emqx/pull/12895) Complemented some necessary but missed keys for the DynamoDB connector and the action. The old configuration is obsolete, as it didn't function properly before this fix. Specifically, for the DynamoDB connector, the addition of a new key, `region`, is required. Additionally, `hash_key` and `range_key` are now supported in the DynamoDB action, with `hash_key` being mandatory. diff --git a/changes/v5.7.0.en.md b/changes/v5.7.0.en.md new file mode 100644 index 000000000..9fc209dc5 --- /dev/null +++ b/changes/v5.7.0.en.md @@ -0,0 +1,145 @@ +# v5.7.0 + +## Enhancements + +#### MQTT +Implemented Durable Sessions, which persists MQTT Persistent Sessions and their messages to disk, and continuously replicates session metadata and MQTT messages among multiple nodes in the EMQX cluster. This achieves effective failover and recovery mechanisms, ensuring service continuity and high availability, thereby enhancing system reliability. +Added metrics related to EMQX durable storage to Prometheus: + +- `emqx_ds_egress_batches` +- `emqx_ds_egress_batches_retry` +- `emqx_ds_egress_batches_failed` +- `emqx_ds_egress_messages` +- `emqx_ds_egress_bytes` +- `emqx_ds_egress_flush_time` +- `emqx_ds_store_batch_time` +- `emqx_ds_builtin_next_time` +- `emqx_ds_storage_bitfield_lts_counter_seek` +- `emqx_ds_storage_bitfield_lts_counter_next` +- `emqx_ds_storage_bitfield_lts_counter_collision` + +Note: these metrics are only visible when session persistence is enabled. +The number of persisted messages has also been added to the Dashboard. + +#### Security + +- [#12947](https://github.com/emqx/emqx/pull/12947) For JWT authentication, support new `disconnect_after_expire` option. When enabled, the client will be disconnected after the JWT token expires. + + +Note: This is a breaking change. This option is enabled by default, so the default behavior is changed. Previously, the clients with actual JWTs could connect to the broker and stay connected even after the JWT token expired. Now, the client will be disconnected after the JWT token expires. To preserve the previous behavior, set `disconnect_after_expire` to `false`. + +#### Data Processing and Integration + +- [#12671](https://github.com/emqx/emqx/pull/12671) An `unescape` function has been added to the rule engine SQL language to handle the expansion of escape sequences in strings. This addition has been done because string literals in the SQL language don't support any escape codes (e.g., `\n` and `\t`). This enhancement allows for more flexible string manipulation within SQL expressions. + + +#### Extensibility + +- [#12872](https://github.com/emqx/emqx/pull/12872) Implemented Client Attributes feature. It allows setting additional properties for each client using key-value pairs. Property values can be generated from MQTT client connection information (such as username, client ID, TLS certificate) or set from data accompanying successful authentication returns. Properties can be used in EMQX for authentication, authorization, data integration, and MQTT extension functions. Compared to using static properties like client ID directly, client properties offer greater flexibility in various business scenarios, simplifying the development process and enhancing adaptability and efficiency in development work. + **Initialization of `client_attrs`** + The `client_attrs` fields can be initially populated from one of the following `clientinfo` fields: + - `cn`: The common name from the TLS client's certificate. + - `dn`: The distinguished name from the TLS client's certificate, that is, the certificate "Subject". + - `clientid`: The MQTT client ID provided by the client. + - `username`: The username provided by the client. + - `user_property`: Extract a property value from 'User-Property' of the MQTT CONNECT packet. + + **Extension through Authentication Responses** + Additional attributes may be merged into `client_attrs` from authentication responses. Supported + authentication backends include: + - **HTTP**: Attributes can be included in the JSON object of the HTTP response body through a + `client_attrs` field. + - **JWT**: Attributes can be included via a `client_attrs` claim within the JWT. + + **Usage in Authentication and Authorization** + If `client_attrs` is initialized before authentication, it can be used in external authentication + requests. For instance, `${client_attrs.property1}` can be used within request templates + directed at an HTTP server for authenticity validation. + - The `client_attrs` can be utilized in authorization configurations or request templates, enhancing + flexibility and control. Examples include: In `acl.conf`, use `{allow, all, all, ["${client_attrs.namespace}/#"]}` to apply permissions based on the `namespace` attribute. + - In other authorization backends, `${client_attrs.namespace}` can be used within request templates to dynamically include client attributes. + +- [#12910](https://github.com/emqx/emqx/pull/12910) Added plugin configuration management and schema validation. For EMQX enterprise edition, one can also annotate the schema with metadata to facilitate UI rendering in the Dashboard. See more details in the [plugin template](https://github.com/emqx/emqx-plugin-template/pull/126) and plugin [documentation](../extensions/plugins.md). + +#### Operations and Management + +- [#12923](https://github.com/emqx/emqx/pull/12923) Provided more specific error when importing wrong format into builtin authenticate database. + +- [#12940](https://github.com/emqx/emqx/pull/12940) Added `ignore_readonly` argument to `PUT /configs` API. + Before this change, EMQX would return 400 (BAD_REQUEST) if the raw config included read-only root keys (`cluster`, `rpc`, and `node`). + After this enhancement it can be called as `PUT /configs?ignore_readonly=true`, EMQX will in this case ignore readonly root config keys, and apply the rest. For observability purposes, an info level message is logged if any readonly keys are dropped. + Also fixed an exception when config has bad HOCON syntax (returns 500). Now bad syntax will cause the API to return 400 (BAD_REQUEST). + +- [#12957](https://github.com/emqx/emqx/pull/12957) Started building packages for macOS 14 (Apple Silicon) and Ubuntu 24.04 Noble Numbat (LTS). + +## Bug Fixes + +#### Security + +- [#12887](https://github.com/emqx/emqx/pull/12887) Fixed MQTT enhanced auth with sasl scram. + +- [#12962](https://github.com/emqx/emqx/pull/12962) TLS clients can now verify server hostname against wildcard certificate. For example, if a certificate is issued for host `*.example.com`, TLS clients is able to verify server hostnames like `srv1.example.com`. + +#### MQTT + +- [#12996](https://github.com/emqx/emqx/pull/12996) Fixed process leak in `emqx_retainer` application. Previously, client disconnection while receiving retained messages could cause a process leak. + + +#### Data Processing and Integration + +- [#12653](https://github.com/emqx/emqx/pull/12653) The rule engine function `bin2hexstr` now supports bitstring inputs with a bit size that is not divisible by 8. Such bitstrings can be returned by the rule engine function `subbits`. + +- [#12657](https://github.com/emqx/emqx/pull/12657) The rule engine SQL-based language previously did not allow putting any expressions as array elements in array literals (only constants and variable references were allowed). This has now been fixed so that one can use any expressions as array elements. + The following is now permitted, for example: + ```bash + select + [21 + 21, abs(-abs(-2)), [1 + 1], 4] as my_array + from "t/#" + ``` + +- [#12932](https://github.com/emqx/emqx/pull/12932) Previously, if a HTTP action request received a 503 (Service Unavailable) status, it was marked as a failure and the request was not retried. This has now been fixed so that the request is retried a configurable number of times. + +- [#12948](https://github.com/emqx/emqx/pull/12948) Fixed an issue where sensitive HTTP header values like `Authorization` would be substituted by `******` after updating a connector. + +- [#13118](https://github.com/emqx/emqx/pull/13118) Fix a performance issue in the rule engine template rendering. + +#### Observability + +- [#12765](https://github.com/emqx/emqx/pull/12765) Make sure stats `subscribers.count` `subscribers.max` contains shared-subscribers. It only contains non-shared subscribers previously. + + +#### Operations and Management + +- [#12812](https://github.com/emqx/emqx/pull/12812) Made resource health checks non-blocking operations. This means that operations such as updating or removing a resource won't be blocked by a lengthy running health check. + +- [#12830](https://github.com/emqx/emqx/pull/12830) Made channel (action/source) health checks non-blocking operations. This means that operations such as updating or removing an action/source data integration won't be blocked by a lengthy running health check. + +- [#12993](https://github.com/emqx/emqx/pull/12993) Fixed listener config update API when handling an unknown zone. + Before this fix, when a listener config is updated with an unknown zone, for example `{"zone": "unknown"}`, the change would be accepted, causing all clients to crash whens connected. + After this fix, updating the listener with an unknown zone name will get a "Bad request" response. + +- [#13012](https://github.com/emqx/emqx/pull/13012) The MQTT listerners config option `access_rules` has been improved in the following ways: + * The listener no longer crash with an incomprehensible error message if a non-valid access rule is configured. Instead a configuration error is generated. + * One can now add several rules in a single string by separating them by comma (for example, "allow 10.0.1.0/24, deny all"). + +- [#13041](https://github.com/emqx/emqx/pull/13041) Improved HTTP authentication error log message. If HTTP content-type header is missing for POST method, it now emits a meaningful error message instead of a less readable exception with stack trace. + +- [#13077](https://github.com/emqx/emqx/pull/13077) This fix makes EMQX only read action configurations from the global configuration when the connector starts or restarts, and instead stores the latest configurations for the actions in the connector. Previously, updates to action configurations would sometimes not take effect without disabling and enabling the action. This means that an action could sometimes run with the old (previous) configuration even though it would look like the action configuration has been updated successfully. + +- [#13090](https://github.com/emqx/emqx/pull/13090) Attempting to start an action or source whose connector is disabled will no longer attempt to start the connector itself. + +#### Gateways + +- [#12909](https://github.com/emqx/emqx/pull/12909) Fixed UDP listener process handling on errors or closure, The fix ensures the UDP listener is cleanly stopped and restarted as needed if these error conditions occur. + +- [#13001](https://github.com/emqx/emqx/pull/13001) Fixed an issue where the syskeeper forwarder would never reconnect when the connection was lost. + +- [#13010](https://github.com/emqx/emqx/pull/13010) Fixed the issue where the JT/T 808 gateway could not correctly reply to the REGISTER_ACK message when requesting authentication from the registration service failed. + +## Breaking Changes + +- [#12947](https://github.com/emqx/emqx/pull/12947) For JWT authentication, a new boolean option `disconnect_after_expire` has been added with default value set to `true`. When enabled, the client will be disconnected after the JWT token expires. + + Previously, the clients with actual JWTs could connect to the broker and stay connected even after the JWT token expired. Now, the client will be disconnected after the JWT token expires. To preserve the previous behavior, set `disconnect_after_expire` to `false`. + +- [#12957](https://github.com/emqx/emqx/pull/12957) Stopped building packages for macOS 12. diff --git a/deploy/charts/emqx-enterprise/Chart.yaml b/deploy/charts/emqx-enterprise/Chart.yaml index 2f363bdfc..a2327ebc5 100644 --- a/deploy/charts/emqx-enterprise/Chart.yaml +++ b/deploy/charts/emqx-enterprise/Chart.yaml @@ -14,8 +14,8 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. -version: 5.7.0-alpha.1 +version: 5.7.0 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. -appVersion: 5.7.0-alpha.1 +appVersion: 5.7.0 diff --git a/deploy/charts/emqx/Chart.yaml b/deploy/charts/emqx/Chart.yaml index e4c15c7f7..80e7d3c0a 100644 --- a/deploy/charts/emqx/Chart.yaml +++ b/deploy/charts/emqx/Chart.yaml @@ -14,8 +14,8 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. -version: 5.6.1 +version: 5.7.0 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. -appVersion: 5.6.1 +appVersion: 5.7.0 diff --git a/scripts/ui-tests/dashboard_test.py b/scripts/ui-tests/dashboard_test.py index 7003802ab..602d944fd 100644 --- a/scripts/ui-tests/dashboard_test.py +++ b/scripts/ui-tests/dashboard_test.py @@ -2,6 +2,7 @@ import os import time import unittest import pytest +import requests from urllib.parse import urljoin from selenium import webdriver from selenium.webdriver.common.by import By @@ -77,6 +78,23 @@ def test_log(driver, login, dashboard_url): label = driver.find_element(By.XPATH, "//div[@id='app']//form//label[contains(., 'Time Offset')]") assert driver.find_elements(By.ID, label.get_attribute("for")) +def fetch_version_info(dashboard_url): + status_url = urljoin(dashboard_url, "/status?format=json") + response = requests.get(status_url) + response.raise_for_status() + return response.json() + +def parse_version(version_str): + prefix_major, minor, _ = version_str.split('.', 2) + prefix = prefix_major[:1] + major = prefix_major[1:] + return prefix, major + '.' + minor + +def fetch_version(url): + info = fetch_version_info(url) + version_str = info['rel_vsn'] + return parse_version(version_str) + def test_docs_link(driver, login, dashboard_url): dest_url = urljoin(dashboard_url, "/#/dashboard/overview") driver.get(dest_url) @@ -85,21 +103,19 @@ def test_docs_link(driver, login, dashboard_url): link_help = driver.find_element(By.XPATH, xpath_link_help) driver.execute_script("arguments[0].click();", link_help) - emqx_name = os.getenv("EMQX_NAME") - emqx_community_version = os.getenv("EMQX_COMMUNITY_VERSION") - emqx_enterprise_version = os.getenv("EMQX_ENTERPRISE_VERSION") - if emqx_name == 'emqx-enterprise': - emqx_version = f"v{emqx_enterprise_version}" + prefix, emqx_version = fetch_version(dashboard_url) + # it's v5.x in the url + emqx_version = 'v' + emqx_version + + if prefix == 'e': docs_base_url = "https://docs.emqx.com/en/enterprise" else: - emqx_version = f"v{emqx_community_version}" docs_base_url = "https://www.emqx.io/docs/en" - emqx_version = ".".join(emqx_version.split(".")[:2]) docs_url = f"{docs_base_url}/{emqx_version}" xpath = f"//div[@id='app']//div[@class='nav-header']//a[@href[starts-with(.,'{docs_url}')]]" try: driver.find_element(By.XPATH, xpath) except NoSuchElementException: - raise AssertionError(f"Cannot find the doc URL for {emqx_name} version {emqx_version}, please make sure the dashboard package is up to date.") + raise AssertionError(f"Cannot find the doc URL for version {emqx_version}, please make sure the dashboard package is up to date.") diff --git a/scripts/ui-tests/docker-compose.yaml b/scripts/ui-tests/docker-compose.yaml index c4a92e51f..f5a66ab33 100644 --- a/scripts/ui-tests/docker-compose.yaml +++ b/scripts/ui-tests/docker-compose.yaml @@ -9,10 +9,6 @@ services: selenium: shm_size: '2gb' image: ghcr.io/emqx/selenium-chrome:latest - environment: - EMQX_NAME: ${EMQX_NAME} - EMQX_COMMUNITY_VERSION: ${EMQX_VERSION} - EMQX_ENTERPRISE_VERSION: ${EMQX_ENTERPRISE_VERSION} volumes: - ./:/app depends_on: