summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Bakken <luke@bakken.io>2022-08-18 11:30:05 -0700
committerLuke Bakken <luke@bakken.io>2022-09-24 11:19:59 -0700
commit755ac7176bd6a8716e8e8356992402ded9e04aee (patch)
tree83efd723fe33aeb1ba0290cc1f120884d500e4e8
parent868628d2883e069e03c20d482777ea6f59e05ba7 (diff)
downloadrabbitmq-server-git-755ac7176bd6a8716e8e8356992402ded9e04aee.tar.gz
Follow-up to #5486
Discovered by @dumbbell Ensure externally read strings are saved as utf-8 encoded binaries. This is necessary since `cmd.exe` on Windows uses ISO-8859-1 encoding and directories can have latin1 characters, like `RabbitMQ Sérvér`. The `é` is represented by decimal `233` in the ISO-8859-1 encoding. The unicode code point is the same decimal value, `233`, so you will see this in the charlist data. However, when encoded using utf-8, this becomes the two-byte sequence `C3 A9` (hexidecimal). When reading strings from env variables and configuration, they will be unicode charlists, with each list item representing a unicode code point. All of Erlang string functions can handle strings in this form. Once these strings are written to ETS or Mnesia, they will be converted to utf-8 encoded binaries. Prior to these changes just `list_to_binary/1` was used. Fix xref error re:replace requires an iodata, which is not a list of unicode code points Correctly parse unicode vhost tags Fix many format strings to account for utf8 input. Try again to fix unicode vhost tags More format string fixes, try to get the CONFIG_FILE var correct Be sure to use the `unicode` option for re:replace when necessary More unicode format strings, add unicode option to re:split More format strings updated Change ~s to ~ts for vhost format strings Change ~s to ~ts for more vhost format strings Change ~s to ~ts for more vhost format strings Add unicode format chars to disk monitor Quote the directory on unix Finally figure out the correct way to pass unicode to the port
-rw-r--r--deps/rabbit/apps/rabbitmq_prelaunch/src/rabbit_prelaunch.erl10
-rw-r--r--deps/rabbit/apps/rabbitmq_prelaunch/src/rabbit_prelaunch_conf.erl26
-rw-r--r--deps/rabbit/src/rabbit_access_control.erl2
-rw-r--r--deps/rabbit/src/rabbit_amqqueue.erl2
-rw-r--r--deps/rabbit/src/rabbit_amqqueue_process.erl4
-rw-r--r--deps/rabbit/src/rabbit_amqqueue_sup_sup.erl4
-rw-r--r--deps/rabbit/src/rabbit_auth_backend_internal.erl114
-rw-r--r--deps/rabbit/src/rabbit_channel.erl6
-rw-r--r--deps/rabbit/src/rabbit_classic_queue.erl6
-rw-r--r--deps/rabbit/src/rabbit_classic_queue_index_v2.erl10
-rw-r--r--deps/rabbit/src/rabbit_connection_tracking.erl20
-rw-r--r--deps/rabbit/src/rabbit_direct.erl8
-rw-r--r--deps/rabbit/src/rabbit_disk_monitor.erl31
-rw-r--r--deps/rabbit/src/rabbit_logger_exchange_h.erl10
-rw-r--r--deps/rabbit/src/rabbit_msg_store.erl10
-rw-r--r--deps/rabbit/src/rabbit_prelaunch_logging.erl2
-rw-r--r--deps/rabbit/src/rabbit_queue_index.erl6
-rw-r--r--deps/rabbit/src/rabbit_ra_systems.erl8
-rw-r--r--deps/rabbit/src/rabbit_reader.erl24
-rw-r--r--deps/rabbit/src/rabbit_recovery_terms.erl10
-rw-r--r--deps/rabbit/src/rabbit_runtime_parameters.erl8
-rw-r--r--deps/rabbit/src/rabbit_trace.erl8
-rw-r--r--deps/rabbit/src/rabbit_variable_queue.erl24
-rw-r--r--deps/rabbit/src/rabbit_vhost.erl54
-rw-r--r--deps/rabbit/src/rabbit_vhost_msg_store.erl4
-rw-r--r--deps/rabbit/src/rabbit_vhost_process.erl2
-rw-r--r--deps/rabbit/src/rabbit_vhost_sup_sup.erl20
-rw-r--r--deps/rabbit_common/src/rabbit_data_coercion.erl30
-rw-r--r--deps/rabbit_common/src/rabbit_env.erl219
-rw-r--r--deps/rabbit_common/src/rabbit_json.erl56
-rw-r--r--deps/rabbit_common/src/rabbit_misc.erl4
-rw-r--r--deps/rabbitmq_amqp1_0/src/rabbit_amqp1_0_reader.erl2
-rw-r--r--deps/rabbitmq_management/src/rabbit_mgmt_wm_nodes.erl1
-rw-r--r--deps/rabbitmq_management_agent/src/rabbit_mgmt_external_stats.erl24
-rw-r--r--deps/rabbitmq_shovel/src/Elixir.RabbitMQ.CLI.Ctl.Commands.DeleteShovelCommand.erl2
-rw-r--r--deps/rabbitmq_shovel/src/rabbit_amqp091_shovel.erl4
-rw-r--r--deps/rabbitmq_shovel_management/src/rabbit_shovel_mgmt.erl4
37 files changed, 424 insertions, 355 deletions
diff --git a/deps/rabbit/apps/rabbitmq_prelaunch/src/rabbit_prelaunch.erl b/deps/rabbit/apps/rabbitmq_prelaunch/src/rabbit_prelaunch.erl
index 353403a8e1..117546a852 100644
--- a/deps/rabbit/apps/rabbitmq_prelaunch/src/rabbit_prelaunch.erl
+++ b/deps/rabbit/apps/rabbitmq_prelaunch/src/rabbit_prelaunch.erl
@@ -206,7 +206,7 @@ shutdown_func(Reason) ->
end.
write_pid_file(#{pid_file := PidFile}) ->
- ?LOG_DEBUG("Writing PID file: ~s", [PidFile]),
+ ?LOG_DEBUG("Writing PID file: ~ts", [PidFile]),
case filelib:ensure_dir(PidFile) of
ok ->
OSPid = os:getpid(),
@@ -215,13 +215,13 @@ write_pid_file(#{pid_file := PidFile}) ->
ok;
{error, Reason} = Error ->
?LOG_WARNING(
- "Failed to write PID file \"~s\": ~s",
+ "Failed to write PID file \"~ts\": ~ts",
[PidFile, file:format_error(Reason)]),
Error
end;
{error, Reason} = Error ->
?LOG_WARNING(
- "Failed to create PID file \"~s\" directory: ~s",
+ "Failed to create PID file \"~ts\" directory: ~ts",
[PidFile, file:format_error(Reason)]),
Error
end;
@@ -229,10 +229,10 @@ write_pid_file(_) ->
ok.
remove_pid_file(#{pid_file := PidFile, keep_pid_file_on_exit := true}) ->
- ?LOG_DEBUG("Keeping PID file: ~s", [PidFile]),
+ ?LOG_DEBUG("Keeping PID file: ~ts", [PidFile]),
ok;
remove_pid_file(#{pid_file := PidFile}) ->
- ?LOG_DEBUG("Deleting PID file: ~s", [PidFile]),
+ ?LOG_DEBUG("Deleting PID file: ~ts", [PidFile]),
_ = file:delete(PidFile),
ok;
remove_pid_file(_) ->
diff --git a/deps/rabbit/apps/rabbitmq_prelaunch/src/rabbit_prelaunch_conf.erl b/deps/rabbit/apps/rabbitmq_prelaunch/src/rabbit_prelaunch_conf.erl
index 9e866c4f16..b6156ff5c2 100644
--- a/deps/rabbit/apps/rabbitmq_prelaunch/src/rabbit_prelaunch_conf.erl
+++ b/deps/rabbit/apps/rabbitmq_prelaunch/src/rabbit_prelaunch_conf.erl
@@ -57,7 +57,7 @@ setup(Context) ->
config_advanced_file => AdvancedConfigFile};
undefined when AdvancedConfigFile =/= undefined ->
?LOG_WARNING(
- "Using RABBITMQ_ADVANCED_CONFIG_FILE: ~s",
+ "Using RABBITMQ_ADVANCED_CONFIG_FILE: ~ts",
[AdvancedConfigFile],
#{domain => ?RMQLOG_DOMAIN_PRELAUNCH}),
Config = load_cuttlefish_config_file(Context,
@@ -72,7 +72,7 @@ setup(Context) ->
config_advanced_file => undefined}
end,
?LOG_DEBUG(
- "Saving config state to application env: ~p", [State],
+ "Saving config state to application env: ~tp", [State],
#{domain => ?RMQLOG_DOMAIN_PRELAUNCH}),
store_config_state(State).
@@ -158,7 +158,7 @@ find_actual_main_config_file(#{main_config_file := File}) ->
"config files exist.",
#{domain => ?RMQLOG_DOMAIN_PRELAUNCH}),
?LOG_WARNING(
- "Using the old format config file: ~s",
+ "Using the old format config file: ~ts",
[OldFormatFile],
#{domain => ?RMQLOG_DOMAIN_PRELAUNCH}),
?LOG_WARNING(
@@ -342,7 +342,7 @@ list_schemas_in_app(App) ->
case code:priv_dir(App) of
{error, bad_name} ->
?LOG_DEBUG(
- " [ ] ~s (no readable priv dir)", [App],
+ " [ ] ~ts (no readable priv dir)", [App],
#{domain => ?RMQLOG_DOMAIN_PRELAUNCH}),
[];
PrivDir ->
@@ -351,7 +351,7 @@ list_schemas_in_app(App) ->
end;
Reason1 ->
?LOG_DEBUG(
- " [ ] ~s (failed to load application: ~p)",
+ " [ ] ~ts (failed to load application: ~tp)",
[App, Reason1],
#{domain => ?RMQLOG_DOMAIN_PRELAUNCH}),
[]
@@ -366,14 +366,14 @@ list_schemas_in_app(App) ->
do_list_schemas_in_app(App, SchemaDir) ->
case erl_prim_loader:list_dir(SchemaDir) of
{ok, Files} ->
- ?LOG_DEBUG(" [x] ~s", [App],
+ ?LOG_DEBUG(" [x] ~ts", [App],
#{domain => ?RMQLOG_DOMAIN_PRELAUNCH}),
[filename:join(SchemaDir, File)
|| [C | _] = File <- Files,
C =/= $.];
error ->
?LOG_DEBUG(
- " [ ] ~s (no readable schema dir)", [App],
+ " [ ] ~ts (no readable schema dir)", [App],
#{domain => ?RMQLOG_DOMAIN_PRELAUNCH}),
[]
end.
@@ -391,7 +391,7 @@ override_with_advanced_config(Config, AdvancedConfigFile) ->
{ok, OtherTerms} ->
?LOG_ERROR(
"Failed to load advanced configuration file \"~ts\", "
- "incorrect format: ~p",
+ "incorrect format: ~tp",
[AdvancedConfigFile, OtherTerms],
#{domain => ?RMQLOG_DOMAIN_PRELAUNCH}),
throw({error, failed_to_parse_advanced_configuration_file});
@@ -406,7 +406,7 @@ override_with_advanced_config(Config, AdvancedConfigFile) ->
apply_erlang_term_based_config([{_, []} | Rest]) ->
apply_erlang_term_based_config(Rest);
apply_erlang_term_based_config([{App, Vars} | Rest]) ->
- ?LOG_DEBUG(" Applying configuration for '~s':", [App],
+ ?LOG_DEBUG(" Applying configuration for '~ts':", [App],
#{domain => ?RMQLOG_DOMAIN_PRELAUNCH}),
ok = apply_app_env_vars(App, Vars),
apply_erlang_term_based_config(Rest);
@@ -421,16 +421,16 @@ apply_app_env_vars(_, []) ->
ok.
log_app_env_var(password = Var, _) ->
- ?LOG_DEBUG(" - ~s = ********", [Var],
+ ?LOG_DEBUG(" - ~ts = ********", [Var],
#{domain => ?RMQLOG_DOMAIN_PRELAUNCH});
log_app_env_var(Var, Value) when is_list(Value) ->
%% To redact sensitive entries,
%% e.g. {password,"********"} for stream replication over TLS
Redacted = redact_env_var(Value),
- ?LOG_DEBUG(" - ~s = ~p", [Var, Redacted],
+ ?LOG_DEBUG(" - ~ts = ~tp", [Var, Redacted],
#{domain => ?RMQLOG_DOMAIN_PRELAUNCH});
log_app_env_var(Var, Value) ->
- ?LOG_DEBUG(" - ~s = ~p", [Var, Value],
+ ?LOG_DEBUG(" - ~ts = ~tp", [Var, Value],
#{domain => ?RMQLOG_DOMAIN_PRELAUNCH}).
redact_env_var(Value) when is_list(Value) ->
@@ -470,7 +470,7 @@ decrypt_app(App, [{Key, Value} | Tail], Algo) ->
Algo1;
{NewValue, Algo1} ->
?LOG_DEBUG(
- "Value of `~s` decrypted", [Key],
+ "Value of `~ts` decrypted", [Key],
#{domain => ?RMQLOG_DOMAIN_PRELAUNCH}),
ok = application:set_env(App, Key, NewValue,
[{persistent, true}]),
diff --git a/deps/rabbit/src/rabbit_access_control.erl b/deps/rabbit/src/rabbit_access_control.erl
index e5c6332649..1e798a51e1 100644
--- a/deps/rabbit/src/rabbit_access_control.erl
+++ b/deps/rabbit/src/rabbit_access_control.erl
@@ -163,7 +163,7 @@ check_vhost_access(User = #user{username = Username,
Mod:check_vhost_access(
auth_user(User, Impl), VHostPath, FullAuthzContext)
end,
- Mod, "access to vhost '~s' refused for user '~s'",
+ Mod, "access to vhost '~ts' refused for user '~s'",
[VHostPath, Username], not_allowed);
(_, Else) ->
Else
diff --git a/deps/rabbit/src/rabbit_amqqueue.erl b/deps/rabbit/src/rabbit_amqqueue.erl
index bbc4be0042..fb1d3569e3 100644
--- a/deps/rabbit/src/rabbit_amqqueue.erl
+++ b/deps/rabbit/src/rabbit_amqqueue.erl
@@ -430,7 +430,7 @@ rebalance(Type, VhostSpec, QueueSpec) ->
maybe_rebalance(get_rebalance_lock(self()), Type, VhostSpec, QueueSpec).
maybe_rebalance({true, Id}, Type, VhostSpec, QueueSpec) ->
- rabbit_log:info("Starting queue rebalance operation: '~s' for vhosts matching '~s' and queues matching '~s'",
+ rabbit_log:info("Starting queue rebalance operation: '~s' for vhosts matching '~ts' and queues matching '~s'",
[Type, VhostSpec, QueueSpec]),
Running = rabbit_maintenance:filter_out_drained_nodes_consistent_read(rabbit_nodes:all_running()),
NumRunning = length(Running),
diff --git a/deps/rabbit/src/rabbit_amqqueue_process.erl b/deps/rabbit/src/rabbit_amqqueue_process.erl
index 7af5a63a0f..cfecad93d3 100644
--- a/deps/rabbit/src/rabbit_amqqueue_process.erl
+++ b/deps/rabbit/src/rabbit_amqqueue_process.erl
@@ -1826,14 +1826,14 @@ log_delete_exclusive({ConPid, _ConRef}, State) ->
log_delete_exclusive(ConPid, #q{ q = Q }) ->
Resource = amqqueue:get_name(Q),
#resource{ name = QName, virtual_host = VHost } = Resource,
- rabbit_log_queue:debug("Deleting exclusive queue '~s' in vhost '~s' " ++
+ rabbit_log_queue:debug("Deleting exclusive queue '~s' in vhost '~ts' " ++
"because its declaring connection ~p was closed",
[QName, VHost, ConPid]).
log_auto_delete(Reason, #q{ q = Q }) ->
Resource = amqqueue:get_name(Q),
#resource{ name = QName, virtual_host = VHost } = Resource,
- rabbit_log_queue:debug("Deleting auto-delete queue '~s' in vhost '~s' " ++
+ rabbit_log_queue:debug("Deleting auto-delete queue '~s' in vhost '~ts' " ++
Reason,
[QName, VHost]).
diff --git a/deps/rabbit/src/rabbit_amqqueue_sup_sup.erl b/deps/rabbit/src/rabbit_amqqueue_sup_sup.erl
index 1d0f7ae403..5b6837fe50 100644
--- a/deps/rabbit/src/rabbit_amqqueue_sup_sup.erl
+++ b/deps/rabbit/src/rabbit_amqqueue_sup_sup.erl
@@ -65,7 +65,7 @@ start_for_vhost(VHost) ->
%% we can get here if a vhost is added and removed concurrently
%% e.g. some integration tests do it
{error, {no_such_vhost, VHost}} ->
- rabbit_log:error("Failed to start a queue process supervisor for vhost ~s: vhost no longer exists!",
+ rabbit_log:error("Failed to start a queue process supervisor for vhost ~ts: vhost no longer exists!",
[VHost]),
{error, {no_such_vhost, VHost}}
end.
@@ -78,7 +78,7 @@ stop_for_vhost(VHost) ->
ok = supervisor2:delete_child(VHostSup, rabbit_amqqueue_sup_sup);
%% see start/1
{error, {no_such_vhost, VHost}} ->
- rabbit_log:error("Failed to stop a queue process supervisor for vhost ~s: vhost no longer exists!",
+ rabbit_log:error("Failed to stop a queue process supervisor for vhost ~ts: vhost no longer exists!",
[VHost]),
ok
end.
diff --git a/deps/rabbit/src/rabbit_auth_backend_internal.erl b/deps/rabbit/src/rabbit_auth_backend_internal.erl
index 65c6b2c03f..35196b7e92 100644
--- a/deps/rabbit/src/rabbit_auth_backend_internal.erl
+++ b/deps/rabbit/src/rabbit_auth_backend_internal.erl
@@ -60,7 +60,7 @@ hashing_module_for_user(User) ->
rabbit_password:hashing_mod(ModOrUndefined).
-define(BLANK_PASSWORD_REJECTION_MESSAGE,
- "user '~s' attempted to log in with a blank password, which is prohibited by the internal authN backend. "
+ "user '~ts' attempted to log in with a blank password, which is prohibited by the internal authN backend. "
"To use TLS/x509 certificate-based authentication, see the rabbitmq_auth_mechanism_ssl plugin and configure the client to use the EXTERNAL authentication mechanism. "
"Alternatively change the password for the user to be non-blank.").
@@ -104,7 +104,7 @@ user_login_authorization(Username, _AuthProps) ->
end.
internal_check_user_login(Username, Fun) ->
- Refused = {refused, "user '~s' - invalid credentials", [Username]},
+ Refused = {refused, "user '~ts' - invalid credentials", [Username]},
case lookup_user(Username) of
{ok, User} ->
Tags = internal_user:get_tags(User),
@@ -200,7 +200,7 @@ validate_and_alternate_credentials(Username, Password, ActingUser, Fun) ->
ok ->
Fun(Username, Password, ActingUser);
{error, Err} ->
- rabbit_log:error("Credential validation for '~s' failed!", [Username]),
+ rabbit_log:error("Credential validation for '~ts' failed!", [Username]),
{error, Err}
end.
@@ -230,7 +230,7 @@ add_user_sans_validation(Limits, Tags) ->
end.
add_user_sans_validation(Username, Password, ActingUser, Limits, Tags) ->
- rabbit_log:debug("Asked to create a new user '~s', password length in bytes: ~p", [Username, bit_size(Password)]),
+ rabbit_log:debug("Asked to create a new user '~ts', password length in bytes: ~p", [Username, bit_size(Password)]),
%% hash_password will pick the hashing function configured for us
%% but we also need to store a hint as part of the record, so we
%% retrieve it here one more time
@@ -246,7 +246,7 @@ add_user_sans_validation(Username, Password, ActingUser, Limits, Tags) ->
add_user_sans_validation_in(Username, User, ConvertedTags, Limits, ActingUser).
add_user_sans_validation(Username, PasswordHash, HashingAlgorithm, Tags, Limits, ActingUser) ->
- rabbit_log:debug("Asked to create a new user '~s' with password hash", [Username]),
+ rabbit_log:debug("Asked to create a new user '~ts' with password hash", [Username]),
ConvertedTags = [rabbit_data_coercion:to_atom(I) || I <- Tags],
HashingMod = rabbit_password:hashing_mod(),
User0 = internal_user:create_user(Username, PasswordHash, HashingMod),
@@ -271,7 +271,7 @@ add_user_sans_validation_in(Username, User, ConvertedTags, Limits, ActingUser) -
mnesia:abort({user_already_exists, Username})
end
end),
- rabbit_log:info("Created user '~s'", [Username]),
+ rabbit_log:info("Created user '~ts'", [Username]),
rabbit_event:notify(user_created, [{name, Username},
{user_who_performed_action, ActingUser}]),
case ConvertedTags of
@@ -285,17 +285,17 @@ add_user_sans_validation_in(Username, User, ConvertedTags, Limits, ActingUser) -
R
catch
throw:{error, {user_already_exists, _}} = Error ->
- rabbit_log:warning("Failed to add user '~s': the user already exists", [Username]),
+ rabbit_log:warning("Failed to add user '~ts': the user already exists", [Username]),
throw(Error);
Class:Error:Stacktrace ->
- rabbit_log:warning("Failed to add user '~s': ~p", [Username, Error]),
+ rabbit_log:warning("Failed to add user '~ts': ~tp", [Username, Error]),
erlang:raise(Class, Error, Stacktrace)
end .
-spec delete_user(rabbit_types:username(), rabbit_types:username()) -> 'ok'.
delete_user(Username, ActingUser) ->
- rabbit_log:debug("Asked to delete user '~s'", [Username]),
+ rabbit_log:debug("Asked to delete user '~ts'", [Username]),
try
R = rabbit_misc:execute_mnesia_transaction(
rabbit_misc:with_user(
@@ -316,17 +316,17 @@ delete_user(Username, ActingUser) ->
[ok = mnesia:delete_object(rabbit_topic_permission, R, write) || R <- UserTopicPermissions],
ok
end)),
- rabbit_log:info("Deleted user '~s'", [Username]),
+ rabbit_log:info("Deleted user '~ts'", [Username]),
rabbit_event:notify(user_deleted,
[{name, Username},
{user_who_performed_action, ActingUser}]),
R
catch
throw:{error, {no_such_user, _}} = Error ->
- rabbit_log:warning("Failed to delete user '~s': the user does not exist", [Username]),
+ rabbit_log:warning("Failed to delete user '~ts': the user does not exist", [Username]),
throw(Error);
Class:Error:Stacktrace ->
- rabbit_log:warning("Failed to delete user '~s': ~p", [Username, Error]),
+ rabbit_log:warning("Failed to delete user '~ts': ~tp", [Username, Error]),
erlang:raise(Class, Error, Stacktrace)
end .
@@ -355,23 +355,23 @@ change_password(Username, Password, ActingUser) ->
change_password_sans_validation(Username, Password, ActingUser) ->
try
- rabbit_log:debug("Asked to change password of user '~s', new password length in bytes: ~p", [Username, bit_size(Password)]),
+ rabbit_log:debug("Asked to change password of user '~ts', new password length in bytes: ~p", [Username, bit_size(Password)]),
HashingAlgorithm = rabbit_password:hashing_mod(),
R = change_password_hash(Username,
hash_password(rabbit_password:hashing_mod(),
Password),
HashingAlgorithm),
- rabbit_log:info("Successfully changed password for user '~s'", [Username]),
+ rabbit_log:info("Successfully changed password for user '~ts'", [Username]),
rabbit_event:notify(user_password_changed,
[{name, Username},
{user_who_performed_action, ActingUser}]),
R
catch
throw:{error, {no_such_user, _}} = Error ->
- rabbit_log:warning("Failed to change password for user '~s': the user does not exist", [Username]),
+ rabbit_log:warning("Failed to change password for user '~ts': the user does not exist", [Username]),
throw(Error);
Class:Error:Stacktrace ->
- rabbit_log:warning("Failed to change password for user '~s': ~p", [Username, Error]),
+ rabbit_log:warning("Failed to change password for user '~ts': ~tp", [Username, Error]),
erlang:raise(Class, Error, Stacktrace)
end.
@@ -382,10 +382,10 @@ update_user(Username, Password, Tags, Limits, ActingUser) ->
update_user_sans_validation(Tags, Limits) ->
fun(Username, Password, ActingUser) ->
try
- rabbit_log:debug("Asked to change password of user '~s', new password length in bytes: ~p", [Username, bit_size(Password)]),
+ rabbit_log:debug("Asked to change password of user '~ts', new password length in bytes: ~tp", [Username, bit_size(Password)]),
HashingAlgorithm = rabbit_password:hashing_mod(),
- rabbit_log:debug("Asked to set user tags for user '~s' to ~p", [Username, Tags]),
+ rabbit_log:debug("Asked to set user tags for user '~ts' to ~tp", [Username, Tags]),
ConvertedTags = [rabbit_data_coercion:to_atom(I) || I <- Tags],
R = update_user_with_hash(Username,
@@ -394,7 +394,7 @@ update_user_sans_validation(Tags, Limits) ->
HashingAlgorithm,
ConvertedTags,
Limits),
- rabbit_log:info("Successfully changed password for user '~s'", [Username]),
+ rabbit_log:info("Successfully changed password for user '~ts'", [Username]),
rabbit_event:notify(user_password_changed,
[{name, Username},
{user_who_performed_action, ActingUser}]),
@@ -403,10 +403,10 @@ update_user_sans_validation(Tags, Limits) ->
R
catch
throw:{error, {no_such_user, _}} = Error ->
- rabbit_log:warning("Failed to change password for user '~s': the user does not exist", [Username]),
+ rabbit_log:warning("Failed to change password for user '~ts': the user does not exist", [Username]),
throw(Error);
Class:Error:Stacktrace ->
- rabbit_log:warning("Failed to change password for user '~s': ~p", [Username, Error]),
+ rabbit_log:warning("Failed to change password for user '~ts': ~tp", [Username, Error]),
erlang:raise(Class, Error, Stacktrace)
end
end.
@@ -414,7 +414,7 @@ update_user_sans_validation(Tags, Limits) ->
-spec clear_password(rabbit_types:username(), rabbit_types:username()) -> 'ok'.
clear_password(Username, ActingUser) ->
- rabbit_log:info("Clearing password for '~s'", [Username]),
+ rabbit_log:info("Clearing password for '~ts'", [Username]),
R = change_password_hash(Username, <<"">>),
rabbit_event:notify(user_password_cleared,
[{name, Username},
@@ -456,7 +456,7 @@ update_user_with_hash(Username, PasswordHash, HashingAlgorithm, ConvertedTags, L
set_tags(Username, Tags, ActingUser) ->
ConvertedTags = [rabbit_data_coercion:to_atom(I) || I <- Tags],
- rabbit_log:debug("Asked to set user tags for user '~s' to ~p", [Username, ConvertedTags]),
+ rabbit_log:debug("Asked to set user tags for user '~ts' to ~tp", [Username, ConvertedTags]),
try
R = update_user(Username, fun(User) ->
internal_user:set_tags(User, ConvertedTags)
@@ -465,15 +465,15 @@ set_tags(Username, Tags, ActingUser) ->
R
catch
throw:{error, {no_such_user, _}} = Error ->
- rabbit_log:warning("Failed to set tags for user '~s': the user does not exist", [Username]),
+ rabbit_log:warning("Failed to set tags for user '~ts': the user does not exist", [Username]),
throw(Error);
Class:Error:Stacktrace ->
- rabbit_log:warning("Failed to set tags for user '~s': ~p", [Username, Error]),
+ rabbit_log:warning("Failed to set tags for user '~ts': ~tp", [Username, Error]),
erlang:raise(Class, Error, Stacktrace)
end .
notify_user_tags_set(Username, ConvertedTags, ActingUser) ->
- rabbit_log:info("Successfully set user tags for user '~s' to ~p", [Username, ConvertedTags]),
+ rabbit_log:info("Successfully set user tags for user '~ts' to ~tp", [Username, ConvertedTags]),
rabbit_event:notify(user_tags_set, [{name, Username}, {tags, ConvertedTags},
{user_who_performed_action, ActingUser}]).
@@ -484,7 +484,7 @@ notify_user_tags_set(Username, ConvertedTags, ActingUser) ->
set_permissions(Username, VirtualHost, ConfigurePerm, WritePerm, ReadPerm, ActingUser) ->
rabbit_log:debug("Asked to set permissions for "
- "'~s' in virtual host '~s' to '~s', '~s', '~s'",
+ "'~ts' in virtual host '~ts' to '~s', '~s', '~s'",
[Username, VirtualHost, ConfigurePerm, WritePerm, ReadPerm]),
lists:map(
fun (RegexpBin) ->
@@ -492,8 +492,8 @@ set_permissions(Username, VirtualHost, ConfigurePerm, WritePerm, ReadPerm, Actin
case re:compile(Regexp) of
{ok, _} -> ok;
{error, Reason} ->
- rabbit_log:warning("Failed to set permissions for '~s' in virtual host '~s': "
- "regular expression '~s' is invalid",
+ rabbit_log:warning("Failed to set permissions for '~ts' in virtual host '~ts': "
+ "regular expression '~ts' is invalid",
[Username, VirtualHost, RegexpBin]),
throw({error, {invalid_regexp, Regexp, Reason}})
end
@@ -514,7 +514,7 @@ set_permissions(Username, VirtualHost, ConfigurePerm, WritePerm, ReadPerm, Actin
write)
end)),
rabbit_log:info("Successfully set permissions for "
- "'~s' in virtual host '~s' to '~s', '~s', '~s'",
+ "'~ts' in virtual host '~ts' to '~s', '~s', '~s'",
[Username, VirtualHost, ConfigurePerm, WritePerm, ReadPerm]),
rabbit_event:notify(permission_created, [{user, Username},
{vhost, VirtualHost},
@@ -525,15 +525,15 @@ set_permissions(Username, VirtualHost, ConfigurePerm, WritePerm, ReadPerm, Actin
R
catch
throw:{error, {no_such_vhost, _}} = Error ->
- rabbit_log:warning("Failed to set permissions for '~s': virtual host '~s' does not exist",
+ rabbit_log:warning("Failed to set permissions for '~ts': virtual host '~ts' does not exist",
[Username, VirtualHost]),
throw(Error);
throw:{error, {no_such_user, _}} = Error ->
- rabbit_log:warning("Failed to set permissions for '~s': the user does not exist",
+ rabbit_log:warning("Failed to set permissions for '~ts': the user does not exist",
[Username]),
throw(Error);
Class:Error:Stacktrace ->
- rabbit_log:warning("Failed to set permissions for '~s' in virtual host '~s': ~p",
+ rabbit_log:warning("Failed to set permissions for '~ts' in virtual host '~ts': ~tp",
[Username, VirtualHost, Error]),
erlang:raise(Class, Error, Stacktrace)
end.
@@ -542,7 +542,7 @@ set_permissions(Username, VirtualHost, ConfigurePerm, WritePerm, ReadPerm, Actin
(rabbit_types:username(), rabbit_types:vhost(), rabbit_types:username()) -> 'ok'.
clear_permissions(Username, VirtualHost, ActingUser) ->
- rabbit_log:debug("Asked to clear permissions for '~s' in virtual host '~s'",
+ rabbit_log:debug("Asked to clear permissions for '~ts' in virtual host '~ts'",
[Username, VirtualHost]),
try
R = rabbit_misc:execute_mnesia_transaction(
@@ -553,7 +553,7 @@ clear_permissions(Username, VirtualHost, ActingUser) ->
#user_vhost{username = Username,
virtual_host = VirtualHost}})
end)),
- rabbit_log:info("Successfully cleared permissions for '~s' in virtual host '~s'",
+ rabbit_log:info("Successfully cleared permissions for '~ts' in virtual host '~ts'",
[Username, VirtualHost]),
rabbit_event:notify(permission_deleted, [{user, Username},
{vhost, VirtualHost},
@@ -561,15 +561,15 @@ clear_permissions(Username, VirtualHost, ActingUser) ->
R
catch
throw:{error, {no_such_vhost, _}} = Error ->
- rabbit_log:warning("Failed to clear permissions for '~s': virtual host '~s' does not exist",
+ rabbit_log:warning("Failed to clear permissions for '~ts': virtual host '~ts' does not exist",
[Username, VirtualHost]),
throw(Error);
throw:{error, {no_such_user, _}} = Error ->
- rabbit_log:warning("Failed to clear permissions for '~s': the user does not exist",
+ rabbit_log:warning("Failed to clear permissions for '~ts': the user does not exist",
[Username]),
throw(Error);
Class:Error:Stacktrace ->
- rabbit_log:warning("Failed to clear permissions for '~s' in virtual host '~s': ~p",
+ rabbit_log:warning("Failed to clear permissions for '~ts' in virtual host '~ts': ~tp",
[Username, VirtualHost, Error]),
erlang:raise(Class, Error, Stacktrace)
end.
@@ -585,8 +585,8 @@ update_user(Username, Fun) ->
end)).
set_topic_permissions(Username, VirtualHost, Exchange, WritePerm, ReadPerm, ActingUser) ->
- rabbit_log:debug("Asked to set topic permissions on exchange '~s' for "
- "user '~s' in virtual host '~s' to '~s', '~s'",
+ rabbit_log:debug("Asked to set topic permissions on exchange '~ts' for "
+ "user '~ts' in virtual host '~ts' to '~s', '~s'",
[Exchange, Username, VirtualHost, WritePerm, ReadPerm]),
WritePermRegex = rabbit_data_coercion:to_binary(WritePerm),
ReadPermRegex = rabbit_data_coercion:to_binary(ReadPerm),
@@ -595,8 +595,8 @@ set_topic_permissions(Username, VirtualHost, Exchange, WritePerm, ReadPerm, Acti
case re:compile(RegexpBin) of
{ok, _} -> ok;
{error, Reason} ->
- rabbit_log:warning("Failed to set topic permissions on exchange '~s' for "
- "'~s' in virtual host '~s': regular expression '~s' is invalid",
+ rabbit_log:warning("Failed to set topic permissions on exchange '~ts' for "
+ "'~ts' in virtual host '~ts': regular expression '~ts' is invalid",
[Exchange, Username, VirtualHost, RegexpBin]),
throw({error, {invalid_regexp, RegexpBin, Reason}})
end
@@ -621,8 +621,8 @@ set_topic_permissions(Username, VirtualHost, Exchange, WritePerm, ReadPerm, Acti
},
write)
end)),
- rabbit_log:info("Successfully set topic permissions on exchange '~s' for "
- "'~s' in virtual host '~s' to '~s', '~s'",
+ rabbit_log:info("Successfully set topic permissions on exchange '~ts' for "
+ "'~ts' in virtual host '~ts' to '~s', '~s'",
[Exchange, Username, VirtualHost, WritePerm, ReadPerm]),
rabbit_event:notify(topic_permission_created, [
{user, Username},
@@ -634,21 +634,21 @@ set_topic_permissions(Username, VirtualHost, Exchange, WritePerm, ReadPerm, Acti
R
catch
throw:{error, {no_such_vhost, _}} = Error ->
- rabbit_log:warning("Failed to set topic permissions on exchange '~s' for '~s': virtual host '~s' does not exist.",
+ rabbit_log:warning("Failed to set topic permissions on exchange '~ts' for '~ts': virtual host '~ts' does not exist.",
[Exchange, Username, VirtualHost]),
throw(Error);
throw:{error, {no_such_user, _}} = Error ->
- rabbit_log:warning("Failed to set topic permissions on exchange '~s' for '~s': the user does not exist.",
+ rabbit_log:warning("Failed to set topic permissions on exchange '~ts' for '~ts': the user does not exist.",
[Exchange, Username]),
throw(Error);
Class:Error:Stacktrace ->
- rabbit_log:warning("Failed to set topic permissions on exchange '~s' for '~s' in virtual host '~s': ~p.",
+ rabbit_log:warning("Failed to set topic permissions on exchange '~ts' for '~ts' in virtual host '~ts': ~tp.",
[Exchange, Username, VirtualHost, Error]),
erlang:raise(Class, Error, Stacktrace)
end .
clear_topic_permissions(Username, VirtualHost, ActingUser) ->
- rabbit_log:debug("Asked to clear topic permissions for '~s' in virtual host '~s'",
+ rabbit_log:debug("Asked to clear topic permissions for '~ts' in virtual host '~ts'",
[Username, VirtualHost]),
try
R = rabbit_misc:execute_mnesia_transaction(
@@ -661,7 +661,7 @@ clear_topic_permissions(Username, VirtualHost, ActingUser) ->
ok = mnesia:delete_object(rabbit_topic_permission, X, write)
end, List)
end)),
- rabbit_log:info("Successfully cleared topic permissions for '~s' in virtual host '~s'",
+ rabbit_log:info("Successfully cleared topic permissions for '~ts' in virtual host '~ts'",
[Username, VirtualHost]),
rabbit_event:notify(topic_permission_deleted, [{user, Username},
{vhost, VirtualHost},
@@ -669,21 +669,21 @@ clear_topic_permissions(Username, VirtualHost, ActingUser) ->
R
catch
throw:{error, {no_such_vhost, _}} = Error ->
- rabbit_log:warning("Failed to clear topic permissions for '~s': virtual host '~s' does not exist",
+ rabbit_log:warning("Failed to clear topic permissions for '~ts': virtual host '~ts' does not exist",
[Username, VirtualHost]),
throw(Error);
throw:{error, {no_such_user, _}} = Error ->
- rabbit_log:warning("Failed to clear topic permissions for '~s': the user does not exist",
+ rabbit_log:warning("Failed to clear topic permissions for '~ts': the user does not exist",
[Username]),
throw(Error);
Class:Error:Stacktrace ->
- rabbit_log:warning("Failed to clear topic permissions for '~s' in virtual host '~s': ~p",
+ rabbit_log:warning("Failed to clear topic permissions for '~ts' in virtual host '~ts': ~tp",
[Username, VirtualHost, Error]),
erlang:raise(Class, Error, Stacktrace)
end.
clear_topic_permissions(Username, VirtualHost, Exchange, ActingUser) ->
- rabbit_log:debug("Asked to clear topic permissions on exchange '~s' for '~s' in virtual host '~s'",
+ rabbit_log:debug("Asked to clear topic permissions on exchange '~ts' for '~ts' in virtual host '~ts'",
[Exchange, Username, VirtualHost]),
try
R = rabbit_misc:execute_mnesia_transaction(
@@ -698,7 +698,7 @@ clear_topic_permissions(Username, VirtualHost, Exchange, ActingUser) ->
exchange = Exchange
}, write)
end)),
- rabbit_log:info("Successfully cleared topic permissions on exchange '~s' for '~s' in virtual host '~s'",
+ rabbit_log:info("Successfully cleared topic permissions on exchange '~ts' for '~ts' in virtual host '~ts'",
[Exchange, Username, VirtualHost]),
rabbit_event:notify(permission_deleted, [{user, Username},
{vhost, VirtualHost},
@@ -706,15 +706,15 @@ clear_topic_permissions(Username, VirtualHost, Exchange, ActingUser) ->
R
catch
throw:{error, {no_such_vhost, _}} = Error ->
- rabbit_log:warning("Failed to clear topic permissions on exchange '~s' for '~s': virtual host '~s' does not exist",
+ rabbit_log:warning("Failed to clear topic permissions on exchange '~ts' for '~ts': virtual host '~ts' does not exist",
[Exchange, Username, VirtualHost]),
throw(Error);
throw:{error, {no_such_user, _}} = Error ->
- rabbit_log:warning("Failed to clear topic permissions on exchange '~s' for '~s': the user does not exist",
+ rabbit_log:warning("Failed to clear topic permissions on exchange '~ts' for '~ts': the user does not exist",
[Exchange, Username]),
throw(Error);
Class:Error:Stacktrace ->
- rabbit_log:warning("Failed to clear topic permissions on exchange '~s' for '~s' in virtual host '~s': ~p",
+ rabbit_log:warning("Failed to clear topic permissions on exchange '~ts' for '~ts' in virtual host '~ts': ~tp",
[Exchange, Username, VirtualHost, Error]),
erlang:raise(Class, Error, Stacktrace)
end.
diff --git a/deps/rabbit/src/rabbit_channel.erl b/deps/rabbit/src/rabbit_channel.erl
index fd25d00478..1d134959c4 100644
--- a/deps/rabbit/src/rabbit_channel.erl
+++ b/deps/rabbit/src/rabbit_channel.erl
@@ -954,8 +954,8 @@ handle_exception(Reason, State = #ch{cfg = #conf{protocol = Protocol,
case rabbit_binary_generator:map_exception(Channel, Reason, Protocol) of
{Channel, CloseMethod} ->
rabbit_log_channel:error(
- "Channel error on connection ~p (~s, vhost: '~s',"
- " user: '~s'), channel ~p:~n~s",
+ "Channel error on connection ~p (~ts, vhost: '~ts',"
+ " user: '~ts'), channel ~p:~n~ts",
[ConnPid, ConnName, VHost, User#user.username,
Channel, format_soft_error(Reason)]),
ok = rabbit_writer:send_command(WriterPid, CloseMethod),
@@ -1109,7 +1109,7 @@ check_vhost_queue_limit(#resource{name = QueueName}, VHost) ->
case rabbit_vhost_limit:is_over_queue_limit(VHost) of
false -> ok;
{true, Limit} -> precondition_failed("cannot declare queue '~s': "
- "queue limit in vhost '~s' (~p) is reached",
+ "queue limit in vhost '~ts' (~p) is reached",
[QueueName, VHost, Limit])
end.
diff --git a/deps/rabbit/src/rabbit_classic_queue.erl b/deps/rabbit/src/rabbit_classic_queue.erl
index d25caf31b4..aa293c99ce 100644
--- a/deps/rabbit/src/rabbit_classic_queue.erl
+++ b/deps/rabbit/src/rabbit_classic_queue.erl
@@ -96,14 +96,14 @@ delete(Q, IfUnused, IfEmpty, ActingUser) when ?amqqueue_is_classic(Q) ->
#resource{name = Name, virtual_host = Vhost} = amqqueue:get_name(Q1),
case IfEmpty of
true ->
- rabbit_log:error("Queue ~s in vhost ~s has its master node down and "
+ rabbit_log:error("Queue ~s in vhost ~ts has its master node down and "
"no mirrors available or eligible for promotion. "
"The queue may be non-empty. "
"Refusing to force-delete.",
[Name, Vhost]),
{error, not_empty};
false ->
- rabbit_log:warning("Queue ~s in vhost ~s has its master node is down and "
+ rabbit_log:warning("Queue ~s in vhost ~ts has its master node is down and "
"no mirrors available or eligible for promotion. "
"Forcing queue deletion.",
[Name, Vhost]),
@@ -141,7 +141,7 @@ recover(VHost, Queues) ->
not lists:member(amqqueue:get_name(Q), RecoveredNames)],
{RecoveredQs, FailedQueues};
{error, Reason} ->
- rabbit_log:error("Failed to start queue supervisor for vhost '~s': ~s", [VHost, Reason]),
+ rabbit_log:error("Failed to start queue supervisor for vhost '~ts': ~s", [VHost, Reason]),
throw({error, Reason})
end.
diff --git a/deps/rabbit/src/rabbit_classic_queue_index_v2.erl b/deps/rabbit/src/rabbit_classic_queue_index_v2.erl
index 6f1a4885cd..7e3d1d1200 100644
--- a/deps/rabbit/src/rabbit_classic_queue_index_v2.erl
+++ b/deps/rabbit/src/rabbit_classic_queue_index_v2.erl
@@ -265,7 +265,7 @@ recover(#resource{ virtual_host = VHost, name = QueueName } = Name, Terms,
State = recover_segments(State0, Terms, IsMsgStoreClean,
ContainsCheckFun, OnSyncFun, OnSyncMsgFun,
CountersRef, Context),
- rabbit_log:warning("Queue ~s in vhost ~s dropped ~b/~b/~b persistent messages "
+ rabbit_log:warning("Queue ~s in vhost ~ts dropped ~b/~b/~b persistent messages "
"and ~b transient messages after unclean shutdown",
[QueueName, VHost,
counters:get(CountersRef, ?RECOVER_DROPPED_PERSISTENT_PER_VHOST),
@@ -445,7 +445,7 @@ recover_segment(State, ContainsCheckFun, StoreState0, CountersRef, Fd,
recover_index_v1_clean(State0 = #qi{ queue_name = Name }, Terms, IsMsgStoreClean,
ContainsCheckFun, OnSyncFun, OnSyncMsgFun) ->
#resource{virtual_host = VHost, name = QName} = Name,
- rabbit_log:info("Converting queue ~s in vhost ~s from v1 to v2 after clean shutdown", [QName, VHost]),
+ rabbit_log:info("Converting queue ~s in vhost ~ts from v1 to v2 after clean shutdown", [QName, VHost]),
{_, _, V1State} = rabbit_queue_index:recover(Name, Terms, IsMsgStoreClean,
ContainsCheckFun, OnSyncFun, OnSyncMsgFun,
convert),
@@ -454,7 +454,7 @@ recover_index_v1_clean(State0 = #qi{ queue_name = Name }, Terms, IsMsgStoreClean
%% share code with dirty recovery.
CountersRef = counters:new(?RECOVER_COUNTER_SIZE, []),
State = recover_index_v1_common(State0, V1State, CountersRef),
- rabbit_log:info("Queue ~s in vhost ~s converted ~b total messages from v1 to v2",
+ rabbit_log:info("Queue ~s in vhost ~ts converted ~b total messages from v1 to v2",
[QName, VHost, counters:get(CountersRef, ?RECOVER_COUNT)]),
State.
@@ -462,7 +462,7 @@ recover_index_v1_dirty(State0 = #qi{ queue_name = Name }, Terms, IsMsgStoreClean
ContainsCheckFun, OnSyncFun, OnSyncMsgFun,
CountersRef) ->
#resource{virtual_host = VHost, name = QName} = Name,
- rabbit_log:info("Converting queue ~s in vhost ~s from v1 to v2 after unclean shutdown", [QName, VHost]),
+ rabbit_log:info("Converting queue ~s in vhost ~ts from v1 to v2 after unclean shutdown", [QName, VHost]),
%% We ignore the count and bytes returned here because we cannot trust
%% rabbit_queue_index: it has a bug that may lead to more bytes being
%% returned than it really has.
@@ -473,7 +473,7 @@ recover_index_v1_dirty(State0 = #qi{ queue_name = Name }, Terms, IsMsgStoreClean
ContainsCheckFun, OnSyncFun, OnSyncMsgFun,
convert),
State = recover_index_v1_common(State0, V1State, CountersRef),
- rabbit_log:info("Queue ~s in vhost ~s converted ~b total messages from v1 to v2",
+ rabbit_log:info("Queue ~s in vhost ~ts converted ~b total messages from v1 to v2",
[QName, VHost, counters:get(CountersRef, ?RECOVER_COUNT)]),
State.
diff --git a/deps/rabbit/src/rabbit_connection_tracking.erl b/deps/rabbit/src/rabbit_connection_tracking.erl
index 9dc1f65521..db252a31a7 100644
--- a/deps/rabbit/src/rabbit_connection_tracking.erl
+++ b/deps/rabbit/src/rabbit_connection_tracking.erl
@@ -126,31 +126,31 @@ handle_cast({vhost_deleted, Details}) ->
%% Schedule vhost entry deletion, allowing time for connections to close
_ = timer:apply_after(?TRACKING_EXECUTION_TIMEOUT, ?MODULE,
delete_tracked_connection_vhost_entry, [VHost]),
- rabbit_log_connection:info("Closing all connections in vhost '~s' because it's being deleted", [VHost]),
+ rabbit_log_connection:info("Closing all connections in vhost '~ts' because it's being deleted", [VHost]),
shutdown_tracked_items(
rabbit_connection_tracking:list(VHost),
- rabbit_misc:format("vhost '~s' is deleted", [VHost]));
+ rabbit_misc:format("vhost '~ts' is deleted", [VHost]));
%% Note: under normal circumstances this will be called immediately
%% after the vhost_deleted above. Therefore we should be careful about
%% what we log and be more defensive.
handle_cast({vhost_down, Details}) ->
VHost = pget(name, Details),
Node = pget(node, Details),
- rabbit_log_connection:info("Closing all connections in vhost '~s' on node '~s'"
+ rabbit_log_connection:info("Closing all connections in vhost '~ts' on node '~ts'"
" because the vhost is stopping",
[VHost, Node]),
shutdown_tracked_items(
rabbit_connection_tracking:list_on_node(Node, VHost),
- rabbit_misc:format("vhost '~s' is down", [VHost]));
+ rabbit_misc:format("vhost '~ts' is down", [VHost]));
handle_cast({user_deleted, Details}) ->
Username = pget(name, Details),
%% Schedule user entry deletion, allowing time for connections to close
_ = timer:apply_after(?TRACKING_EXECUTION_TIMEOUT, ?MODULE,
delete_tracked_connection_user_entry, [Username]),
- rabbit_log_connection:info("Closing all connections from user '~s' because it's being deleted", [Username]),
+ rabbit_log_connection:info("Closing all connections from user '~ts' because it's being deleted", [Username]),
shutdown_tracked_items(
rabbit_connection_tracking:list_of_user(Username),
- rabbit_misc:format("user '~s' is deleted", [Username]));
+ rabbit_misc:format("user '~ts' is deleted", [Username]));
%% A node had been deleted from the cluster.
handle_cast({node_deleted, Details}) ->
case rabbit_feature_flags:is_enabled(tracking_records_in_ets) of
@@ -158,7 +158,7 @@ handle_cast({node_deleted, Details}) ->
ok;
false ->
Node = pget(node, Details),
- rabbit_log_connection:info("Node '~s' was removed from the cluster, deleting its connection tracking tables...", [Node]),
+ rabbit_log_connection:info("Node '~ts' was removed from the cluster, deleting its connection tracking tables...", [Node]),
delete_tracked_connections_table_for_node(Node),
delete_per_vhost_tracked_connections_table_for_node(Node),
delete_per_user_tracked_connections_table_for_node(Node)
@@ -411,18 +411,18 @@ delete_per_user_tracked_connections_table_for_node(Node) ->
-spec tracked_connection_table_name_for(node()) -> atom().
tracked_connection_table_name_for(Node) ->
- list_to_atom(rabbit_misc:format("tracked_connection_on_node_~s", [Node])).
+ list_to_atom(rabbit_misc:format("tracked_connection_on_node_~ts", [Node])).
-spec tracked_connection_per_vhost_table_name_for(node()) -> atom().
tracked_connection_per_vhost_table_name_for(Node) ->
- list_to_atom(rabbit_misc:format("tracked_connection_per_vhost_on_node_~s", [Node])).
+ list_to_atom(rabbit_misc:format("tracked_connection_per_vhost_on_node_~ts", [Node])).
-spec tracked_connection_per_user_table_name_for(node()) -> atom().
tracked_connection_per_user_table_name_for(Node) ->
list_to_atom(rabbit_misc:format(
- "tracked_connection_table_per_user_on_node_~s", [Node])).
+ "tracked_connection_table_per_user_on_node_~ts", [Node])).
-spec get_all_tracked_connection_table_names_for_node(node()) -> [atom()].
diff --git a/deps/rabbit/src/rabbit_direct.erl b/deps/rabbit/src/rabbit_direct.erl
index f05daac462..7112426cab 100644
--- a/deps/rabbit/src/rabbit_direct.erl
+++ b/deps/rabbit/src/rabbit_direct.erl
@@ -141,8 +141,8 @@ is_vhost_alive(VHost, {Username, _Password}, Pid) ->
false ->
rabbit_log_connection:error(
"Error on Direct connection ~p~n"
- "access to vhost '~s' refused for user '~s': "
- "vhost '~s' is down",
+ "access to vhost '~ts' refused for user '~s': "
+ "vhost '~ts' is down",
[Pid, VHost, PrintedUsername, VHost]),
false
end.
@@ -157,7 +157,7 @@ is_over_vhost_connection_limit(VHost, {Username, _Password}, Pid) ->
{true, Limit} ->
rabbit_log_connection:error(
"Error on Direct connection ~p~n"
- "access to vhost '~s' refused for user '~s': "
+ "access to vhost '~ts' refused for user '~s': "
"vhost connection limit (~p) is reached",
[Pid, VHost, PrintedUsername, Limit]),
true
@@ -165,7 +165,7 @@ is_over_vhost_connection_limit(VHost, {Username, _Password}, Pid) ->
throw:{error, {no_such_vhost, VHost}} ->
rabbit_log_connection:error(
"Error on Direct connection ~p~n"
- "vhost ~s not found", [Pid, VHost]),
+ "vhost ~ts not found", [Pid, VHost]),
true
end.
diff --git a/deps/rabbit/src/rabbit_disk_monitor.erl b/deps/rabbit/src/rabbit_disk_monitor.erl
index 32ebbc4795..eb9eb65e4e 100644
--- a/deps/rabbit/src/rabbit_disk_monitor.erl
+++ b/deps/rabbit/src/rabbit_disk_monitor.erl
@@ -192,7 +192,7 @@ handle_info({'EXIT', Port, Reason}, #state{port=Port}=State) ->
{stop, {port_died, Reason}, State#state{port=not_used}};
handle_info(Info, State) ->
- rabbit_log:debug("~p unhandled msg: ~p", [?MODULE, Info]),
+ rabbit_log:debug("~tp unhandled msg: ~tp", [?MODULE, Info]),
{noreply, State}.
terminate(_Reason, _State) ->
@@ -207,22 +207,25 @@ code_change(_OldVsn, State, _Extra) ->
start_portprogram() ->
Args = ["-s", "rabbit_disk_monitor"],
- Opts = [stderr_to_stdout, stream, {args, Args}],
+ Opts = [stream, stderr_to_stdout, {args, Args}],
erlang:open_port({spawn_executable, "/bin/sh"}, Opts).
run_port_cmd(Cmd0, Port) ->
%% Insert a carriage return, ^M or ASCII 13, after the command,
%% to indicate end of output
- Cmd = io_lib:format("(~s\n) </dev/null; echo \"\^M\"\n", [Cmd0]),
- Port ! {self(), {command, [Cmd, 10]}}, % The 10 at the end is a newline
+ Cmd1 = io_lib:format("~ts < /dev/null; echo \"\^M\"~n", [Cmd0]),
+ Cmd2 = rabbit_data_coercion:to_utf8_binary(Cmd1),
+ Port ! {self(), {command, [Cmd2, 10]}}, % The 10 at the end is a newline
get_reply(Port, []).
get_reply(Port, O) ->
receive
{Port, {data, N}} ->
case newline(N, O) of
- {ok, Str} -> Str;
- {more, Acc} -> get_reply(Port, Acc)
+ {ok, Str} ->
+ Str;
+ {more, Acc} ->
+ get_reply(Port, Acc)
end;
{'EXIT', Port, Reason} ->
exit({port_died, Reason})
@@ -266,7 +269,7 @@ set_max_check_interval(MaxInterval, State) ->
set_disk_limits(State, Limit0) ->
Limit = interpret_limit(Limit0),
State1 = State#state { limit = Limit },
- rabbit_log:info("Disk free limit set to ~pMB",
+ rabbit_log:info("Disk free limit set to ~bMB",
[trunc(Limit / 1000000)]),
ets:insert(?ETS_NAME, {disk_free_limit, Limit}),
internal_update(State1).
@@ -294,10 +297,10 @@ internal_update(State = #state{limit = Limit,
get_disk_free(Dir, {unix, Sun}, Port)
when Sun =:= sunos; Sun =:= sunos4; Sun =:= solaris ->
Df = find_cmd("df"),
- parse_free_unix(run_port_cmd(Df ++ " -k " ++ Dir, Port));
+ parse_free_unix(run_port_cmd(Df ++ " -k '" ++ Dir ++ "'", Port));
get_disk_free(Dir, {unix, _}, Port) ->
Df = find_cmd("df"),
- parse_free_unix(run_port_cmd(Df ++ " -kP " ++ Dir, Port));
+ parse_free_unix(run_port_cmd(Df ++ " -kP '" ++ Dir ++ "'", Port));
get_disk_free(Dir, {win32, _}, not_used) ->
% Dir:
% "c:/Users/username/AppData/Roaming/RabbitMQ/db/rabbit2@username-z01-mnesia"
@@ -305,7 +308,7 @@ get_disk_free(Dir, {win32, _}, not_used) ->
error ->
rabbit_log:warning("Expected the mnesia directory absolute "
"path to start with a drive letter like "
- "'C:'. The path is: '~p'", [Dir]),
+ "'C:'. The path is: '~tp'", [Dir]),
{ok, Free} = win32_get_disk_free_dir(Dir),
Free;
DriveLetter ->
@@ -392,14 +395,14 @@ interpret_limit(Absolute) ->
case rabbit_resource_monitor_misc:parse_information_unit(Absolute) of
{ok, ParsedAbsolute} -> ParsedAbsolute;
{error, parse_error} ->
- rabbit_log:error("Unable to parse disk_free_limit value ~p",
+ rabbit_log:error("Unable to parse disk_free_limit value ~tp",
[Absolute]),
?DEFAULT_DISK_FREE_LIMIT
end.
emit_update_info(StateStr, CurrentFree, Limit) ->
rabbit_log:info(
- "Free disk space is ~s. Free bytes: ~p. Limit: ~p",
+ "Free disk space is ~s. Free bytes: ~b. Limit: ~b",
[StateStr, CurrentFree, Limit]).
start_timer(State) ->
@@ -431,7 +434,7 @@ enable(#state{dir = Dir,
start_timer(set_disk_limits(State, Limit));
Err ->
rabbit_log:error("Free disk space monitor encountered an error "
- "(e.g. failed to parse output from OS tools): ~p, retries left: ~b",
+ "(e.g. failed to parse output from OS tools): ~tp, retries left: ~b",
[Err, Retries]),
erlang:send_after(Interval, self(), try_enable),
State#state{enabled = false}
@@ -450,6 +453,6 @@ run_os_cmd(Cmd) ->
CmdResult
after 5000 ->
exit(CmdPid, kill),
- rabbit_log:error("Command timed out: '~s'", [Cmd]),
+ rabbit_log:error("Command timed out: '~ts'", [Cmd]),
{error, timeout}
end.
diff --git a/deps/rabbit/src/rabbit_logger_exchange_h.erl b/deps/rabbit/src/rabbit_logger_exchange_h.erl
index 82ef31570e..0d9eec9ad8 100644
--- a/deps/rabbit/src/rabbit_logger_exchange_h.erl
+++ b/deps/rabbit/src/rabbit_logger_exchange_h.erl
@@ -131,11 +131,11 @@ setup_proc(
case declare_exchange(Config) of
ok ->
?LOG_INFO(
- "Logging to exchange '~s' in vhost '~s' ready", [Name, VHost],
+ "Logging to exchange '~s' in vhost '~ts' ready", [Name, VHost],
#{domain => ?RMQLOG_DOMAIN_GLOBAL});
error ->
?LOG_DEBUG(
- "Logging to exchange '~s' in vhost '~s' not ready, "
+ "Logging to exchange '~s' in vhost '~ts' not ready, "
"trying again in ~b second(s)",
[Name, VHost, ?DECL_EXCHANGE_INTERVAL_SECS],
#{domain => ?RMQLOG_DOMAIN_GLOBAL}),
@@ -155,14 +155,14 @@ declare_exchange(
Exchange, topic, true, false, true, [],
?INTERNAL_USER),
?LOG_DEBUG(
- "Declared exchange '~s' in vhost '~s'",
+ "Declared exchange '~s' in vhost '~ts'",
[Name, VHost],
#{domain => ?RMQLOG_DOMAIN_GLOBAL}),
ok
catch
Class:Reason ->
?LOG_DEBUG(
- "Could not declare exchange '~s' in vhost '~s', "
+ "Could not declare exchange '~s' in vhost '~ts', "
"reason: ~0p:~0p",
[Name, VHost, Class, Reason],
#{domain => ?RMQLOG_DOMAIN_GLOBAL}),
@@ -176,6 +176,6 @@ unconfigure_exchange(
Pid ! stop,
rabbit_exchange:delete(Exchange, false, ?INTERNAL_USER),
?LOG_INFO(
- "Logging to exchange '~s' in vhost '~s' disabled",
+ "Logging to exchange '~s' in vhost '~ts' disabled",
[Name, VHost],
#{domain => ?RMQLOG_DOMAIN_GLOBAL}).
diff --git a/deps/rabbit/src/rabbit_msg_store.erl b/deps/rabbit/src/rabbit_msg_store.erl
index 6229566c64..5f8601bad8 100644
--- a/deps/rabbit/src/rabbit_msg_store.erl
+++ b/deps/rabbit/src/rabbit_msg_store.erl
@@ -991,7 +991,7 @@ terminate(_Reason, State = #msstate { index_state = IndexState,
flying_ets = FlyingEts,
clients = Clients,
dir = Dir }) ->
- rabbit_log:info("Stopping message store for directory '~s'", [Dir]),
+ rabbit_log:info("Stopping message store for directory '~ts'", [Dir]),
%% stop the gc first, otherwise it could be working and we pull
%% out the ets tables from under it.
ok = rabbit_msg_store_gc:stop(GCPid),
@@ -1006,7 +1006,7 @@ terminate(_Reason, State = #msstate { index_state = IndexState,
ok -> ok;
{error, FSErr} ->
rabbit_log:error("Unable to store file summary"
- " for vhost message store for directory ~p~n"
+ " for vhost message store for directory ~tp~n"
"Error: ~p",
[Dir, FSErr])
end,
@@ -1016,11 +1016,11 @@ terminate(_Reason, State = #msstate { index_state = IndexState,
case store_recovery_terms([{client_refs, maps:keys(Clients)},
{index_module, IndexModule}], Dir) of
ok ->
- rabbit_log:info("Message store for directory '~s' is stopped", [Dir]),
+ rabbit_log:info("Message store for directory '~ts' is stopped", [Dir]),
ok;
{error, RTErr} ->
rabbit_log:error("Unable to save message store recovery terms"
- " for directory ~p~nError: ~p",
+ " for directory ~tp~nError: ~p",
[Dir, RTErr])
end,
State3 #msstate { index_state = undefined,
@@ -1773,7 +1773,7 @@ build_index(false, {MsgRefDeltaGen, MsgRefDeltaGenInit},
build_index_worker(Gatherer, State = #msstate { dir = Dir },
Left, File, Files) ->
FileName = filenum_to_name(File),
- rabbit_log:debug("Rebuilding message location index from ~p (~B file(s) remaining)",
+ rabbit_log:debug("Rebuilding message location index from ~ts (~B file(s) remaining)",
[form_filename(Dir, FileName), length(Files)]),
{ok, Messages, FileSize} =
scan_file_for_valid_messages(Dir, FileName),
diff --git a/deps/rabbit/src/rabbit_prelaunch_logging.erl b/deps/rabbit/src/rabbit_prelaunch_logging.erl
index 844d3106eb..619fa59d8b 100644
--- a/deps/rabbit/src/rabbit_prelaunch_logging.erl
+++ b/deps/rabbit/src/rabbit_prelaunch_logging.erl
@@ -521,7 +521,7 @@ configure_logger(Context) ->
%% IDs are assigned to handlers.
Handlers = create_logger_handlers_conf(LogConfig4),
?LOG_DEBUG(
- "Logging: logger handlers:~n ~p", [Handlers],
+ "Logging: logger handlers:~n ~tp", [Handlers],
#{domain => ?RMQLOG_DOMAIN_PRELAUNCH}),
%% We can now install the new handlers. The function takes care of
diff --git a/deps/rabbit/src/rabbit_queue_index.erl b/deps/rabbit/src/rabbit_queue_index.erl
index 052ea7f9c9..952c68147e 100644
--- a/deps/rabbit/src/rabbit_queue_index.erl
+++ b/deps/rabbit/src/rabbit_queue_index.erl
@@ -697,7 +697,7 @@ init_dirty(CleanShutdown, ContainsCheckFun, State, Context) ->
%% the process of converting from v2 to v1.
[_|_] ->
#resource{virtual_host = VHost, name = QName} = State2#qistate.queue_name,
- rabbit_log:info("Queue ~s in vhost ~s recovered ~b total messages before resuming convert",
+ rabbit_log:info("Queue ~s in vhost ~ts recovered ~b total messages before resuming convert",
[QName, VHost, Count]),
CountersRef = counters:new(?RECOVER_COUNTER_SIZE, []),
State3 = recover_index_v2_dirty(State2, ContainsCheckFun, CountersRef),
@@ -715,14 +715,14 @@ recover_index_v2_dirty(State0 = #qistate { queue_name = Name,
on_sync_msg = OnSyncMsgFun },
ContainsCheckFun, CountersRef) ->
#resource{virtual_host = VHost, name = QName} = Name,
- rabbit_log:info("Converting queue ~s in vhost ~s from v2 to v1 after unclean shutdown", [QName, VHost]),
+ rabbit_log:info("Converting queue ~s in vhost ~ts from v2 to v1 after unclean shutdown", [QName, VHost]),
%% We cannot use the counts/bytes because some messages may be in both
%% the v1 and v2 indexes after a crash.
{_, _, V2State} = rabbit_classic_queue_index_v2:recover(Name, non_clean_shutdown, true,
ContainsCheckFun, OnSyncFun, OnSyncMsgFun,
convert),
State = recover_index_v2_common(State0, V2State, CountersRef),
- rabbit_log:info("Queue ~s in vhost ~s converted ~b total messages from v2 to v1",
+ rabbit_log:info("Queue ~s in vhost ~ts converted ~b total messages from v2 to v1",
[QName, VHost, counters:get(CountersRef, ?RECOVER_COUNT)]),
State.
diff --git a/deps/rabbit/src/rabbit_ra_systems.erl b/deps/rabbit/src/rabbit_ra_systems.erl
index ddab037b06..9ecfe16092 100644
--- a/deps/rabbit/src/rabbit_ra_systems.erl
+++ b/deps/rabbit/src/rabbit_ra_systems.erl
@@ -44,25 +44,25 @@ all_ra_systems() ->
ensure_ra_system_started(RaSystem) ->
RaSystemConfig = get_config(RaSystem),
?LOG_DEBUG(
- "Starting Ra system called \"~s\" with configuration:~n~p",
+ "Starting Ra system called \"~ts\" with configuration:~n~tp",
[RaSystem, RaSystemConfig],
#{domain => ?RMQLOG_DOMAIN_GLOBAL}),
case ra_system:start(RaSystemConfig) of
{ok, _} ->
?LOG_DEBUG(
- "Ra system \"~s\" ready",
+ "Ra system \"~ts\" ready",
[RaSystem],
#{domain => ?RMQLOG_DOMAIN_GLOBAL}),
ok;
{error, {already_started, _}} ->
?LOG_DEBUG(
- "Ra system \"~s\" ready",
+ "Ra system \"~ts\" ready",
[RaSystem],
#{domain => ?RMQLOG_DOMAIN_GLOBAL}),
ok;
Error ->
?LOG_ERROR(
- "Failed to start Ra system \"~s\": ~p",
+ "Failed to start Ra system \"~ts\": ~tp",
[RaSystem, Error],
#{domain => ?RMQLOG_DOMAIN_GLOBAL}),
throw(Error)
diff --git a/deps/rabbit/src/rabbit_reader.erl b/deps/rabbit/src/rabbit_reader.erl
index 8d21f1ed31..903c14978a 100644
--- a/deps/rabbit/src/rabbit_reader.erl
+++ b/deps/rabbit/src/rabbit_reader.erl
@@ -357,11 +357,11 @@ start_connection(Parent, HelperSup, Deb, Sock) ->
%% connection was closed cleanly by the client
#v1{connection = #connection{user = #user{username = Username},
vhost = VHost}} ->
- rabbit_log_connection:info("closing AMQP connection ~p (~s, vhost: '~s', user: '~s')",
+ rabbit_log_connection:info("closing AMQP connection ~p (~ts, vhost: '~ts', user: '~ts')",
[self(), dynamic_connection_name(Name), VHost, Username]);
%% just to be more defensive
_ ->
- rabbit_log_connection:info("closing AMQP connection ~p (~s)",
+ rabbit_log_connection:info("closing AMQP connection ~p (~ts)",
[self(), dynamic_connection_name(Name)])
end
catch
@@ -417,7 +417,7 @@ log_connection_exception(Severity, Name, {connection_closed_abruptly,
#v1{connection = #connection{user = #user{username = Username},
vhost = VHost}}}) ->
log_connection_exception_with_severity(Severity,
- "closing AMQP connection ~p (~s, vhost: '~s', user: '~s'):~nclient unexpectedly closed TCP connection",
+ "closing AMQP connection ~p (~ts, vhost: '~ts', user: '~ts'):~nclient unexpectedly closed TCP connection",
[self(), Name, VHost, Username]);
%% when client abruptly closes connection before connection.open/authentication/authorization
%% succeeded, don't log username and vhost as 'none'
@@ -746,8 +746,8 @@ wait_for_channel_termination(N, TimerRef,
wait_for_channel_termination(N-1, TimerRef, State1);
{_, uncontrolled} ->
rabbit_log_connection:error(
- "Error on AMQP connection ~p (~s, vhost: '~s',"
- " user: '~s', state: ~p), channel ~p:"
+ "Error on AMQP connection ~p (~ts, vhost: '~ts',"
+ " user: '~ts', state: ~tp), channel ~p:"
"error while terminating:~n~p",
[self(), ConnName, VHost, User#user.username,
CS, Channel, Reason]),
@@ -788,8 +788,8 @@ log_hard_error(#v1{connection_state = CS,
user = User,
vhost = VHost}}, Channel, Reason) ->
rabbit_log_connection:error(
- "Error on AMQP connection ~p (~s, vhost: '~s',"
- " user: '~s', state: ~p), channel ~p:~n ~s",
+ "Error on AMQP connection ~p (~s, vhost: '~ts',"
+ " user: '~ts', state: ~tp), channel ~tp:~n ~ts",
[self(), ConnName, VHost, User#user.username, CS, Channel, format_hard_error(Reason)]).
handle_exception(State = #v1{connection_state = closed}, Channel, Reason) ->
@@ -1248,7 +1248,7 @@ handle_method0(#'connection.open'{virtual_host = VHost},
maybe_emit_stats(State1),
rabbit_log_connection:info(
"connection ~p (~s): "
- "user '~s' authenticated and granted access to vhost '~s'",
+ "user '~s' authenticated and granted access to vhost '~ts'",
[self(), dynamic_connection_name(ConnName), Username, VHost]),
State1;
handle_method0(#'connection.close'{}, State) when ?IS_RUNNING(State) ->
@@ -1315,8 +1315,8 @@ is_vhost_alive(VHostPath, User) ->
true -> ok;
false ->
rabbit_misc:protocol_error(internal_error,
- "access to vhost '~s' refused for user '~s': "
- "vhost '~s' is down",
+ "access to vhost '~ts' refused for user '~s': "
+ "vhost '~ts' is down",
[VHostPath, User#user.username, VHostPath])
end.
@@ -1324,12 +1324,12 @@ is_over_vhost_connection_limit(VHostPath, User) ->
try rabbit_vhost_limit:is_over_connection_limit(VHostPath) of
false -> ok;
{true, Limit} -> rabbit_misc:protocol_error(not_allowed,
- "access to vhost '~s' refused for user '~s': "
+ "access to vhost '~ts' refused for user '~s': "
"connection limit (~p) is reached",
[VHostPath, User#user.username, Limit])
catch
throw:{error, {no_such_vhost, VHostPath}} ->
- rabbit_misc:protocol_error(not_allowed, "vhost ~s not found", [VHostPath])
+ rabbit_misc:protocol_error(not_allowed, "vhost ~ts not found", [VHostPath])
end.
is_over_user_connection_limit(#user{username = Username}) ->
diff --git a/deps/rabbit/src/rabbit_recovery_terms.erl b/deps/rabbit/src/rabbit_recovery_terms.erl
index 358a668150..216cef1af0 100644
--- a/deps/rabbit/src/rabbit_recovery_terms.erl
+++ b/deps/rabbit/src/rabbit_recovery_terms.erl
@@ -44,7 +44,7 @@ start(VHost) ->
%% we can get here if a vhost is added and removed concurrently
%% e.g. some integration tests do it
{error, {no_such_vhost, VHost}} ->
- rabbit_log:error("Failed to start a recovery terms manager for vhost ~s: vhost no longer exists!",
+ rabbit_log:error("Failed to start a recovery terms manager for vhost ~ts: vhost no longer exists!",
[VHost])
end,
ok.
@@ -60,7 +60,7 @@ stop(VHost) ->
end;
%% see start/1
{error, {no_such_vhost, VHost}} ->
- rabbit_log:error("Failed to stop a recovery terms manager for vhost ~s: vhost no longer exists!",
+ rabbit_log:error("Failed to stop a recovery terms manager for vhost ~ts: vhost no longer exists!",
[VHost]),
ok
@@ -86,7 +86,7 @@ clear(VHost) ->
dets:delete_all_objects(VHost)
%% see start/1
catch _:badarg ->
- rabbit_log:error("Failed to clear recovery terms for vhost ~s: table no longer exists!",
+ rabbit_log:error("Failed to clear recovery terms for vhost ~ts: table no longer exists!",
[VHost]),
ok
end,
@@ -221,7 +221,7 @@ flush(VHost) ->
dets:sync(VHost)
%% see clear/1
catch _:badarg ->
- rabbit_log:error("Failed to sync recovery terms table for vhost ~s: the table no longer exists!",
+ rabbit_log:error("Failed to sync recovery terms table for vhost ~ts: the table no longer exists!",
[VHost]),
ok
end.
@@ -234,7 +234,7 @@ close_table(VHost) ->
ok = dets:close(VHost)
%% see clear/1
catch _:badarg ->
- rabbit_log:error("Failed to close recovery terms table for vhost ~s: the table no longer exists!",
+ rabbit_log:error("Failed to close recovery terms table for vhost ~ts: the table no longer exists!",
[VHost]),
ok
end.
diff --git a/deps/rabbit/src/rabbit_runtime_parameters.erl b/deps/rabbit/src/rabbit_runtime_parameters.erl
index 00f29c3b14..9e34c33cdf 100644
--- a/deps/rabbit/src/rabbit_runtime_parameters.erl
+++ b/deps/rabbit/src/rabbit_runtime_parameters.erl
@@ -100,7 +100,7 @@ parse_set_global(Name, String, ActingUser) ->
set_global(Name, Term, ActingUser) ->
NameAsAtom = rabbit_data_coercion:to_atom(Name),
- rabbit_log:debug("Setting global parameter '~s' to ~p", [NameAsAtom, Term]),
+ rabbit_log:debug("Setting global parameter '~ts' to ~tp", [NameAsAtom, Term]),
mnesia_update(NameAsAtom, Term),
event_notify(parameter_set, none, global, [{name, NameAsAtom},
{value, Term},
@@ -121,8 +121,8 @@ set_any(VHost, Component, Name, Term, User) ->
end.
set_any0(VHost, Component, Name, Term, User) ->
- rabbit_log:debug("Asked to set or update runtime parameter '~s' in vhost '~s' "
- "for component '~s', value: ~p",
+ rabbit_log:debug("Asked to set or update runtime parameter '~ts' in vhost '~ts' "
+ "for component '~ts', value: ~tp",
[Name, VHost, Component, Term]),
case lookup_component(Component) of
{ok, Mod} ->
@@ -418,7 +418,7 @@ lookup_component(Component) ->
case rabbit_registry:lookup_module(
runtime_parameter, rabbit_data_coercion:to_atom(Component)) of
{error, not_found} -> {errors,
- [{"component ~s not found", [Component]}]};
+ [{"component ~ts not found", [Component]}]};
{ok, Module} -> {ok, Module}
end.
diff --git a/deps/rabbit/src/rabbit_trace.erl b/deps/rabbit/src/rabbit_trace.erl
index b8e560da95..5b766028e9 100644
--- a/deps/rabbit/src/rabbit_trace.erl
+++ b/deps/rabbit/src/rabbit_trace.erl
@@ -76,10 +76,10 @@ tap_out({#resource{name = QName, virtual_host = VHost},
start(VHost) ->
case lists:member(VHost, vhosts_with_tracing_enabled()) of
true ->
- rabbit_log:info("Tracing is already enabled for vhost '~s'", [VHost]),
+ rabbit_log:info("Tracing is already enabled for vhost '~ts'", [VHost]),
ok;
false ->
- rabbit_log:info("Enabling tracing for vhost '~s'", [VHost]),
+ rabbit_log:info("Enabling tracing for vhost '~ts'", [VHost]),
update_config(fun (VHosts) ->
lists:usort([VHost | VHosts])
end)
@@ -90,10 +90,10 @@ start(VHost) ->
stop(VHost) ->
case lists:member(VHost, vhosts_with_tracing_enabled()) of
true ->
- rabbit_log:info("Disabling tracing for vhost '~s'", [VHost]),
+ rabbit_log:info("Disabling tracing for vhost '~ts'", [VHost]),
update_config(fun (VHosts) -> VHosts -- [VHost] end);
false ->
- rabbit_log:info("Tracing is already disabled for vhost '~s'", [VHost]),
+ rabbit_log:info("Tracing is already disabled for vhost '~ts'", [VHost]),
ok
end.
diff --git a/deps/rabbit/src/rabbit_variable_queue.erl b/deps/rabbit/src/rabbit_variable_queue.erl
index 9f8c2336b0..f55ca0f0c8 100644
--- a/deps/rabbit/src/rabbit_variable_queue.erl
+++ b/deps/rabbit/src/rabbit_variable_queue.erl
@@ -522,7 +522,7 @@ stop(VHost) ->
ok = rabbit_classic_queue_index_v2:stop(VHost).
start_msg_store(VHost, Refs, StartFunState) when is_list(Refs); Refs == undefined ->
- rabbit_log:info("Starting message stores for vhost '~s'", [VHost]),
+ rabbit_log:info("Starting message stores for vhost '~ts'", [VHost]),
do_start_msg_store(VHost, ?TRANSIENT_MSG_STORE, undefined, ?EMPTY_START_FUN_STATE),
do_start_msg_store(VHost, ?PERSISTENT_MSG_STORE, Refs, StartFunState),
ok.
@@ -530,13 +530,13 @@ start_msg_store(VHost, Refs, StartFunState) when is_list(Refs); Refs == undefine
do_start_msg_store(VHost, Type, Refs, StartFunState) ->
case rabbit_vhost_msg_store:start(VHost, Type, Refs, StartFunState) of
{ok, _} ->
- rabbit_log:info("Started message store of type ~s for vhost '~s'", [abbreviated_type(Type), VHost]);
+ rabbit_log:info("Started message store of type ~s for vhost '~ts'", [abbreviated_type(Type), VHost]);
{error, {no_such_vhost, VHost}} = Err ->
- rabbit_log:error("Failed to start message store of type ~s for vhost '~s': the vhost no longer exists!",
+ rabbit_log:error("Failed to start message store of type ~s for vhost '~ts': the vhost no longer exists!",
[Type, VHost]),
exit(Err);
{error, Error} ->
- rabbit_log:error("Failed to start message store of type ~s for vhost '~s': ~p",
+ rabbit_log:error("Failed to start message store of type ~s for vhost '~ts': ~p",
[Type, VHost, Error]),
exit({error, Error})
end.
@@ -1150,7 +1150,7 @@ convert_from_v1_to_v2(State0 = #vqstate{ index_mod = rabbit_queue_index,
store_state = V2Store0 }) ->
{QueueName, MsgIdxOnDiskFun, MsgAndIdxOnDiskFun} = rabbit_queue_index:init_args(V1Index),
#resource{virtual_host = VHost, name = QName} = QueueName,
- rabbit_log:info("Converting running queue ~s in vhost ~s from v1 to v2", [QName, VHost]),
+ rabbit_log:info("Converting running queue ~ts in vhost ~ts from v1 to v2", [QName, VHost]),
State = convert_from_v1_to_v2_in_memory(State0),
V2Index0 = rabbit_classic_queue_index_v2:init_for_conversion(QueueName, MsgIdxOnDiskFun, MsgAndIdxOnDiskFun),
%% We do not need to init the v2 per-queue store because we already did so in the queue init.
@@ -1163,7 +1163,7 @@ convert_from_v1_to_v2(State0 = #vqstate{ index_mod = rabbit_queue_index,
fun (_, FunState) -> {write, FunState} end),
%% We have already deleted segments files but not the journal.
rabbit_queue_index:delete_journal(V1Index),
- rabbit_log:info("Queue ~s in vhost ~s converted ~b total messages from v1 to v2",
+ rabbit_log:info("Queue ~ts in vhost ~ts converted ~b total messages from v1 to v2",
[QName, VHost, counters:get(CountersRef, ?CONVERT_COUNT)]),
State#vqstate{ index_mod = rabbit_classic_queue_index_v2,
index_state = V2Index,
@@ -1273,7 +1273,7 @@ convert_from_v1_to_v2_loop(QueueName, V1Index0, V2Index0, V2Store0,
%% Log some progress to keep the user aware of what's going on, as moving
%% embedded messages can take quite some time.
#resource{virtual_host = VHost, name = Name} = QueueName,
- rabbit_log:info("Queue ~s in vhost ~s converted ~b messages from v1 to v2",
+ rabbit_log:info("Queue ~ts in vhost ~ts converted ~b messages from v1 to v2",
[Name, VHost, length(Messages)]),
convert_from_v1_to_v2_loop(QueueName, V1Index, V2Index, V2Store, Counters, UpSeqId, HiSeqId, SkipFun).
@@ -1284,7 +1284,7 @@ convert_from_v2_to_v1(State0 = #vqstate{ index_mod = rabbit_classic_queue_inde
index_state = V2Index }) ->
{QueueName, MsgIdxOnDiskFun, MsgAndIdxOnDiskFun} = rabbit_classic_queue_index_v2:init_args(V2Index),
#resource{virtual_host = VHost, name = QName} = QueueName,
- rabbit_log:info("Converting running queue ~s in vhost ~s from v2 to v1", [QName, VHost]),
+ rabbit_log:info("Converting running queue ~ts in vhost ~ts from v2 to v1", [QName, VHost]),
State = convert_from_v2_to_v1_in_memory(State0),
%% We may have read from the per-queue store state and opened FDs.
#vqstate{ store_state = V2Store0 } = State,
@@ -1296,7 +1296,7 @@ convert_from_v2_to_v1(State0 = #vqstate{ index_mod = rabbit_classic_queue_inde
LoSeqId, HiSeqId,
%% Write all messages.
fun (_, FunState) -> {write, FunState} end),
- rabbit_log:info("Queue ~s in vhost ~s converted ~b total messages from v2 to v1",
+ rabbit_log:info("Queue ~ts in vhost ~ts converted ~b total messages from v2 to v1",
[QName, VHost, counters:get(CountersRef, ?CONVERT_COUNT)]),
%% We have already closed the v2 index/store FDs when deleting the files.
State#vqstate{ index_mod = rabbit_queue_index,
@@ -1441,7 +1441,7 @@ convert_from_v2_to_v1_loop(QueueName, V1Index0, V2Index0, V2Store0,
%% Log some progress to keep the user aware of what's going on, as moving
%% embedded messages can take quite some time.
#resource{virtual_host = VHost, name = Name} = QueueName,
- rabbit_log:info("Queue ~s in vhost ~s converted ~b messages from v2 to v1",
+ rabbit_log:info("Queue ~ts in vhost ~ts converted ~b messages from v2 to v1",
[Name, VHost, length(Messages)]),
convert_from_v2_to_v1_loop(QueueName, V1Index, V2Index, V2Store, Counters, UpSeqId, HiSeqId, SkipFun).
@@ -3451,7 +3451,7 @@ migrate_queue({QueueName = #resource{virtual_host = VHost, name = Name},
RecoveryTerm},
OldStore, NewStore) ->
log_upgrade_verbose(
- "Migrating messages in queue ~s in vhost ~s to per-vhost message store",
+ "Migrating messages in queue ~ts in vhost ~ts to per-vhost message store",
[Name, VHost]),
OldStoreClient = get_global_store_client(OldStore),
NewStoreClient = get_per_vhost_store_client(QueueName, NewStore),
@@ -3479,7 +3479,7 @@ migrate_queue({QueueName = #resource{virtual_host = VHost, name = Name},
{persistent_ref, NewClientRef}),
rabbit_queue_index:update_recovery_term(QueueName, NewRecoveryTerm)
end,
- log_upgrade_verbose("Finished migrating queue ~s in vhost ~s", [Name, VHost]),
+ log_upgrade_verbose("Finished migrating queue ~ts in vhost ~ts", [Name, VHost]),
{QueueName, NewClientRef}.
migrate_message(MsgId, OldC, NewC) ->
diff --git a/deps/rabbit/src/rabbit_vhost.erl b/deps/rabbit/src/rabbit_vhost.erl
index 206a0d98a4..7d391a3dc3 100644
--- a/deps/rabbit/src/rabbit_vhost.erl
+++ b/deps/rabbit/src/rabbit_vhost.erl
@@ -52,7 +52,7 @@ recover() ->
recover(VHost) ->
VHostDir = msg_store_dir_path(VHost),
- rabbit_log:info("Making sure data directory '~ts' for vhost '~s' exists",
+ rabbit_log:info("Making sure data directory '~ts' for vhost '~ts' exists",
[VHostDir, VHost]),
VHostStubFile = filename:join(VHostDir, ".vhost"),
ok = rabbit_file:ensure_dir(VHostStubFile),
@@ -64,7 +64,7 @@ recover(VHost) ->
{Time, ok} = timer:tc(fun() ->
rabbit_binding:recover(rabbit_exchange:recover(VHost), QNames)
end),
- rabbit_log:debug("rabbit_binding:recover/2 for vhost ~s completed in ~fs", [VHost, Time/1000000]),
+ rabbit_log:debug("rabbit_binding:recover/2 for vhost ~ts completed in ~fs", [VHost, Time/1000000]),
ok = rabbit_amqqueue:start(Recovered),
%% Start queue mirrors.
@@ -95,7 +95,7 @@ ensure_config_file(VHost) ->
_ ->
?LEGACY_INDEX_SEGMENT_ENTRY_COUNT
end,
- rabbit_log:info("Setting segment_entry_count for vhost '~s' with ~b queues to '~b'",
+ rabbit_log:info("Setting segment_entry_count for vhost '~ts' with ~b queues to '~b'",
[VHost, length(QueueDirs), SegmentEntryCount]),
file:write_file(Path, io_lib:format(
"%% This file is auto-generated! Edit at your own risk!~n"
@@ -124,8 +124,8 @@ parse_tags(<<"">>) ->
parse_tags([]) ->
[];
parse_tags(Val) when is_binary(Val) ->
- SVal = rabbit_data_coercion:to_list(Val),
- [trim_tag(Tag) || Tag <- re:split(SVal, ",", [{return, list}])];
+ ValUnicode = rabbit_data_coercion:to_unicode_charlist(Val),
+ [trim_tag(Tag) || Tag <- re:split(ValUnicode, ",", [unicode, {return, list}])];
parse_tags(Val) when is_list(Val) ->
case hd(Val) of
Bin when is_binary(Bin) ->
@@ -136,7 +136,8 @@ parse_tags(Val) when is_list(Val) ->
[trim_tag(Tag) || Tag <- Val];
Int when is_integer(Int) ->
%% this is a string/charlist
- [trim_tag(Tag) || Tag <- re:split(Val, ",", [{return, list}])]
+ ValUnicode = rabbit_data_coercion:to_unicode_charlist(Val),
+ [trim_tag(Tag) || Tag <- re:split(ValUnicode, ",", [unicode, {return, list}])]
end.
-spec add(vhost:name(), rabbit_types:username()) ->
@@ -186,9 +187,9 @@ do_add(Name, Metadata, ActingUser) ->
case Description of
undefined ->
- rabbit_log:info("Adding vhost '~s' without a description", [Name]);
+ rabbit_log:info("Adding vhost '~ts' without a description", [Name]);
Description ->
- rabbit_log:info("Adding vhost '~s' (description: '~s', tags: ~p)",
+ rabbit_log:info("Adding vhost '~ts' (description: '~ts', tags: ~tp)",
[Name, Description, Tags])
end,
VHost = rabbit_misc:execute_mnesia_transaction(
@@ -196,7 +197,7 @@ do_add(Name, Metadata, ActingUser) ->
case mnesia:wread({rabbit_vhost, Name}) of
[] ->
Row = vhost:new(Name, [], Metadata),
- rabbit_log:debug("Inserting a virtual host record ~p", [Row]),
+ rabbit_log:debug("Inserting a virtual host record ~tp", [Row]),
ok = mnesia:write(rabbit_vhost, Row, write),
Row;
%% the vhost already exists
@@ -209,7 +210,7 @@ do_add(Name, Metadata, ActingUser) ->
(VHost1, false) ->
[begin
Resource = rabbit_misc:r(Name, exchange, ExchangeName),
- rabbit_log:debug("Will declare an exchange ~p", [Resource]),
+ rabbit_log:debug("Will declare an exchange ~tp", [Resource]),
_ = rabbit_exchange:declare(Resource, Type, true, false, Internal, [], ActingUser)
end || {ExchangeName, Type, Internal} <-
[{<<"">>, direct, false},
@@ -231,7 +232,7 @@ do_add(Name, Metadata, ActingUser) ->
{tags, Tags}]),
ok;
{error, Reason} ->
- Msg = rabbit_misc:format("failed to set up vhost '~s': ~p",
+ Msg = rabbit_misc:format("failed to set up vhost '~ts': ~tp",
[Name, Reason]),
{error, Msg}
end.
@@ -245,7 +246,7 @@ update(Name, Description, Tags, ActingUser) ->
{error, {no_such_vhost, Name}};
[VHost0] ->
VHost = vhost:merge_metadata(VHost0, #{description => Description, tags => Tags}),
- rabbit_log:debug("Updating a virtual host record ~p", [VHost]),
+ rabbit_log:debug("Updating a virtual host record ~tp", [VHost]),
ok = mnesia:write(rabbit_vhost, VHost, write),
rabbit_event:notify(vhost_updated, info(VHost)
++ [{user_who_performed_action, ActingUser},
@@ -264,7 +265,7 @@ delete(VHost, ActingUser) ->
%% process, which in turn results in further mnesia actions and
%% eventually the termination of that process. Exchange deletion causes
%% notifications which must be sent outside the TX
- rabbit_log:info("Deleting vhost '~s'", [VHost]),
+ rabbit_log:info("Deleting vhost '~ts'", [VHost]),
%% Clear the permissions first to prohibit new incoming connections when deleting a vhost
rabbit_misc:execute_mnesia_transaction(
with(VHost, fun () -> clear_permissions(VHost, ActingUser) end)),
@@ -300,7 +301,7 @@ put_vhost(Name, Description, Tags0, DefaultQueueType, Trace, Username) ->
Other -> Other
end,
ParsedTags = parse_tags(Tags),
- rabbit_log:debug("Parsed tags ~p to ~p", [Tags, ParsedTags]),
+ rabbit_log:debug("Parsed tags ~tp to ~tp", [Tags, ParsedTags]),
Result = case exists(Name) of
true ->
update(Name, Description, ParsedTags, Username);
@@ -397,16 +398,16 @@ vhost_down(VHost) ->
delete_storage(VHost) ->
VhostDir = msg_store_dir_path(VHost),
- rabbit_log:info("Deleting message store directory for vhost '~s' at '~s'", [VHost, VhostDir]),
+ rabbit_log:info("Deleting message store directory for vhost '~ts' at '~ts'", [VHost, VhostDir]),
%% Message store should be closed when vhost supervisor is closed.
case rabbit_file:recursive_delete([VhostDir]) of
ok -> ok;
{error, {_, enoent}} ->
%% a concurrent delete did the job for us
- rabbit_log:warning("Tried to delete storage directories for vhost '~s', it failed with an ENOENT", [VHost]),
+ rabbit_log:warning("Tried to delete storage directories for vhost '~ts', it failed with an ENOENT", [VHost]),
ok;
Other ->
- rabbit_log:warning("Tried to delete storage directories for vhost '~s': ~p", [VHost, Other]),
+ rabbit_log:warning("Tried to delete storage directories for vhost '~ts': ~tp", [VHost, Other]),
Other
end.
@@ -523,20 +524,20 @@ update_tags(VHostName, Tags, ActingUser) ->
R = rabbit_misc:execute_mnesia_transaction(fun() ->
update_tags(VHostName, ConvertedTags)
end),
- rabbit_log:info("Successfully set tags for virtual host '~s' to ~p", [VHostName, ConvertedTags]),
+ rabbit_log:info("Successfully set tags for virtual host '~ts' to ~tp", [VHostName, ConvertedTags]),
rabbit_event:notify(vhost_tags_set, [{name, VHostName},
{tags, ConvertedTags},
{user_who_performed_action, ActingUser}]),
R
catch
throw:{error, {no_such_vhost, _}} = Error ->
- rabbit_log:warning("Failed to set tags for virtual host '~s': the virtual host does not exist", [VHostName]),
+ rabbit_log:warning("Failed to set tags for virtual host '~ts': the virtual host does not exist", [VHostName]),
throw(Error);
throw:Error ->
- rabbit_log:warning("Failed to set tags for virtual host '~s': ~p", [VHostName, Error]),
+ rabbit_log:warning("Failed to set tags for virtual host '~ts': ~tp", [VHostName, Error]),
throw(Error);
exit:Error ->
- rabbit_log:warning("Failed to set tags for virtual host '~s': ~p", [VHostName, Error]),
+ rabbit_log:warning("Failed to set tags for virtual host '~ts': ~tp", [VHostName, Error]),
exit(Error)
end.
@@ -587,8 +588,13 @@ config_file_path(VHost) ->
filename:join(VHostDir, ".config").
-spec trim_tag(list() | binary() | atom()) -> atom().
-trim_tag(Val) ->
- rabbit_data_coercion:to_atom(string:trim(rabbit_data_coercion:to_list(Val))).
+trim_tag(Val) when is_atom(Val) ->
+ trim_tag(rabbit_data_coercion:to_binary(Val));
+trim_tag(Val) when is_list(Val) ->
+ trim_tag(rabbit_data_coercion:to_utf8_binary(Val));
+trim_tag(Val) when is_binary(Val) ->
+ ValTrimmed = string:trim(Val),
+ rabbit_data_coercion:to_atom(ValTrimmed).
%%----------------------------------------------------------------------------
@@ -602,7 +608,7 @@ i(tags, VHost) -> vhost:get_tags(VHost);
i(default_queue_type, VHost) -> vhost:get_default_queue_type(VHost);
i(metadata, VHost) -> vhost:get_metadata(VHost);
i(Item, VHost) ->
- rabbit_log:error("Don't know how to compute a virtual host info item '~s' for virtual host '~p'", [Item, VHost]),
+ rabbit_log:error("Don't know how to compute a virtual host info item '~ts' for virtual host '~tp'", [Item, VHost]),
throw({bad_argument, Item}).
-spec info(vhost:vhost() | vhost:name()) -> rabbit_types:infos().
diff --git a/deps/rabbit/src/rabbit_vhost_msg_store.erl b/deps/rabbit/src/rabbit_vhost_msg_store.erl
index 294ca7e9f9..9212884bea 100644
--- a/deps/rabbit/src/rabbit_vhost_msg_store.erl
+++ b/deps/rabbit/src/rabbit_vhost_msg_store.erl
@@ -25,7 +25,7 @@ start(VHost, Type, ClientRefs, StartupFunState) when is_list(ClientRefs);
%% we can get here if a vhost is added and removed concurrently
%% e.g. some integration tests do it
{error, {no_such_vhost, VHost}} = E ->
- rabbit_log:error("Failed to start a message store for vhost ~s: vhost no longer exists!",
+ rabbit_log:error("Failed to start a message store for vhost ~ts: vhost no longer exists!",
[VHost]),
E
end.
@@ -37,7 +37,7 @@ stop(VHost, Type) ->
ok = supervisor2:delete_child(VHostSup, Type);
%% see start/4
{error, {no_such_vhost, VHost}} ->
- rabbit_log:error("Failed to stop a message store for vhost ~s: vhost no longer exists!",
+ rabbit_log:error("Failed to stop a message store for vhost ~ts: vhost no longer exists!",
[VHost]),
ok
diff --git a/deps/rabbit/src/rabbit_vhost_process.erl b/deps/rabbit/src/rabbit_vhost_process.erl
index 252e7ecb0f..4290179c22 100644
--- a/deps/rabbit/src/rabbit_vhost_process.erl
+++ b/deps/rabbit/src/rabbit_vhost_process.erl
@@ -37,7 +37,7 @@ start_link(VHost) ->
init([VHost]) ->
process_flag(trap_exit, true),
- rabbit_log:debug("Recovering data for VHost ~p", [VHost]),
+ rabbit_log:debug("Recovering data for VHost ~ts", [VHost]),
try
%% Recover the vhost data and save it to vhost registry.
ok = rabbit_vhost:recover(VHost),
diff --git a/deps/rabbit/src/rabbit_vhost_sup_sup.erl b/deps/rabbit/src/rabbit_vhost_sup_sup.erl
index bd761e938f..f077e7dcef 100644
--- a/deps/rabbit/src/rabbit_vhost_sup_sup.erl
+++ b/deps/rabbit/src/rabbit_vhost_sup_sup.erl
@@ -78,8 +78,8 @@ stop_and_delete_vhost(VHost) ->
case is_process_alive(WrapperPid) of
false -> ok;
true ->
- rabbit_log:info("Stopping vhost supervisor ~p"
- " for vhost '~s'",
+ rabbit_log:info("Stopping vhost supervisor ~tp"
+ " for vhost '~ts'",
[VHostSupPid, VHost]),
case supervisor2:terminate_child(?MODULE, WrapperPid) of
ok ->
@@ -100,9 +100,9 @@ stop_and_delete_vhost(VHost, Node) ->
case rabbit_misc:rpc_call(Node, rabbit_vhost_sup_sup, stop_and_delete_vhost, [VHost]) of
ok -> ok;
{badrpc, RpcErr} ->
- rabbit_log:error("Failed to stop and delete a vhost ~p"
- " on node ~p."
- " Reason: ~p",
+ rabbit_log:error("Failed to stop and delete a vhost ~tp"
+ " on node ~tp."
+ " Reason: ~tp",
[VHost, Node, RpcErr]),
{error, RpcErr}
end.
@@ -113,7 +113,7 @@ init_vhost(VHost) ->
{ok, _} -> ok;
{error, {already_started, _}} ->
rabbit_log:warning(
- "Attempting to start an already started vhost '~s'.",
+ "Attempting to start an already started vhost '~ts'.",
[VHost]),
ok;
{error, {no_such_vhost, VHost}} ->
@@ -122,15 +122,15 @@ init_vhost(VHost) ->
case vhost_restart_strategy() of
permanent ->
rabbit_log:error(
- "Unable to initialize vhost data store for vhost '~s'."
- " Reason: ~p",
+ "Unable to initialize vhost data store for vhost '~ts'."
+ " Reason: ~tp",
[VHost, Reason]),
throw({error, Reason});
transient ->
rabbit_log:warning(
- "Unable to initialize vhost data store for vhost '~s'."
+ "Unable to initialize vhost data store for vhost '~ts'."
" The vhost will be stopped for this node. "
- " Reason: ~p",
+ " Reason: ~tp",
[VHost, Reason]),
ok
end
diff --git a/deps/rabbit_common/src/rabbit_data_coercion.erl b/deps/rabbit_common/src/rabbit_data_coercion.erl
index a470a0643c..7d9c1490f3 100644
--- a/deps/rabbit_common/src/rabbit_data_coercion.erl
+++ b/deps/rabbit_common/src/rabbit_data_coercion.erl
@@ -9,6 +9,7 @@
-export([to_binary/1, to_list/1, to_atom/1, to_integer/1, to_proplist/1, to_map/1]).
-export([to_atom/2, atomize_keys/1, to_list_of_binaries/1]).
+-export([to_utf8_binary/1, to_unicode_charlist/1]).
-spec to_binary(Val :: binary() | list() | atom() | integer()) -> binary().
to_binary(Val) when is_list(Val) -> list_to_binary(Val);
@@ -47,7 +48,6 @@ to_proplist(Val) when is_map(Val) -> maps:to_list(Val).
to_map(Val) when is_map(Val) -> Val;
to_map(Val) when is_list(Val) -> maps:from_list(Val).
-
-spec atomize_keys(Val :: map() | list()) -> map() | list().
atomize_keys(Val) when is_list(Val) ->
[{to_atom(K), V} || {K, V} <- Val];
@@ -66,3 +66,31 @@ to_list_of_binaries(Value) ->
Other ->
[to_binary(Other)]
end.
+
+-spec to_utf8_binary(Val) -> Result when
+ Val :: unicode:latin1_chardata() | unicode:chardata() | unicode:external_chardata(),
+ Result :: binary()
+ | {error, binary(), RestData}
+ | {incomplete, binary(), binary()},
+ RestData :: unicode:latin1_chardata() | unicode:chardata() | unicode:external_chardata().
+to_utf8_binary(Val) ->
+ case unicode:characters_to_binary(Val, utf8) of
+ {error, _, _} ->
+ unicode:characters_to_binary(Val, latin1);
+ UnicodeValue ->
+ UnicodeValue
+ end.
+
+-spec to_unicode_charlist(Data) -> Result when
+ Data :: unicode:latin1_chardata() | unicode:chardata() | unicode:external_chardata(),
+ Result :: list()
+ | {error, list(), RestData}
+ | {incomplete, list(), binary()},
+ RestData :: unicode:latin1_chardata() | unicode:chardata() | unicode:external_chardata().
+to_unicode_charlist(Val) ->
+ case unicode:characters_to_list(Val, utf8) of
+ {error, _, _} ->
+ unicode:characters_to_list(Val, latin1);
+ UnicodeValue ->
+ UnicodeValue
+ end.
diff --git a/deps/rabbit_common/src/rabbit_env.erl b/deps/rabbit_common/src/rabbit_env.erl
index 31ceb52f87..853faa38c3 100644
--- a/deps/rabbit_common/src/rabbit_env.erl
+++ b/deps/rabbit_common/src/rabbit_env.erl
@@ -260,7 +260,7 @@ log_process_env() ->
?LOG_DEBUG("Process environment:"),
lists:foreach(
fun({Var, Value}) ->
- ?LOG_DEBUG(" - ~s = ~ts", [Var, Value])
+ ?LOG_DEBUG(" - ~ts = ~ts", [Var, Value])
end, lists:sort(env_vars())).
log_context(Context) ->
@@ -268,7 +268,7 @@ log_context(Context) ->
lists:foreach(
fun(Key) ->
Value = maps:get(Key, Context),
- ?LOG_DEBUG(" - ~s: ~p", [Key, Value])
+ ?LOG_DEBUG(" - ~ts: ~tp", [Key, Value])
end,
lists:sort(maps:keys(Context))).
@@ -278,7 +278,7 @@ context_to_app_env_vars(Context) ->
#{domain => ?RMQLOG_DOMAIN_PRELAUNCH}),
Fun = fun({App, Param, Value}) ->
?LOG_DEBUG(
- " - ~s:~s = ~p", [App, Param, Value],
+ " - ~ts:~ts = ~tp", [App, Param, Value],
#{domain => ?RMQLOG_DOMAIN_PRELAUNCH}),
ok = application:set_env(
App, Param, Value, [{persistent, true}])
@@ -444,18 +444,17 @@ make_path(BundleDir, [Bundle|Tail], Res) ->
%% Second try with archive
Ext = archive_extension(),
Base = filename:basename(Bundle, Ext),
- Ebin2 = filename:join([BundleDir, Base ++ Ext, Base, "ebin"]),
+ Ebin2 = normalize_path(BundleDir, Base ++ Ext, Base, "ebin"),
Ebins =
case split_base(Base) of
{AppName,_} ->
- Ebin3 = filename:join([BundleDir, Base ++ Ext,
- AppName, "ebin"]),
+ Ebin3 = normalize_path(BundleDir, Base ++ Ext, AppName, "ebin"),
[Ebin3, Ebin2, Dir];
_ ->
[Ebin2, Dir]
end,
case try_ebin_dirs(Ebins) of
- {ok,FoundEbin} ->
+ {ok, FoundEbin} ->
make_path(BundleDir, Tail, [FoundEbin|Res]);
error ->
make_path(BundleDir, Tail, Res)
@@ -514,7 +513,10 @@ nodename_type(Context) ->
nodename(#{nodename_type := NameType} = Context) ->
LongHostname = net_adm:localhost(),
- ShortHostname = re:replace(LongHostname, "\\..*$", "", [{return, list}]),
+ RE = "\\..*$",
+ Replacement = "",
+ Options = [unicode, {return, list}],
+ ShortHostname = re:replace(LongHostname, RE, Replacement, Options),
case get_prefixed_env_var("RABBITMQ_NODENAME") of
false when NameType =:= shortnames ->
Nodename = rabbit_nodes_common:make({"rabbit", ShortHostname}),
@@ -563,11 +565,12 @@ split_nodename(#{nodename := Nodename} = Context) ->
config_base_dir(#{os_type := {unix, _},
sys_prefix := SysPrefix} = Context) ->
- Dir = filename:join([SysPrefix, "etc", "rabbitmq"]),
+ Dir = normalize_path(SysPrefix, "etc", "rabbitmq"),
update_context(Context, config_base_dir, Dir);
config_base_dir(#{os_type := {win32, _},
- rabbitmq_base := Dir} = Context) ->
- update_context(Context, config_base_dir, Dir).
+ rabbitmq_base := Dir0} = Context) ->
+ Dir1 = normalize_path(Dir0),
+ update_context(Context, config_base_dir, Dir1).
main_config_file(Context) ->
case get_prefixed_env_var("RABBITMQ_CONFIG_FILE") of
@@ -580,7 +583,7 @@ main_config_file(Context) ->
end.
get_default_main_config_file(#{config_base_dir := ConfigBaseDir}) ->
- filename:join(ConfigBaseDir, "rabbitmq").
+ normalize_path(ConfigBaseDir, "rabbitmq").
additional_config_files(Context) ->
case get_prefixed_env_var("RABBITMQ_CONFIG_FILES") of
@@ -595,7 +598,7 @@ additional_config_files(Context) ->
end.
get_default_additional_config_files(#{config_base_dir := ConfigBaseDir}) ->
- filename:join([ConfigBaseDir, "conf.d", "*.conf"]).
+ normalize_path(ConfigBaseDir, "conf.d", "*.conf").
advanced_config_file(Context) ->
case get_prefixed_env_var("RABBITMQ_ADVANCED_CONFIG_FILE") of
@@ -608,7 +611,7 @@ advanced_config_file(Context) ->
end.
get_default_advanced_config_file(#{config_base_dir := ConfigBaseDir}) ->
- filename:join(ConfigBaseDir, "advanced.config").
+ normalize_path(ConfigBaseDir, "advanced.config").
%% -------------------------------------------------------------------
%%
@@ -699,11 +702,11 @@ log_base_dir(#{os_type := OSType} = Context) ->
case {get_prefixed_env_var("RABBITMQ_LOG_BASE"), OSType} of
{false, {unix, _}} ->
#{sys_prefix := SysPrefix} = Context,
- Dir = filename:join([SysPrefix, "var", "log", "rabbitmq"]),
+ Dir = normalize_path(SysPrefix, "var", "log", "rabbitmq"),
update_context(Context, log_base_dir, Dir, default);
{false, {win32, _}} ->
#{rabbitmq_base := RabbitmqBase} = Context,
- Dir = filename:join([RabbitmqBase, "log"]),
+ Dir = normalize_path(RabbitmqBase, "log"),
update_context(Context, log_base_dir, Dir, default);
{Value, _} ->
Dir = normalize_path(Value),
@@ -714,8 +717,8 @@ main_log_file(#{nodename := Nodename,
log_base_dir := LogBaseDir} = Context) ->
case get_prefixed_env_var("RABBITMQ_LOGS") of
false ->
- File= filename:join(LogBaseDir,
- atom_to_list(Nodename) ++ ".log"),
+ LogFileName = atom_to_list(Nodename) ++ ".log",
+ File= normalize_path(LogBaseDir, LogFileName),
update_context(Context, main_log_file, File, default);
"-" = Value ->
update_context(Context, main_log_file, Value, environment);
@@ -734,8 +737,8 @@ upgrade_log_file(#{nodename := Nodename,
log_base_dir := LogBaseDir} = Context) ->
case get_prefixed_env_var("RABBITMQ_UPGRADE_LOG") of
false ->
- File = filename:join(LogBaseDir,
- atom_to_list(Nodename) ++ "_upgrade.log"),
+ UpgradeLogFileName = atom_to_list(Nodename) ++ "_upgrade.log",
+ File = normalize_path(LogBaseDir, UpgradeLogFileName),
update_context(Context, upgrade_log_file, File, default);
Value ->
File = normalize_path(Value),
@@ -833,7 +836,7 @@ get_default_mnesia_base_dir(#{data_dir := DataDir} = Context) ->
#{os_type := {unix, _}} -> "mnesia";
#{os_type := {win32, _}} -> "db"
end,
- filename:join(DataDir, Basename).
+ normalize_path(DataDir, Basename).
mnesia_dir(#{from_remote_node := Remote} = Context) ->
case get_prefixed_env_var("RABBITMQ_MNESIA_DIR") of
@@ -874,12 +877,12 @@ get_default_mnesia_dir(#{os_type := {unix, _},
nodename := Nodename,
mnesia_base_dir := MnesiaBaseDir})
when MnesiaBaseDir =/= undefined ->
- filename:join(MnesiaBaseDir, atom_to_list(Nodename));
+ normalize_path(MnesiaBaseDir, atom_to_list(Nodename));
get_default_mnesia_dir(#{os_type := {win32, _},
nodename := Nodename,
mnesia_base_dir := MnesiaBaseDir})
when MnesiaBaseDir =/= undefined ->
- filename:join(MnesiaBaseDir, atom_to_list(Nodename) ++ "-mnesia").
+ normalize_path(MnesiaBaseDir, atom_to_list(Nodename) ++ "-mnesia").
%% -------------------------------------------------------------------
%%
@@ -890,7 +893,7 @@ get_default_mnesia_dir(#{os_type := {win32, _},
quorum_queue_dir(#{mnesia_dir := MnesiaDir} = Context) ->
case get_prefixed_env_var("RABBITMQ_QUORUM_DIR") of
false when MnesiaDir =/= undefined ->
- Dir = filename:join(MnesiaDir, "quorum"),
+ Dir = normalize_path(MnesiaDir, "quorum"),
update_context(Context, quorum_queue_dir, Dir, default);
false when MnesiaDir =:= undefined ->
update_context(Context, quorum_queue_dir, undefined, default);
@@ -908,7 +911,7 @@ quorum_queue_dir(#{mnesia_dir := MnesiaDir} = Context) ->
stream_queue_dir(#{mnesia_dir := MnesiaDir} = Context) ->
case get_prefixed_env_var("RABBITMQ_STREAM_DIR") of
false when MnesiaDir =/= undefined ->
- Dir = filename:join(MnesiaDir, "stream"),
+ Dir = normalize_path(MnesiaDir, "stream"),
update_context(Context, stream_queue_dir, Dir, default);
false when MnesiaDir =:= undefined ->
update_context(Context, stream_queue_dir, undefined, default);
@@ -931,8 +934,8 @@ pid_file(#{mnesia_base_dir := MnesiaBaseDir,
nodename := Nodename} = Context) ->
case get_prefixed_env_var("RABBITMQ_PID_FILE") of
false when MnesiaBaseDir =/= undefined ->
- File = filename:join(MnesiaBaseDir,
- atom_to_list(Nodename) ++ ".pid"),
+ PidFileName = atom_to_list(Nodename) ++ ".pid",
+ File = normalize_path(MnesiaBaseDir, PidFileName),
update_context(Context, pid_file, File, default);
false when MnesiaBaseDir =:= undefined ->
update_context(Context, pid_file, undefined, default);
@@ -973,8 +976,8 @@ feature_flags_file_from_env(#{mnesia_base_dir := MnesiaBaseDir,
nodename := Nodename} = Context) ->
case get_env_var("RABBITMQ_FEATURE_FLAGS_FILE") of
false ->
- File = filename:join(MnesiaBaseDir,
- atom_to_list(Nodename) ++ "-feature_flags"),
+ FeatureFlagsFileName = atom_to_list(Nodename) ++ "-feature_flags",
+ File = normalize_path(MnesiaBaseDir, FeatureFlagsFileName),
update_context(Context, feature_flags_file, File, default);
Value ->
File = normalize_path(Value),
@@ -1090,8 +1093,7 @@ get_default_plugins_path_from_env(#{os_type := OSType}) ->
PluginsDir = rabbit_common_mod_location_to_plugins_dir(ThisModDir),
case {OSType, PluginsDir} of
{{unix, _}, "/usr/lib/rabbitmq/" ++ _} ->
- UserPluginsDir = filename:join(
- ["/", "usr", "lib", "rabbitmq", "plugins"]),
+ UserPluginsDir = normalize_path("/", "usr", "lib", "rabbitmq", "plugins"),
UserPluginsDir ++ ":" ++ PluginsDir;
_ ->
PluginsDir
@@ -1111,32 +1113,26 @@ get_default_plugins_path_from_node(Remote) ->
rabbit_common_mod_location_to_plugins_dir(ModDir) ->
case filename:basename(ModDir) of
"ebin" ->
- case filelib:is_dir(ModDir) of
+ case is_dir(ModDir) of
false ->
%% rabbit_common in the plugin's .ez archive.
- filename:dirname(
- filename:dirname(
- filename:dirname(ModDir)));
+ filename:dirname(filename:dirname(filename:dirname(ModDir)));
true ->
%% rabbit_common in the plugin's directory.
- filename:dirname(
- filename:dirname(ModDir))
+ filename:dirname(filename:dirname(ModDir))
end;
_ ->
%% rabbit_common in the CLI escript.
- filename:join(
- filename:dirname(
- filename:dirname(ModDir)),
- "plugins")
+ PluginsBaseDir = filename:dirname(filename:dirname(ModDir)),
+ normalize_path(PluginsBaseDir, "plugins")
end.
plugins_expand_dir(#{mnesia_base_dir := MnesiaBaseDir,
nodename := Nodename} = Context) ->
case get_prefixed_env_var("RABBITMQ_PLUGINS_EXPAND_DIR") of
false when MnesiaBaseDir =/= undefined ->
- Dir = filename:join(
- MnesiaBaseDir,
- atom_to_list(Nodename) ++ "-plugins-expand"),
+ PluginsExpandDirName = atom_to_list(Nodename) ++ "-plugins-expand",
+ Dir = normalize_path(MnesiaBaseDir, PluginsExpandDirName),
update_context(Context, plugins_expand_dir, Dir, default);
false when MnesiaBaseDir =:= undefined ->
update_context(Context, plugins_expand_dir, undefined, default);
@@ -1169,7 +1165,7 @@ enabled_plugins_file_from_env(Context) ->
end.
get_default_enabled_plugins_file(#{config_base_dir := ConfigBaseDir}) ->
- filename:join(ConfigBaseDir, "enabled_plugins").
+ normalize_path(ConfigBaseDir, "enabled_plugins").
enabled_plugins_file_from_node(#{from_remote_node := Remote} = Context) ->
Ret = query_remote(Remote,
@@ -1283,9 +1279,8 @@ sys_prefix(Context) ->
rabbitmq_base(#{os_type := {win32, _}} = Context) ->
case get_env_var("RABBITMQ_BASE") of
false ->
- AppData = normalize_path(get_env_var("APPDATA")),
- Dir = filename:join(AppData, "RabbitMQ"),
- update_context(Context, rabbitmq_base, Dir, default);
+ AppDataDir = normalize_path(get_env_var("APPDATA"), "RabbitMQ"),
+ update_context(Context, rabbitmq_base, AppDataDir, default);
Value ->
Dir = normalize_path(Value),
update_context(Context, rabbitmq_base, Dir, environment)
@@ -1295,7 +1290,7 @@ rabbitmq_base(Context) ->
data_dir(#{os_type := {unix, _},
sys_prefix := SysPrefix} = Context) ->
- Dir = filename:join([SysPrefix, "var", "lib", "rabbitmq"]),
+ Dir = normalize_path(SysPrefix, "var", "lib", "rabbitmq"),
update_context(Context, data_dir, Dir);
data_dir(#{os_type := {win32, _},
rabbitmq_base := RabbitmqBase} = Context) ->
@@ -1437,10 +1432,10 @@ motd_file_from_env(Context) ->
get_default_motd_file(#{os_type := {unix, _},
config_base_dir := ConfigBaseDir}) ->
- filename:join(ConfigBaseDir, "motd");
+ normalize_path(ConfigBaseDir, "motd");
get_default_motd_file(#{os_type := {win32, _},
config_base_dir := ConfigBaseDir}) ->
- filename:join(ConfigBaseDir, "motd.txt").
+ normalize_path(ConfigBaseDir, "motd.txt").
motd_file_from_node(#{from_remote_node := Remote} = Context) ->
Ret = (catch query_remote(Remote, rabbit, motd_file, [])),
@@ -1518,8 +1513,7 @@ load_conf_env_file(#{os_type := {unix, _},
{ConfEnvFile, Origin} =
case get_prefixed_env_var("RABBITMQ_CONF_ENV_FILE") of
false ->
- File = filename:join(
- [SysPrefix, "etc", "rabbitmq", "rabbitmq-env.conf"]),
+ File = normalize_path(SysPrefix, "etc", "rabbitmq", "rabbitmq-env.conf"),
{File, default};
Value ->
{normalize_path(Value), environment}
@@ -1553,7 +1547,7 @@ load_conf_env_file(#{os_type := {win32, _},
{ConfEnvFile, Origin} =
case get_prefixed_env_var("RABBITMQ_CONF_ENV_FILE") of
false ->
- File = filename:join([RabbitmqBase, "rabbitmq-env-conf.bat"]),
+ File = normalize_path(RabbitmqBase, "rabbitmq-env-conf.bat"),
{File, default};
Value ->
{normalize_path(Value), environment}
@@ -1627,15 +1621,13 @@ do_load_conf_env_file(#{os_type := {unix, _}} = Context, Sh, ConfEnvFile) ->
#{sys_prefix := SysPrefix,
rabbitmq_home := RabbitmqHome} = Context,
- MainConfigFile = re:replace(
- get_default_main_config_file(Context),
- "\\.(conf|config)$", "", [{return, list}]),
+ MainConfigFileNoExt = get_main_config_file_without_extension(Context),
%% The variables below are those the `CONF_ENV_FILE` file can expect.
Env = [
{"SYS_PREFIX", SysPrefix},
{"RABBITMQ_HOME", RabbitmqHome},
- {"CONFIG_FILE", MainConfigFile},
+ {"CONFIG_FILE", MainConfigFileNoExt},
{"ADVANCED_CONFIG_FILE", get_default_advanced_config_file(Context)},
{"MNESIA_BASE", get_default_mnesia_base_dir(Context)},
{"ENABLED_PLUGINS_FILE", get_default_enabled_plugins_file(Context)},
@@ -1644,18 +1636,18 @@ do_load_conf_env_file(#{os_type := {unix, _}} = Context, Sh, ConfEnvFile) ->
],
Args = ["-ex", "-c", Script],
- Opts = [{args, Args},
- {env, Env},
- binary,
- use_stdio,
- stderr_to_stdout,
- exit_status],
+ Opts = [{args, Args}, {env, Env},
+ binary, use_stdio, stderr_to_stdout, exit_status],
Port = erlang:open_port({spawn_executable, Sh}, Opts),
collect_conf_env_file_output(Context, Port, Marker, <<>>);
-do_load_conf_env_file(#{os_type := {win32, _}} = Context, Cmd, ConfEnvFile) ->
+do_load_conf_env_file(#{os_type := {win32, _}} = Context, Cmd, ConfEnvFile0) ->
+ ConfEnvFile1 = string:trim(ConfEnvFile0, both, "\"'"),
+ ConfEnvFile2 = normalize_path(ConfEnvFile1),
+ ConfEnvFile3 = rabbit_data_coercion:to_utf8_binary(ConfEnvFile2),
+
%% rabbitmq/rabbitmq-common#392
?LOG_DEBUG(
- "Executing $RABBITMQ_CONF_ENV_FILE: ~ts", [ConfEnvFile],
+ "Executing $RABBITMQ_CONF_ENV_FILE: ~ts", [ConfEnvFile3],
#{domain => ?RMQLOG_DOMAIN_PRELAUNCH}),
%% The script below executes the `CONF_ENV_FILE` file, then it shows a
@@ -1667,19 +1659,16 @@ do_load_conf_env_file(#{os_type := {win32, _}} = Context, Cmd, ConfEnvFile) ->
%% Arguments are split into a list of strings to support a filename with
%% whitespaces in the path.
Marker = vars_list_marker(),
- ConfEnvFileNoQuotes = string:trim(ConfEnvFile, both, "\"'"),
#{rabbitmq_base := RabbitmqBase,
rabbitmq_home := RabbitmqHome} = Context,
- MainConfigFile = re:replace(
- get_default_main_config_file(Context),
- "\\.(conf|config)$", "", [{return, list}]),
+ MainConfigFileNoExt = get_main_config_file_without_extension(Context),
%% The variables below are those the `CONF_ENV_FILE` file can expect.
Env = [
{"RABBITMQ_BASE", RabbitmqBase},
{"RABBITMQ_HOME", RabbitmqHome},
- {"CONFIG_FILE", MainConfigFile},
+ {"CONFIG_FILE", MainConfigFileNoExt},
{"ADVANCED_CONFIG_FILE", get_default_advanced_config_file(Context)},
{"MNESIA_BASE", get_default_mnesia_base_dir(Context)},
{"ENABLED_PLUGINS_FILE", get_default_enabled_plugins_file(Context)},
@@ -1687,22 +1676,52 @@ do_load_conf_env_file(#{os_type := {win32, _}} = Context, Cmd, ConfEnvFile) ->
{"CONF_ENV_FILE_PHASE", "rabbtimq-prelaunch"}
],
- Args = ["/Q", "/C", ConfEnvFileNoQuotes, "&&", "echo", Marker, "&&", "set"],
- Opts = [{args, Args},
- {env, Env},
- hide,
- binary,
- stderr_to_stdout,
- exit_status],
- Port = erlang:open_port({spawn_executable, Cmd}, Opts),
- collect_conf_env_file_output(Context, Port, "\"" ++ Marker ++ "\" ", <<>>).
+ TempBatchFileContent = [<<"@echo off\r\n">>,
+ <<"chcp 65001 >nul\r\n">>,
+ <<"call \"">>, ConfEnvFile3, <<"\" && echo ">>, Marker, <<" && set\r\n">>],
+ TempPath = get_temp_path_win32(),
+ TempBatchFileName = rabbit_misc:format("rabbitmq-env-conf-runner-~s.bat", [os:getpid()]),
+ TempBatchFilePath = normalize_path(TempPath, TempBatchFileName),
+ ok = file:write_file(TempBatchFilePath, TempBatchFileContent),
+ try
+ Args = ["/Q", "/C", TempBatchFilePath],
+ Opts = [{args, Args}, {env, Env},
+ hide, binary, stderr_to_stdout, exit_status],
+ Port = erlang:open_port({spawn_executable, Cmd}, Opts),
+ collect_conf_env_file_output(Context, Port, Marker, <<>>)
+ after
+ file:delete(TempBatchFilePath)
+ end.
+
+get_main_config_file_without_extension(Context) ->
+ DefaultMainConfigFile = get_default_main_config_file(Context),
+ RE = "\\.(conf|config)$",
+ Replacement = "",
+ Options = [unicode, {return, list}],
+ re:replace(DefaultMainConfigFile, RE, Replacement, Options).
+
+get_temp_path_win32() ->
+ % https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-gettemppatha
+ EnvVars = ["TMP", "TEMP", "USERPROFILE"],
+ Fallback = normalize_path(os:getenv("SystemRoot", "C:/Windows"), "Temp"),
+ F = fun(E) ->
+ case os:getenv(E) of
+ false -> false;
+ Var -> {is_dir(Var), Var}
+ end
+ end,
+ case lists:filtermap(F, EnvVars) of
+ [] ->
+ Fallback;
+ TmpDirs when is_list(TmpDirs) ->
+ hd(TmpDirs)
+ end.
vars_list_marker() ->
% Note:
% The following can't have any spaces in the text or it will not work on
% win32. See rabbitmq/rabbitmq-server#5471
- rabbit_misc:format(
- "-----VARS-PID-~s-----", [os:getpid()]).
+ rabbit_misc:format("-----VARS-PID-~s-----", [os:getpid()]).
collect_conf_env_file_output(Context, Port, Marker, Output) ->
receive
@@ -1712,22 +1731,25 @@ collect_conf_env_file_output(Context, Port, Marker, Output) ->
0 -> parse_conf_env_file_output(Context, Marker, Lines);
_ -> Context
end;
- {Port, {data, Chunk}} ->
+ {Port, {data, Chunk}} when is_binary(Chunk) ->
+ UnicodeChunk = unicode:characters_to_list(Chunk),
collect_conf_env_file_output(
- Context, Port, Marker, [Output, Chunk])
+ Context, Port, Marker, [Output, UnicodeChunk]);
+ {Port, {data, Chunk}} ->
+ rabbit_log:warning("~p unexpected non-binary chunk in "
+ "conf env file output: ~p~n", [?MODULE, Chunk])
end.
-post_port_cmd_output(#{os_type := {OSType, _}}, Output, ExitStatus) ->
+post_port_cmd_output(#{os_type := {OSType, _}}, UnicodeOutput, ExitStatus) ->
?LOG_DEBUG(
"$RABBITMQ_CONF_ENV_FILE exit status: ~b",
[ExitStatus],
#{domain => ?RMQLOG_DOMAIN_PRELAUNCH}),
- DecodedOutput = unicode:characters_to_list(Output),
LineSep = case OSType of
win32 -> "\r\n";
_ -> "\n"
end,
- Lines = string:split(string:trim(DecodedOutput), LineSep, all),
+ Lines = string:split(string:trim(UnicodeOutput), LineSep, all),
?LOG_DEBUG(
"$RABBITMQ_CONF_ENV_FILE output:~n~ts",
[string:join([io_lib:format(" ~ts", [Line]) || Line <- Lines], "\n")],
@@ -1752,7 +1774,7 @@ parse_conf_env_file_output1(Context, Lines) ->
case IsUsed andalso not IsSet of
true ->
?LOG_DEBUG(
- "$RABBITMQ_CONF_ENV_FILE: re-exporting variable $~s",
+ "$RABBITMQ_CONF_ENV_FILE: re-exporting variable $~ts",
[Var],
#{domain => ?RMQLOG_DOMAIN_PRELAUNCH}),
os:putenv(Var, maps:get(Var, Vars));
@@ -2009,10 +2031,25 @@ value_is_yes(Value) when is_list(Value) orelse is_binary(Value) ->
value_is_yes(_) ->
false.
+normalize_path(P0, P1, P2, P3, P4) ->
+ P01 = filename:join(P0, P1),
+ normalize_path(P01, P2, P3, P4).
+
+normalize_path(P0, P1, P2, P3) ->
+ P01 = filename:join(P0, P1),
+ normalize_path(P01, P2, P3).
+
+normalize_path(P0, P1, P2) ->
+ P01 = filename:join(P0, P1),
+ normalize_path(P01, P2).
+
+normalize_path(P0, P1) ->
+ normalize_path(filename:join(P0, P1)).
+
normalize_path("" = Path) ->
Path;
normalize_path(Path) ->
- filename:join(filename:split(Path)).
+ unicode:characters_to_list(filename:join(filename:split(Path))).
this_module_dir() ->
File = code:which(?MODULE),
@@ -2063,8 +2100,8 @@ setup_dist_for_remote_query(#{from_remote_node := {Remote, _}} = Context,
Context;
Error ->
logger:error(
- "rabbit_env: Failed to setup distribution (as ~s) to "
- "query node ~s: ~p",
+ "rabbit_env: Failed to setup distribution (as ~ts) to "
+ "query node ~ts: ~p",
[Nodename, Remote, Error]),
setup_dist_for_remote_query(Context,
NamePart, HostPart, NameType,
diff --git a/deps/rabbit_common/src/rabbit_json.erl b/deps/rabbit_common/src/rabbit_json.erl
index fded813d4f..036d86c46b 100644
--- a/deps/rabbit_common/src/rabbit_json.erl
+++ b/deps/rabbit_common/src/rabbit_json.erl
@@ -11,13 +11,12 @@
encode/1, encode/2, try_encode/1, try_encode/2]).
-define(DEFAULT_DECODE_OPTIONS, #{}).
-
+-define(DEFAULT_ENCODE_OPTIONS, #{}).
-spec decode(iodata()) -> thoas:json_term().
decode(JSON) ->
decode(JSON, ?DEFAULT_DECODE_OPTIONS).
-
-spec decode(iodata(), thoas:decode_options()) -> thoas:json_term().
decode(JSON, Opts) ->
case thoas:decode(JSON, Opts) of
@@ -25,62 +24,59 @@ decode(JSON, Opts) ->
{error, _Error} -> error({error, {failed_to_decode_json, JSON}})
end.
-
-spec try_decode(iodata()) -> {ok, thoas:json_term()} |
{error, Reason :: term()}.
try_decode(JSON) ->
try_decode(JSON, ?DEFAULT_DECODE_OPTIONS).
-
-spec try_decode(iodata(), thoas:decode_options()) ->
{ok, thoas:json_term()} | {error, Reason :: term()}.
try_decode(JSON, Opts) ->
try
{ok, decode(JSON, Opts)}
- catch error: Reason ->
+ catch error:Reason ->
{error, Reason}
end.
-spec encode(thoas:json_term()) -> iodata().
encode(Term) ->
- encode(Term, []).
+ encode(Term, ?DEFAULT_ENCODE_OPTIONS).
-spec encode(thoas:json_term(), thoas:encode_options()) -> iodata().
-encode(Term, []) ->
- thoas:encode(fixup_terms(Term));
encode(Term, Opts) ->
- thoas:encode(fixup_terms(Term), Opts).
+ %% Fixup for JSON encoding
+ %% * Transforms any Funs into strings
+ %% See rabbit_mgmt_format:format_nulls/1
+ F = fun(V) when is_function(V) ->
+ rabbit_data_coercion:to_binary(V);
+ (V) -> V
+ end,
+ thoas:encode(fixup_terms(Term, F), Opts).
-spec try_encode(thoas:json_term()) -> {ok, iodata()} |
{error, Reason :: term()}.
try_encode(Term) ->
- try_encode(Term, []).
+ try_encode(Term, ?DEFAULT_ENCODE_OPTIONS).
-spec try_encode(thoas:json_term(), thoas:decode_options()) ->
{ok, iodata()} | {error, Reason :: term()}.
try_encode(Term, Opts) ->
try
{ok, encode(Term, Opts)}
- catch error: Reason ->
+ catch error:Reason ->
{error, Reason}
end.
-%% Fixup for JSON encoding. Transforms any Funs into strings
-%% See rabbit_mgmt_format:format_nulls/1
-fixup_terms(Items) when is_list(Items) ->
- [fixup_item(Pair) || Pair <- Items];
-fixup_terms(Item) ->
- fixup_item(Item).
-
-fixup_item({Key, Value}) when is_function(Value) ->
- {Key, rabbit_data_coercion:to_binary(Value)};
-fixup_item({Key, Value}) when is_list(Value) ->
- {Key, fixup_terms(Value)};
-fixup_item({Key, Value}) ->
- {Key, Value};
-fixup_item([{_K, _V} | _T] = L) ->
- fixup_terms(L);
-fixup_item(Value) when is_function(Value) ->
- rabbit_data_coercion:to_binary(Value);
-fixup_item(Value) ->
- Value.
+fixup_terms(Items, FixupFun) when is_list(Items) ->
+ [fixup_item(Pair, FixupFun) || Pair <- Items];
+fixup_terms(Item, FixupFun) ->
+ fixup_item(Item, FixupFun).
+
+fixup_item({Key, Value}, FixupFun) when is_list(Value) ->
+ {Key, fixup_terms(Value, FixupFun)};
+fixup_item({Key, Value}, FixupFun) ->
+ {Key, FixupFun(Value)};
+fixup_item([{_K, _V} | _T] = L, FixupFun) ->
+ fixup_terms(L, FixupFun);
+fixup_item(Value, FixupFun) ->
+ FixupFun(Value).
diff --git a/deps/rabbit_common/src/rabbit_misc.erl b/deps/rabbit_common/src/rabbit_misc.erl
index c8adca259c..d0cc1cbc8e 100644
--- a/deps/rabbit_common/src/rabbit_misc.erl
+++ b/deps/rabbit_common/src/rabbit_misc.erl
@@ -449,9 +449,9 @@ r_arg(VHostPath, Kind, Table, Key) ->
end.
rs(#resource{virtual_host = VHostPath, kind = topic, name = Name}) ->
- format("'~s' in vhost '~s'", [Name, VHostPath]);
+ format("'~s' in vhost '~ts'", [Name, VHostPath]);
rs(#resource{virtual_host = VHostPath, kind = Kind, name = Name}) ->
- format("~s '~s' in vhost '~s'", [Kind, Name, VHostPath]).
+ format("~s '~s' in vhost '~ts'", [Kind, Name, VHostPath]).
enable_cover() -> enable_cover(["."]).
diff --git a/deps/rabbitmq_amqp1_0/src/rabbit_amqp1_0_reader.erl b/deps/rabbitmq_amqp1_0/src/rabbit_amqp1_0_reader.erl
index a77e8e3ba7..b4073580fe 100644
--- a/deps/rabbitmq_amqp1_0/src/rabbit_amqp1_0_reader.erl
+++ b/deps/rabbitmq_amqp1_0/src/rabbit_amqp1_0_reader.erl
@@ -714,7 +714,7 @@ send_to_new_1_0_session(Channel, Frame, State) ->
put({ch_fr_pid, ChFrPid}, {channel, Channel}),
rabbit_log_connection:info(
"AMQP 1.0 connection ~p: "
- "user '~s' authenticated and granted access to vhost '~s'",
+ "user '~s' authenticated and granted access to vhost '~ts'",
[self(), User#user.username, vhost(Hostname)]),
ok = rabbit_amqp1_0_session:process_frame(ChFrPid, Frame);
{error, {not_allowed, _}} ->
diff --git a/deps/rabbitmq_management/src/rabbit_mgmt_wm_nodes.erl b/deps/rabbitmq_management/src/rabbit_mgmt_wm_nodes.erl
index 02bf12fedb..616d693c88 100644
--- a/deps/rabbitmq_management/src/rabbit_mgmt_wm_nodes.erl
+++ b/deps/rabbitmq_management/src/rabbit_mgmt_wm_nodes.erl
@@ -12,7 +12,6 @@
-export([variances/2]).
-include_lib("rabbitmq_management_agent/include/rabbit_mgmt_records.hrl").
--include_lib("rabbit_common/include/rabbit.hrl").
%%--------------------------------------------------------------------
diff --git a/deps/rabbitmq_management_agent/src/rabbit_mgmt_external_stats.erl b/deps/rabbitmq_management_agent/src/rabbit_mgmt_external_stats.erl
index 710dfa3285..c74420de18 100644
--- a/deps/rabbitmq_management_agent/src/rabbit_mgmt_external_stats.erl
+++ b/deps/rabbitmq_management_agent/src/rabbit_mgmt_external_stats.erl
@@ -240,7 +240,7 @@ i(sockets_used, State) ->
i(sockets_total, State) ->
{State, proplists:get_value(sockets_limit, file_handle_cache:info([sockets_limit]))};
i(os_pid, State) ->
- {State, list_to_binary(os:getpid())};
+ {State, rabbit_data_coercion:to_utf8_binary(os:getpid())};
i(mem_used, State) ->
{State, vm_memory_monitor:get_process_memory()};
i(mem_calculation_strategy, State) ->
@@ -273,11 +273,11 @@ i(rates_mode, State) ->
i(exchange_types, State) ->
{State, list_registry_plugins(exchange)};
i(log_files, State) ->
- {State, [list_to_binary(F) || F <- rabbit:log_locations()]};
+ {State, [rabbit_data_coercion:to_utf8_binary(F) || F <- rabbit:log_locations()]};
i(db_dir, State) ->
- {State, list_to_binary(rabbit_mnesia:dir())};
+ {State, rabbit_data_coercion:to_utf8_binary(rabbit_mnesia:dir())};
i(config_files, State) ->
- {State, [list_to_binary(F) || F <- rabbit:config_files()]};
+ {State, [rabbit_data_coercion:to_utf8_binary(F) || F <- rabbit:config_files()]};
i(net_ticktime, State) ->
{State, net_kernel:get_net_ticktime()};
i(persister_stats, State) ->
@@ -334,11 +334,11 @@ registry_plugin_enabled(Desc, Fun) ->
format_application({Application, Description, Version}) ->
[{name, Application},
- {description, list_to_binary(Description)},
- {version, list_to_binary(Version)}].
+ {description, rabbit_data_coercion:to_utf8_binary(Description)},
+ {version, rabbit_data_coercion:to_utf8_binary(Version)}].
set_plugin_name(Name, Module) ->
- [{name, list_to_binary(atom_to_list(Name))} |
+ [{name, atom_to_binary(Name, utf8)} |
proplists:delete(name, Module:description())].
persister_stats(#state{fhc_stats = FHC}) ->
@@ -373,8 +373,8 @@ rabbit_web_dispatch_registry_list_all() ->
end.
format_context({Path, Description, Rest}) ->
- [{description, list_to_binary(Description)},
- {path, list_to_binary("/" ++ Path)} |
+ [{description, rabbit_data_coercion:to_utf8_binary(Description)},
+ {path, rabbit_data_coercion:to_utf8_binary("/" ++ Path)} |
format_mochiweb_option_list(Rest)].
format_mochiweb_option_list(C) ->
@@ -383,9 +383,9 @@ format_mochiweb_option_list(C) ->
format_mochiweb_option(ssl_opts, V) ->
format_mochiweb_option_list(V);
format_mochiweb_option(_K, V) ->
- case io_lib:printable_list(V) of
- true -> list_to_binary(V);
- false -> list_to_binary(rabbit_misc:format("~w", [V]))
+ case io_lib:printable_unicode_list(V) of
+ true -> rabbit_data_coercion:to_utf8_binary(V);
+ false -> rabbit_data_coercion:to_utf8_binary(rabbit_misc:format("~w", [V]))
end.
%%--------------------------------------------------------------------
diff --git a/deps/rabbitmq_shovel/src/Elixir.RabbitMQ.CLI.Ctl.Commands.DeleteShovelCommand.erl b/deps/rabbitmq_shovel/src/Elixir.RabbitMQ.CLI.Ctl.Commands.DeleteShovelCommand.erl
index 48c2b30c0a..e63d988be6 100644
--- a/deps/rabbitmq_shovel/src/Elixir.RabbitMQ.CLI.Ctl.Commands.DeleteShovelCommand.erl
+++ b/deps/rabbitmq_shovel/src/Elixir.RabbitMQ.CLI.Ctl.Commands.DeleteShovelCommand.erl
@@ -58,7 +58,7 @@ merge_defaults(A, Opts) ->
{A, maps:merge(#{vhost => <<"/">>}, Opts)}.
banner([Name], #{vhost := VHost}) ->
- erlang:list_to_binary(io_lib:format("Deleting shovel ~s in vhost ~s",
+ erlang:list_to_binary(io_lib:format("Deleting shovel ~s in vhost ~ts",
[Name, VHost])).
run([Name], #{node := Node, vhost := VHost}) ->
diff --git a/deps/rabbitmq_shovel/src/rabbit_amqp091_shovel.erl b/deps/rabbitmq_shovel/src/rabbit_amqp091_shovel.erl
index d836c11d38..daae46260b 100644
--- a/deps/rabbitmq_shovel/src/rabbit_amqp091_shovel.erl
+++ b/deps/rabbitmq_shovel/src/rabbit_amqp091_shovel.erl
@@ -367,7 +367,7 @@ reset_pending(State = #{dest := Dest}) ->
make_conn_and_chan([], {VHost, Name} = _ShovelName) ->
rabbit_log:error(
- "Shovel '~s' in vhost '~s' has no more URIs to try for connection",
+ "Shovel '~s' in vhost '~ts' has no more URIs to try for connection",
[Name, VHost]),
erlang:error(failed_to_connect_using_provided_uris);
make_conn_and_chan([], ShovelName) ->
@@ -401,7 +401,7 @@ do_make_conn_and_chan(URIs, ShovelName) ->
log_connection_failure(Reason, URI, {VHost, Name} = _ShovelName) ->
rabbit_log:error(
- "Shovel '~s' in vhost '~s' failed to connect (URI: ~s): ~s",
+ "Shovel '~s' in vhost '~ts' failed to connect (URI: ~s): ~s",
[Name, VHost, amqp_uri:remove_credentials(URI), human_readable_connection_error(Reason)]);
log_connection_failure(Reason, URI, ShovelName) ->
rabbit_log:error(
diff --git a/deps/rabbitmq_shovel_management/src/rabbit_shovel_mgmt.erl b/deps/rabbitmq_shovel_management/src/rabbit_shovel_mgmt.erl
index 240979af01..bc27be1567 100644
--- a/deps/rabbitmq_shovel_management/src/rabbit_shovel_mgmt.erl
+++ b/deps/rabbitmq_shovel_management/src/rabbit_shovel_mgmt.erl
@@ -78,7 +78,7 @@ delete_resource(ReqData, #context{user = #user{username = Username}}=Context) ->
%% We must distinguish between a delete and restart
case is_restart(ReqData) of
true ->
- rabbit_log:info("Asked to restart shovel '~s' in vhost '~s' on node '~s'", [Name, VHost, Node]),
+ rabbit_log:info("Asked to restart shovel '~s' in vhost '~ts' on node '~s'", [Name, VHost, Node]),
case rpc:call(Node, rabbit_shovel_util, restart_shovel, [VHost, Name], ?SHOVEL_CALLS_TIMEOUT_MS) of
ok -> true;
{_, Msg} -> rabbit_log:error(Msg),
@@ -86,7 +86,7 @@ delete_resource(ReqData, #context{user = #user{username = Username}}=Context) ->
end;
_ ->
- rabbit_log:info("Asked to delete shovel '~s' in vhost '~s' on node '~s'", [Name, VHost, Node]),
+ rabbit_log:info("Asked to delete shovel '~s' in vhost '~ts' on node '~s'", [Name, VHost, Node]),
case rpc:call(Node, rabbit_shovel_util, delete_shovel, [VHost, Name, Username], ?SHOVEL_CALLS_TIMEOUT_MS) of
ok -> true;
{_, Msg} -> rabbit_log:error(Msg),