rabbit_registry: Allow register/unregister to fail, return {error,_}
This commit is contained in:
parent
178f5a94f1
commit
ce2183504d
|
@ -34,7 +34,7 @@ start_link() ->
|
||||||
Class :: atom(),
|
Class :: atom(),
|
||||||
TypeName :: binary(),
|
TypeName :: binary(),
|
||||||
ModuleName :: module(),
|
ModuleName :: module(),
|
||||||
Ret :: ok.
|
Ret :: ok | {error, Reason :: any()}.
|
||||||
|
|
||||||
register(Class, TypeName, ModuleName) ->
|
register(Class, TypeName, ModuleName) ->
|
||||||
gen_server:call(?SERVER, {register, Class, TypeName, ModuleName}, infinity).
|
gen_server:call(?SERVER, {register, Class, TypeName, ModuleName}, infinity).
|
||||||
|
@ -42,7 +42,7 @@ register(Class, TypeName, ModuleName) ->
|
||||||
-spec register_many(Classes, ModuleName) -> Ret when
|
-spec register_many(Classes, ModuleName) -> Ret when
|
||||||
Classes :: [{atom(), binary()}],
|
Classes :: [{atom(), binary()}],
|
||||||
ModuleName :: module(),
|
ModuleName :: module(),
|
||||||
Ret :: ok.
|
Ret :: ok | {error, Reason :: any()}.
|
||||||
%% @doc A wrapper around `register/3' which short-circuits and returns an
|
%% @doc A wrapper around `register/3' which short-circuits and returns an
|
||||||
%% error if any class cannot be registered.
|
%% error if any class cannot be registered.
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ register_many(Classes, ModuleName) ->
|
||||||
-spec unregister(Class, TypeName) -> Ret when
|
-spec unregister(Class, TypeName) -> Ret when
|
||||||
Class :: atom(),
|
Class :: atom(),
|
||||||
TypeName :: binary(),
|
TypeName :: binary(),
|
||||||
Ret :: ok.
|
Ret :: ok | {error, Reason :: any()}.
|
||||||
|
|
||||||
unregister(Class, TypeName) ->
|
unregister(Class, TypeName) ->
|
||||||
gen_server:call(?SERVER, {unregister, Class, TypeName}, infinity).
|
gen_server:call(?SERVER, {unregister, Class, TypeName}, infinity).
|
||||||
|
@ -63,7 +63,7 @@ unregister(Class, TypeName) ->
|
||||||
-spec unregister_many(Classes) -> Ret
|
-spec unregister_many(Classes) -> Ret
|
||||||
when
|
when
|
||||||
Classes :: [{atom(), binary()}],
|
Classes :: [{atom(), binary()}],
|
||||||
Ret :: ok.
|
Ret :: ok | {error, Reason :: any()}.
|
||||||
%% @doc A wrapper around `unregister/2' which short-circuits and returns an
|
%% @doc A wrapper around `unregister/2' which short-circuits and returns an
|
||||||
%% error if any class cannot be unregistered.
|
%% error if any class cannot be unregistered.
|
||||||
|
|
||||||
|
@ -111,18 +111,20 @@ internal_register(Class, TypeName, ModuleName)
|
||||||
ClassModule = class_module(Class),
|
ClassModule = class_module(Class),
|
||||||
Type = internal_binary_to_type(TypeName),
|
Type = internal_binary_to_type(TypeName),
|
||||||
RegArg = {{Class, Type}, ModuleName},
|
RegArg = {{Class, Type}, ModuleName},
|
||||||
ok = sanity_check_module(ClassModule, ModuleName),
|
case sanity_check_module(ClassModule, ModuleName) of
|
||||||
true = ets:insert(?ETS_NAME, RegArg),
|
ok ->
|
||||||
ok = ClassModule:added_to_rabbit_registry(Type, ModuleName),
|
true = ets:insert(?ETS_NAME, RegArg),
|
||||||
ok.
|
ClassModule:added_to_rabbit_registry(Type, ModuleName);
|
||||||
|
{error, _} = Err ->
|
||||||
|
Err
|
||||||
|
end.
|
||||||
|
|
||||||
internal_unregister(Class, TypeName) ->
|
internal_unregister(Class, TypeName) ->
|
||||||
ClassModule = class_module(Class),
|
ClassModule = class_module(Class),
|
||||||
Type = internal_binary_to_type(TypeName),
|
Type = internal_binary_to_type(TypeName),
|
||||||
UnregArg = {Class, Type},
|
UnregArg = {Class, Type},
|
||||||
true = ets:delete(?ETS_NAME, UnregArg),
|
true = ets:delete(?ETS_NAME, UnregArg),
|
||||||
ok = ClassModule:removed_from_rabbit_registry(Type),
|
ClassModule:removed_from_rabbit_registry(Type).
|
||||||
ok.
|
|
||||||
|
|
||||||
sanity_check_module(ClassModule, Module) ->
|
sanity_check_module(ClassModule, Module) ->
|
||||||
case catch lists:member(ClassModule,
|
case catch lists:member(ClassModule,
|
||||||
|
@ -160,12 +162,10 @@ init([]) ->
|
||||||
{ok, none}.
|
{ok, none}.
|
||||||
|
|
||||||
handle_call({register, Class, TypeName, ModuleName}, _From, State) ->
|
handle_call({register, Class, TypeName, ModuleName}, _From, State) ->
|
||||||
ok = internal_register(Class, TypeName, ModuleName),
|
{reply, internal_register(Class, TypeName, ModuleName), State};
|
||||||
{reply, ok, State};
|
|
||||||
|
|
||||||
handle_call({unregister, Class, TypeName}, _From, State) ->
|
handle_call({unregister, Class, TypeName}, _From, State) ->
|
||||||
ok = internal_unregister(Class, TypeName),
|
{reply, internal_unregister(Class, TypeName), State};
|
||||||
{reply, ok, State};
|
|
||||||
|
|
||||||
handle_call(Request, _From, State) ->
|
handle_call(Request, _From, State) ->
|
||||||
{stop, {unhandled_call, Request}, State}.
|
{stop, {unhandled_call, Request}, State}.
|
||||||
|
|
Loading…
Reference in New Issue