From abe2a9cb45537befb4255497c1d21aec98b5b7b6 Mon Sep 17 00:00:00 2001 From: firest Date: Fri, 24 Jun 2022 14:45:15 +0800 Subject: [PATCH 1/2] feat(exhook): expose tcp some options for grpc client --- apps/emqx_exhook/etc/emqx_exhook.conf | 17 ++++++++++ apps/emqx_exhook/priv/emqx_exhook.schema | 37 +++++++++++++++++++-- apps/emqx_exhook/src/emqx_exhook_server.erl | 7 ++-- apps/emqx_exhook/test/emqx_exhook_SUITE.erl | 3 +- 4 files changed, 59 insertions(+), 5 deletions(-) diff --git a/apps/emqx_exhook/etc/emqx_exhook.conf b/apps/emqx_exhook/etc/emqx_exhook.conf index 6a4725e02..40b07caf5 100644 --- a/apps/emqx_exhook/etc/emqx_exhook.conf +++ b/apps/emqx_exhook/etc/emqx_exhook.conf @@ -47,3 +47,20 @@ exhook.server.default.url = http://127.0.0.1:9000 #exhook.server.default.ssl.cacertfile = {{ platform_etc_dir }}/certs/cacert.pem #exhook.server.default.ssl.certfile = {{ platform_etc_dir }}/certs/cert.pem #exhook.server.default.ssl.keyfile = {{ platform_etc_dir }}/certs/key.pem + +## Enables/disables periodic transmission on a connected socket when no other data is exchanged. +## If the other end does not respond, the connection is considered broken and an error message is sent to the controlling process. +## +## Default: true +#exhook.server.default.socket_options.keepalive = true + +## If true, option TCP_NODELAY is turned on for the socket, which means that also small amounts of data are sent immediately. +## +## Default: true +#exhook.server.default.socket_options.nodelay = true + +## The minimum size of the receive buffer to use for the socket. +#exhook.server.default.socket_options.recbuf = 64KB + +## The minimum size of the send buffer to use for the socket. +#exhook.server.default.socket_options.sndbuf = 16KB \ No newline at end of file diff --git a/apps/emqx_exhook/priv/emqx_exhook.schema b/apps/emqx_exhook/priv/emqx_exhook.schema index 4f6419c6a..b18bad70a 100644 --- a/apps/emqx_exhook/priv/emqx_exhook.schema +++ b/apps/emqx_exhook/priv/emqx_exhook.schema @@ -47,12 +47,42 @@ end}. {datatype, string} ]}. +{mapping, "exhook.server.$name.socket_options.keepalive", "emqx_exhook.servers", [ + {default, true}, + {datatype, {enum, [true, false]}} +]}. + +{mapping, "exhook.server.$name.socket_options.nodelay", "emqx_exhook.servers", [ + {default, true}, + {datatype, {enum, [true, false]}} +]}. + +{mapping, "exhook.server.$name.socket_options.recbuf", "emqx_exhook.servers", [ + {datatype, bytesize} +]}. + +{mapping, "exhook.server.$name.socket_options.sndbuf", "emqx_exhook.servers", [ + {datatype, bytesize} +]}. + {translation, "emqx_exhook.servers", fun(Conf) -> Filter = fun(Opts) -> [{K, V} || {K, V} <- Opts, V =/= undefined] end, + + MkSockOpts = fun(Prefix, Conf) -> + {socket_options, + Filter([{Opt, + cuttlefish:conf_get(Prefix ++ ".socket_options." ++ atom_to_list(Opt), + Conf, + undefined)} + || Opt <- [keepalive, nodelay, recbuf, sndbuf]])} + end, + ServerOptions = fun(Prefix) -> case http_uri:parse(cuttlefish:conf_get(Prefix ++ ".url", Conf)) of {ok, {http, _, Host, Port, _, _}} -> - [{scheme, http}, {host, Host}, {port, Port}]; + [{scheme, http}, {host, Host}, {port, Port}, + MkSockOpts(Prefix, Conf) + ]; {ok, {https, _, Host, Port, _, _}} -> [{scheme, https}, {host, Host}, {port, Port}, {ssl_options, @@ -60,10 +90,13 @@ end}. {certfile, cuttlefish:conf_get(Prefix ++ ".ssl.certfile", Conf, undefined)}, {keyfile, cuttlefish:conf_get(Prefix ++ ".ssl.keyfile", Conf, undefined)}, {cacertfile, cuttlefish:conf_get(Prefix ++ ".ssl.cacertfile", Conf, undefined)} - ])}]; + ])}, + MkSockOpts(Prefix, Conf) + ]; _ -> error(invalid_server_options) end end, + [{list_to_atom(Name), ServerOptions("exhook.server." ++ Name)} || {["exhook", "server", Name, "url"], _} <- cuttlefish_variable:filter_by_prefix("exhook.server", Conf)] end}. diff --git a/apps/emqx_exhook/src/emqx_exhook_server.erl b/apps/emqx_exhook/src/emqx_exhook_server.erl index 9caa166ea..e767cd84b 100644 --- a/apps/emqx_exhook/src/emqx_exhook_server.erl +++ b/apps/emqx_exhook/src/emqx_exhook_server.erl @@ -124,13 +124,16 @@ channel_opts(Opts) -> Host = proplists:get_value(host, Opts), Port = proplists:get_value(port, Opts), SvrAddr = format_http_uri(Scheme, Host, Port), + SockOpts = proplists:get_value(socket_options, Opts), ClientOpts = case Scheme of https -> SslOpts = lists:keydelete(ssl, 1, proplists:get_value(ssl_options, Opts, [])), #{gun_opts => #{transport => ssl, - transport_opts => SslOpts}}; - _ -> #{} + transport_opts => SockOpts ++ SslOpts}}; + _ -> + #{gun_opts => + #{transport_opts => SockOpts}} end, {SvrAddr, ClientOpts}. diff --git a/apps/emqx_exhook/test/emqx_exhook_SUITE.erl b/apps/emqx_exhook/test/emqx_exhook_SUITE.erl index daa2e25b3..a8bd34b5d 100644 --- a/apps/emqx_exhook/test/emqx_exhook_SUITE.erl +++ b/apps/emqx_exhook/test/emqx_exhook_SUITE.erl @@ -46,7 +46,8 @@ set_special_cfgs(emqx) -> application:set_env(emqx, allow_anonymous, false), application:set_env(emqx, enable_acl_cache, false), application:set_env(emqx, plugins_loaded_file, undefined), - application:set_env(emqx, modules_loaded_file, undefined); + application:set_env(emqx, modules_loaded_file, undefined), + application:set_env(ekka, cluster_name, ?OTHER_CLUSTER_NAME_ATOM); set_special_cfgs(emqx_exhook) -> ok. From 9ad1e5c08ec09f256334e4ac48cbdf85d8a06b46 Mon Sep 17 00:00:00 2001 From: firest Date: Fri, 24 Jun 2022 17:52:29 +0800 Subject: [PATCH 2/2] chore(exhook): bump version && update appup --- apps/emqx_exhook/src/emqx_exhook.app.src | 2 +- apps/emqx_exhook/src/emqx_exhook.appup.src | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/apps/emqx_exhook/src/emqx_exhook.app.src b/apps/emqx_exhook/src/emqx_exhook.app.src index 6075d50db..cf39d9e42 100644 --- a/apps/emqx_exhook/src/emqx_exhook.app.src +++ b/apps/emqx_exhook/src/emqx_exhook.app.src @@ -1,7 +1,7 @@ %% -*- mode: erlang -*- {application, emqx_exhook, [{description, "EMQ X Extension for Hook"}, - {vsn, "4.3.5"}, + {vsn, "4.3.6"}, {modules, []}, {registered, []}, {mod, {emqx_exhook_app, []}}, diff --git a/apps/emqx_exhook/src/emqx_exhook.appup.src b/apps/emqx_exhook/src/emqx_exhook.appup.src index 8245576ec..d3b73d98a 100644 --- a/apps/emqx_exhook/src/emqx_exhook.appup.src +++ b/apps/emqx_exhook/src/emqx_exhook.appup.src @@ -1,6 +1,8 @@ %% -*- mode: erlang -*- {VSN, - [ + [ {"4.3.5", [ + {load_module, emqx_exhook_server, brutal_purge, soft_purge, []} + ]}, {"4.3.4", [ {load_module, emqx_exhook_sup, brutal_purge, soft_purge, []}, {load_module, emqx_exhook_server, brutal_purge, soft_purge, []}, @@ -14,7 +16,9 @@ ]}, {<<".*">>, []} ], - [ + [ {"4.3.5", [ + {load_module, emqx_exhook_server, brutal_purge, soft_purge, []} + ]}, {"4.3.4", [ {load_module, emqx_exhook_sup, brutal_purge, soft_purge, []}, {load_module, emqx_exhook_server, brutal_purge, soft_purge, []},