diff --git a/apps/emqx_ft/src/emqx_ft_conf.erl b/apps/emqx_ft/src/emqx_ft_conf.erl index 0e8bcc193..5ca0b85ed 100644 --- a/apps/emqx_ft/src/emqx_ft_conf.erl +++ b/apps/emqx_ft/src/emqx_ft_conf.erl @@ -42,25 +42,40 @@ -type milliseconds() :: non_neg_integer(). -type seconds() :: non_neg_integer(). +%% 5 minutes (s) +-define(DEFAULT_MIN_SEGMENTS_TTL, 300). +%% 1 day (s) +-define(DEFAULT_MAX_SEGMENTS_TTL, 86400). +%% 1 minute (ms) +-define(DEFAULT_GC_INTERVAL, 60000). + %%-------------------------------------------------------------------- %% Accessors %%-------------------------------------------------------------------- --spec storage() -> _Storage | disabled. +-spec storage() -> _Storage. storage() -> - emqx_config:get([file_transfer, storage], disabled). + emqx_config:get([file_transfer, storage]). -spec gc_interval(_Storage) -> milliseconds(). gc_interval(_Storage) -> Conf = assert_storage(local), - emqx_map_lib:deep_get([segments, gc, interval], Conf). + emqx_map_lib:deep_get([segments, gc, interval], Conf, ?DEFAULT_GC_INTERVAL). -spec segments_ttl(_Storage) -> {_Min :: seconds(), _Max :: seconds()}. segments_ttl(_Storage) -> Conf = assert_storage(local), { - emqx_map_lib:deep_get([segments, gc, minimum_segments_ttl], Conf), - emqx_map_lib:deep_get([segments, gc, maximum_segments_ttl], Conf) + emqx_map_lib:deep_get( + [segments, gc, minimum_segments_ttl], + Conf, + ?DEFAULT_MIN_SEGMENTS_TTL + ), + emqx_map_lib:deep_get( + [segments, gc, maximum_segments_ttl], + Conf, + ?DEFAULT_MAX_SEGMENTS_TTL + ) }. assert_storage(Type) -> @@ -79,7 +94,7 @@ assert_storage(Type) -> load() -> ok = emqx_ft_storage_exporter:update_exporter( undefined, - emqx_config:get([file_transfer, storage]) + storage() ), emqx_conf:add_handler([file_transfer], ?MODULE). diff --git a/apps/emqx_ft/src/emqx_ft_schema.erl b/apps/emqx_ft/src/emqx_ft_schema.erl index 28970f238..f22b93c6d 100644 --- a/apps/emqx_ft/src/emqx_ft_schema.erl +++ b/apps/emqx_ft/src/emqx_ft_schema.erl @@ -52,8 +52,9 @@ fields(file_transfer) -> ref(local_storage) ]), #{ - required => true, - desc => ?DESC("storage") + required => false, + desc => ?DESC("storage"), + default => default_storage() } )} ]; @@ -184,7 +185,9 @@ desc(local_storage_exporter) -> desc(s3_exporter) -> "S3 Exporter settings for the File transfer local storage backend"; desc(local_storage_segments_gc) -> - "Garbage collection settings for the File transfer local segments storage". + "Garbage collection settings for the File transfer local segments storage"; +desc(_) -> + undefined. schema(filemeta) -> #{ @@ -221,3 +224,11 @@ converter(checksum) -> ref(Ref) -> ref(?MODULE, Ref). + +default_storage() -> + #{ + <<"type">> => <<"local">>, + <<"exporter">> => #{ + <<"type">> => <<"local">> + } + }. diff --git a/apps/emqx_s3/i18n/emqx_s3_schema_i18n.conf b/apps/emqx_s3/i18n/emqx_s3_schema_i18n.conf index 9e9a52a41..c391fa352 100644 --- a/apps/emqx_s3/i18n/emqx_s3_schema_i18n.conf +++ b/apps/emqx_s3/i18n/emqx_s3_schema_i18n.conf @@ -101,4 +101,14 @@ S3 uploader won't try to upload parts larger than this size.""" zh: "" } } + ipv6_probe { + desc { + en: "Whether to probe for IPv6 support." + zh: "" + } + label { + en: "IPv6 probe" + zh: "" + } + } } diff --git a/apps/emqx_s3/src/emqx_s3.erl b/apps/emqx_s3/src/emqx_s3.erl index 15f63fbd5..0c2592736 100644 --- a/apps/emqx_s3/src/emqx_s3.erl +++ b/apps/emqx_s3/src/emqx_s3.erl @@ -37,6 +37,7 @@ max_retries => pos_integer(), pool_size => pos_integer(), pool_type => atom(), + ipv6_probe => boolean(), ssl => map() }. diff --git a/apps/emqx_s3/src/emqx_s3_profile_conf.erl b/apps/emqx_s3/src/emqx_s3_profile_conf.erl index 006d06899..3d9d6ed3f 100644 --- a/apps/emqx_s3/src/emqx_s3_profile_conf.erl +++ b/apps/emqx_s3/src/emqx_s3_profile_conf.erl @@ -337,7 +337,7 @@ http_config( SSLOpts = emqx_tls_lib:to_client_opts(maps:get(ssl, HTTPOpts)), {tls, SSLOpts} end, - % NTransportOpts = emqx_misc:ipv6_probe(TransportOpts), + NTransportOpts = maybe_ipv6_probe(TransportOpts, maps:get(ipv6_probe, HTTPOpts, true)), [ {host, Host}, {port, Port}, @@ -346,10 +346,15 @@ http_config( {pool_type, PoolType}, {pool_size, PoolSize}, {transport, Transport}, - {transport_opts, TransportOpts}, + {transport_opts, NTransportOpts}, {enable_pipelining, EnablePipelining} ]. +maybe_ipv6_probe(TransportOpts, true) -> + emqx_misc:ipv6_probe(TransportOpts); +maybe_ipv6_probe(TransportOpts, false) -> + TransportOpts. + http_pool_cleanup_interval(ProfileConfig) -> maps:get( http_pool_cleanup_interval, ProfileConfig, ?DEAFULT_HTTP_POOL_CLEANUP_INTERVAL diff --git a/apps/emqx_s3/src/emqx_s3_schema.erl b/apps/emqx_s3/src/emqx_s3_schema.erl index bdd88a9e8..4d017deed 100644 --- a/apps/emqx_s3/src/emqx_s3_schema.erl +++ b/apps/emqx_s3/src/emqx_s3_schema.erl @@ -118,9 +118,20 @@ fields(s3) -> )} ]; fields(transport_options) -> - props_without( - [base_url, max_retries, retry_interval, request], emqx_connector_http:fields(config) - ) ++ + [ + {ipv6_probe, + mk( + boolean(), + #{ + default => true, + desc => ?DESC("ipv6_probe"), + required => false + } + )} + ] ++ + props_without( + [base_url, max_retries, retry_interval, request], emqx_connector_http:fields(config) + ) ++ props_with( [headers, max_retries, request_timeout], emqx_connector_http:fields("request") ).