Skip to content

Commit 5f9aff6

Browse files
dumbbellessen
authored andcommitted
Fix errors reported by Dialyzer
1 parent e592adc commit 5f9aff6

11 files changed

+83
-73
lines changed

src/rabbit_amqqueue.erl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,8 @@ not_found_or_absent(Name) ->
453453
[Q] -> {absent, Q, nodedown} %% Q exists on stopped node
454454
end.
455455

456+
-spec not_found_or_absent_dirty(name()) -> not_found_or_absent().
457+
456458
not_found_or_absent_dirty(Name) ->
457459
%% We should read from both tables inside a tx, to get a
458460
%% consistent view. But the chances of an inconsistency are small,
@@ -465,7 +467,7 @@ not_found_or_absent_dirty(Name) ->
465467
with(Name, F, E) ->
466468
with(Name, F, E, 2000).
467469

468-
with(Name, F, E, RetriesLeft) ->
470+
with(#resource{} = Name, F, E, RetriesLeft) ->
469471
case lookup(Name) of
470472
{ok, Q = #amqqueue{state = live}} when RetriesLeft =:= 0 ->
471473
%% Something bad happened to that queue, we are bailing out

src/rabbit_mnesia.erl

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -163,20 +163,14 @@ init_from_config() ->
163163
{DiscoveredNodes, NodeType} =
164164
case rabbit_peer_discovery:discover_cluster_nodes() of
165165
{ok, {Nodes, Type} = Config}
166-
when is_list(Nodes) andalso (Type == disc orelse Type == disk orelse Type == ram) ->
166+
when is_list(Nodes) andalso
167+
(Type == disc orelse Type == disk orelse Type == ram) ->
167168
case lists:foldr(FindBadNodeNames, [], Nodes) of
168169
[] -> Config;
169170
BadNames -> e({invalid_cluster_node_names, BadNames})
170171
end;
171172
{ok, {_, BadType}} when BadType /= disc andalso BadType /= ram ->
172173
e({invalid_cluster_node_type, BadType});
173-
{ok, Nodes} when is_list(Nodes) ->
174-
%% The legacy syntax (a nodes list without the node
175-
%% type) is unsupported.
176-
case lists:foldr(FindBadNodeNames, [], Nodes) of
177-
[] -> e(cluster_node_type_mandatory);
178-
_ -> e(invalid_cluster_nodes_conf)
179-
end;
180174
{ok, _} ->
181175
e(invalid_cluster_nodes_conf)
182176
end,
@@ -978,6 +972,8 @@ nodes_incl_me(Nodes) -> lists:usort([node()|Nodes]).
978972

979973
nodes_excl_me(Nodes) -> Nodes -- [node()].
980974

975+
-spec e(any()) -> no_return().
976+
981977
e(Tag) -> throw({error, {Tag, error_description(Tag)}}).
982978

983979
error_description({invalid_cluster_node_names, BadNames}) ->
@@ -987,9 +983,6 @@ error_description({invalid_cluster_node_type, BadType}) ->
987983
"In the 'cluster_nodes' configuration key, the node type is invalid "
988984
"(expected 'disc' or 'ram'): " ++
989985
lists:flatten(io_lib:format("~p", [BadType]));
990-
error_description(cluster_node_type_mandatory) ->
991-
"The 'cluster_nodes' configuration key must indicate the node type: "
992-
"either {[...], disc} or {[...], ram}";
993986
error_description(invalid_cluster_nodes_conf) ->
994987
"The 'cluster_nodes' configuration key is invalid, it must be of the "
995988
"form {[Nodes], Type}, where Nodes is a list of node names and "

src/rabbit_node_monitor.erl

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,10 +104,9 @@ cluster_status_filename() ->
104104

105105
prepare_cluster_status_files() ->
106106
rabbit_mnesia:ensure_mnesia_dir(),
107-
Corrupt = fun(F) -> throw({error, corrupt_cluster_status_files, F}) end,
108107
RunningNodes1 = case try_read_file(running_nodes_filename()) of
109108
{ok, [Nodes]} when is_list(Nodes) -> Nodes;
110-
{ok, Other} -> Corrupt(Other);
109+
{ok, Other} -> corrupt_cluster_status_files(Other);
111110
{error, enoent} -> []
112111
end,
113112
ThisNode = [node()],
@@ -121,14 +120,19 @@ prepare_cluster_status_files() ->
121120
{ok, [AllNodes0]} when is_list(AllNodes0) ->
122121
{legacy_cluster_nodes(AllNodes0), legacy_disc_nodes(AllNodes0)};
123122
{ok, Files} ->
124-
Corrupt(Files);
123+
corrupt_cluster_status_files(Files);
125124
{error, enoent} ->
126125
LegacyNodes = legacy_cluster_nodes([]),
127126
{LegacyNodes, LegacyNodes}
128127
end,
129128
AllNodes2 = lists:usort(AllNodes1 ++ RunningNodes2),
130129
ok = write_cluster_status({AllNodes2, DiscNodes, RunningNodes2}).
131130

131+
-spec corrupt_cluster_status_files(any()) -> no_return().
132+
133+
corrupt_cluster_status_files(F) ->
134+
throw({error, corrupt_cluster_status_files, F}).
135+
132136
write_cluster_status({All, Disc, Running}) ->
133137
ClusterStatusFN = cluster_status_filename(),
134138
Res = case rabbit_file:write_term_file(ClusterStatusFN, [{All, Disc}]) of

src/rabbit_peer_discovery.erl

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,15 @@ maybe_init() ->
105105
end.
106106

107107

108-
-spec discover_cluster_nodes() -> {ok, Nodes :: list()} |
109-
{ok, {Nodes :: list(), NodeType :: rabbit_types:node_type()}} |
110-
{error, Reason :: string()}.
108+
%% This module doesn't currently sanity-check the return value of
109+
%% `Backend:list_nodes()`. Therefore, it could return something invalid:
110+
%% thus the `{œk, any()} in the spec.
111+
%%
112+
%% `rabbit_mnesia:init_from_config()` does some verifications.
113+
114+
-spec discover_cluster_nodes() ->
115+
{ok, {Nodes :: [node()], NodeType :: rabbit_types:node_type()} | any()} |
116+
{error, Reason :: string()}.
111117

112118
discover_cluster_nodes() ->
113119
Backend = backend(),
@@ -156,10 +162,7 @@ maybe_inject_randomized_delay() ->
156162
-spec inject_randomized_delay() -> ok.
157163

158164
inject_randomized_delay() ->
159-
{Min, Max} = case randomized_delay_range_in_ms() of
160-
{A, B} -> {A, B};
161-
[A, B] -> {A, B}
162-
end,
165+
{Min, Max} = randomized_delay_range_in_ms(),
163166
case {Min, Max} of
164167
%% When the max value is set to 0, consider the delay to be disabled.
165168
%% In addition, `rand:uniform/1` will fail with a "no function clause"
@@ -253,12 +256,15 @@ unlock(Data) ->
253256
%% Implementation
254257
%%
255258

256-
-spec normalize(Nodes :: list() |
257-
{Nodes :: list(), NodeType :: rabbit_types:node_type()} |
258-
{ok, Nodes :: list()} |
259-
{ok, {Nodes :: list(), NodeType :: rabbit_types:node_type()}} |
260-
{error, Reason :: string()}) -> {ok, {Nodes :: list(), NodeType :: rabbit_types:node_type()}} |
261-
{error, Reason :: string()}.
259+
-spec normalize(Nodes :: [node()] |
260+
{Nodes :: [node()],
261+
NodeType :: rabbit_types:node_type()} |
262+
{ok, Nodes :: [node()]} |
263+
{ok, {Nodes :: [node()],
264+
NodeType :: rabbit_types:node_type()}} |
265+
{error, Reason :: string()}) ->
266+
{ok, {Nodes :: [node()], NodeType :: rabbit_types:node_type()}} |
267+
{error, Reason :: string()}.
262268

263269
normalize(Nodes) when is_list(Nodes) ->
264270
{ok, {Nodes, disc}};
@@ -291,14 +297,12 @@ node_prefix() ->
291297

292298

293299

294-
-spec append_node_prefix(Value :: binary() | list()) -> atom().
300+
-spec append_node_prefix(Value :: binary() | string()) -> string().
295301

296-
append_node_prefix(Value) ->
302+
append_node_prefix(Value) when is_binary(Value) orelse is_list(Value) ->
297303
Val = rabbit_data_coercion:to_list(Value),
298304
Hostname = case string:tokens(Val, ?NODENAME_PART_SEPARATOR) of
299-
[_ExistingPrefix, Val] ->
300-
Val;
301-
[Val] ->
302-
Val
305+
[_ExistingPrefix, HN] -> HN;
306+
[HN] -> HN
303307
end,
304308
string:join([node_prefix(), Hostname], ?NODENAME_PART_SEPARATOR).

src/rabbit_peer_discovery_classic_config.erl

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,12 @@
2626
%% API
2727
%%
2828

29-
-spec list_nodes() -> {ok, Nodes :: list()} | {error, Reason :: string()}.
29+
-spec list_nodes() -> {ok, {Nodes :: [node()], rabbit_types:node_type()}}.
3030

3131
list_nodes() ->
32-
case application:get_env(rabbit, cluster_nodes) of
33-
{_Nodes, _NodeType} = Pair -> Pair;
34-
Nodes when is_list(Nodes) -> {Nodes, disc};
35-
undefined -> {[], disc}
32+
case application:get_env(rabbit, cluster_nodes, {[], disc}) of
33+
{_Nodes, _NodeType} = Pair -> {ok, Pair};
34+
Nodes when is_list(Nodes) -> {ok, {Nodes, disc}}
3635
end.
3736

3837
-spec supports_registration() -> boolean().

src/rabbit_peer_discovery_dns.erl

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,24 +28,25 @@
2828
%% API
2929
%%
3030

31-
-spec list_nodes() -> {ok, Nodes :: list()} | {error, Reason :: string()}.
31+
-spec list_nodes() ->
32+
{ok, {Nodes :: [node()], rabbit_types:node_type()}}.
3233

3334
list_nodes() ->
3435
case application:get_env(rabbit, cluster_formation) of
3536
undefined ->
36-
{[], disc};
37+
{ok, {[], disc}};
3738
{ok, ClusterFormation} ->
3839
case proplists:get_value(peer_discovery_dns, ClusterFormation) of
3940
undefined ->
4041
rabbit_log:warning("Peer discovery backend is set to ~s "
4142
"but final config does not contain rabbit.cluster_formation.peer_discovery_dns. "
4243
"Cannot discover any nodes because seed hostname is not configured!",
4344
[?MODULE]),
44-
{[], disc};
45+
{ok, {[], disc}};
4546
Proplist ->
4647
Hostname = rabbit_data_coercion:to_list(proplists:get_value(hostname, Proplist)),
4748

48-
{discover_nodes(Hostname, net_kernel:longnames()), rabbit_peer_discovery:node_type()}
49+
{ok, {discover_nodes(Hostname, net_kernel:longnames()), rabbit_peer_discovery:node_type()}}
4950
end
5051
end.
5152

src/rabbit_recovery_terms.erl

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ upgrade_recovery_terms() ->
115115
[begin
116116
File = filename:join([QueuesDir, Dir, "clean.dot"]),
117117
case rabbit_file:read_term_file(File) of
118-
{ok, Terms} -> ok = store(?MODULE, Dir, Terms);
118+
{ok, Terms} -> ok = store_global_table(Dir, Terms);
119119
{error, _} -> ok
120120
end,
121121
file:delete(File)
@@ -132,7 +132,7 @@ dets_upgrade(Fun)->
132132
open_global_table(),
133133
try
134134
ok = dets:foldl(fun ({DirBaseName, Terms}, Acc) ->
135-
store(?MODULE, DirBaseName, Fun(Terms)),
135+
store_global_table(DirBaseName, Fun(Terms)),
136136
Acc
137137
end, ok, ?MODULE),
138138
ok
@@ -158,8 +158,14 @@ close_global_table() ->
158158
ok
159159
end.
160160

161+
store_global_table(DirBaseName, Terms) ->
162+
dets:insert(?MODULE, {DirBaseName, Terms}).
163+
161164
read_global(DirBaseName) ->
162-
read(?MODULE, DirBaseName).
165+
case dets:lookup(?MODULE, DirBaseName) of
166+
[{_, Terms}] -> {ok, Terms};
167+
_ -> {error, not_found}
168+
end.
163169

164170
delete_global_table() ->
165171
file:delete(filename:join(rabbit_mnesia:dir(), "recovery.dets")).

src/rabbit_table.erl

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
-spec wait_for_replicated(retry()) -> 'ok'.
3535
-spec wait_for_replicated() -> 'ok'.
3636
-spec wait([atom()]) -> 'ok'.
37-
-spec retry_timeout() -> {non_neg_integer() | infinity, non_neg_integer()}.
37+
-spec retry_timeout() -> non_neg_integer() | infinity.
3838
-spec force_load() -> 'ok'.
3939
-spec is_present() -> boolean().
4040
-spec is_empty() -> boolean().
@@ -117,8 +117,6 @@ wait(TableNames, Timeout, Retries) ->
117117
throw(Error);
118118
{_, {error, Error}} ->
119119
rabbit_log:warning("Error while waiting for Mnesia tables: ~p~n", [Error]),
120-
wait(TableNames, Timeout, Retries - 1);
121-
_ ->
122120
wait(TableNames, Timeout, Retries - 1)
123121
end.
124122

src/rabbit_upgrade.erl

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -180,25 +180,34 @@ upgrade_mode(AllNodes) ->
180180
end;
181181
[Another|_] ->
182182
MyVersion = rabbit_version:desired_for_scope(mnesia),
183-
ErrFun = fun (ClusterVersion) ->
184-
%% The other node(s) are running an
185-
%% unexpected version.
186-
die("Cluster upgrade needed but other nodes are "
187-
"running ~p~nand I want ~p",
188-
[ClusterVersion, MyVersion])
189-
end,
190183
case rpc:call(Another, rabbit_version, desired_for_scope,
191184
[mnesia]) of
192-
{badrpc, {'EXIT', {undef, _}}} -> ErrFun(unknown_old_version);
193-
{badrpc, Reason} -> ErrFun({unknown, Reason});
194-
CV -> case rabbit_version:matches(
195-
MyVersion, CV) of
196-
true -> secondary;
197-
false -> ErrFun(CV)
198-
end
185+
{badrpc, {'EXIT', {undef, _}}} ->
186+
die_because_cluster_upgrade_needed(unknown_old_version,
187+
MyVersion);
188+
{badrpc, Reason} ->
189+
die_because_cluster_upgrade_needed({unknown, Reason},
190+
MyVersion);
191+
CV -> case rabbit_version:matches(
192+
MyVersion, CV) of
193+
true -> secondary;
194+
false -> die_because_cluster_upgrade_needed(
195+
CV, MyVersion)
196+
end
199197
end
200198
end.
201199

200+
-spec die_because_cluster_upgrade_needed(any(), any()) -> no_return().
201+
202+
die_because_cluster_upgrade_needed(ClusterVersion, MyVersion) ->
203+
%% The other node(s) are running an
204+
%% unexpected version.
205+
die("Cluster upgrade needed but other nodes are "
206+
"running ~p~nand I want ~p",
207+
[ClusterVersion, MyVersion]).
208+
209+
-spec die(string(), list()) -> no_return().
210+
202211
die(Msg, Args) ->
203212
%% We don't throw or exit here since that gets thrown
204213
%% straight out into do_boot, generating an erl_crash.dump

src/rabbit_version.erl

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,9 @@
4545
-spec check_version_consistency
4646
(string(), string(), string()) -> rabbit_types:ok_or_error(any()).
4747
-spec check_version_consistency
48-
(string(), string(), string(), string()) ->
49-
rabbit_types:ok_or_error(any()).
48+
(string(), string(), string(),
49+
fun((string(), string()) -> boolean())) ->
50+
rabbit_types:ok_or_error(any()).
5051
-spec check_otp_consistency
5152
(string()) -> rabbit_types:ok_or_error(any()).
5253

src/rabbit_vhost.erl

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -126,10 +126,6 @@ do_add(VHostPath, ActingUser) ->
126126
rabbit_event:notify(vhost_created, info(VHostPath)
127127
++ [{user_who_performed_action, ActingUser}]),
128128
R;
129-
{error, {no_such_vhost, VHostPath}} ->
130-
Msg = rabbit_misc:format("failed to set up vhost '~s': it was concurrently deleted!",
131-
[VHostPath]),
132-
{error, Msg};
133129
{error, Reason} ->
134130
Msg = rabbit_misc:format("failed to set up vhost '~s': ~p",
135131
[VHostPath, Reason]),
@@ -218,10 +214,7 @@ assert_benign({error, not_found}, _) -> ok;
218214
assert_benign({error, {absent, Q, _}}, ActingUser) ->
219215
%% Removing the mnesia entries here is safe. If/when the down node
220216
%% restarts, it will clear out the on-disk storage of the queue.
221-
case rabbit_amqqueue:internal_delete(Q#amqqueue.name, ActingUser) of
222-
ok -> ok;
223-
{error, not_found} -> ok
224-
end.
217+
rabbit_amqqueue:internal_delete(Q#amqqueue.name, ActingUser).
225218

226219
internal_delete(VHostPath, ActingUser) ->
227220
[ok = rabbit_auth_backend_internal:clear_permissions(

0 commit comments

Comments
 (0)