rabbit_registry: Allow register/unregister to fail, return {error,_}

This commit is contained in:
Michael Davis 2024-07-17 12:07:15 -04:00
parent 178f5a94f1
commit ce2183504d
No known key found for this signature in database
1 changed files with 14 additions and 14 deletions

View File

@ -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}.