Optimisation: store vhost in gen_event state
Avoids the contention created in the application manager by get_env [#160943793]
This commit is contained in:
		
							parent
							
								
									9ab831ee00
								
							
						
					
					
						commit
						53afc1f1d1
					
				|  | @ -27,6 +27,8 @@ | |||
| 
 | ||||
| -define(EXCH_NAME, <<"amq.rabbitmq.event">>). | ||||
| 
 | ||||
| -record(state, {vhost}). | ||||
| 
 | ||||
| -rabbit_boot_step({rabbit_event_exchange, | ||||
|                    [{description, "event exchange"}, | ||||
|                     {mfa,         {?MODULE, register, []}}, | ||||
|  | @ -50,19 +52,24 @@ unregister() -> | |||
|     gen_event:delete_handler(rabbit_event, ?MODULE, []). | ||||
| 
 | ||||
| exchange() -> | ||||
|     VHost = ensure_vhost_exists(), | ||||
|     exchange(get_vhost()). | ||||
| 
 | ||||
| exchange(VHost) -> | ||||
|     _ = ensure_vhost_exists(VHost), | ||||
|     rabbit_misc:r(VHost, exchange, ?EXCH_NAME). | ||||
| 
 | ||||
| %%---------------------------------------------------------------------------- | ||||
| 
 | ||||
| init([]) -> {ok, []}. | ||||
| init([]) -> | ||||
|     VHost = get_vhost(), | ||||
|     {ok, #state{vhost = VHost}}. | ||||
| 
 | ||||
| handle_call(_Request, State) -> {ok, not_understood, State}. | ||||
| 
 | ||||
| handle_event(#event{type      = Type, | ||||
|                     props     = Props, | ||||
|                     timestamp = TS, | ||||
|                     reference = none}, State) -> | ||||
|                     reference = none}, #state{vhost = VHost} = State) -> | ||||
|     case key(Type) of | ||||
|         ignore -> ok; | ||||
|         Key    -> | ||||
|  | @ -75,7 +82,7 @@ handle_event(#event{type      = Type, | |||
|                                       %% resolution, not millisecond. | ||||
|                                       timestamp = erlang:convert_time_unit( | ||||
|                                                     TS, milli_seconds, seconds)}, | ||||
|                   Msg = rabbit_basic:message(exchange(), Key, PBasic, <<>>), | ||||
|             Msg = rabbit_basic:message(exchange(VHost), Key, PBasic, <<>>), | ||||
|                   rabbit_basic:publish( | ||||
|                     rabbit_basic:delivery(false, false, Msg, undefined)) | ||||
|     end, | ||||
|  | @ -91,19 +98,11 @@ code_change(_OldVsn, State, _Extra) -> {ok, State}. | |||
| 
 | ||||
| %%---------------------------------------------------------------------------- | ||||
| 
 | ||||
| ensure_vhost_exists() -> | ||||
|     VHost = case application:get_env(rabbitmq_event_exchange, vhost) of | ||||
|                 undefined -> | ||||
|                     {ok, V} = application:get_env(rabbit, default_vhost), | ||||
|                     V; | ||||
|                 {ok, V} -> | ||||
|                     V | ||||
|             end, | ||||
| ensure_vhost_exists(VHost) -> | ||||
|     case rabbit_vhost:exists(VHost) of | ||||
|         false -> rabbit_vhost:add(VHost, ?INTERNAL_USER); | ||||
|         _     -> ok | ||||
|     end, | ||||
|     VHost. | ||||
|     end. | ||||
| 
 | ||||
| %% pattern matching is way more efficient that the string operations, | ||||
| %% let's use all the keys we're aware of to speed up the handler. | ||||
|  | @ -220,3 +219,12 @@ fmt(V)                    -> {longstr, | |||
| 
 | ||||
| a2b(A) when is_atom(A)   -> atom_to_binary(A, utf8); | ||||
| a2b(B) when is_binary(B) -> B. | ||||
| 
 | ||||
| get_vhost() -> | ||||
|     case application:get_env(rabbitmq_event_exchange, vhost) of | ||||
|         undefined -> | ||||
|             {ok, V} = application:get_env(rabbit, default_vhost), | ||||
|             V; | ||||
|         {ok, V} -> | ||||
|             V | ||||
|     end. | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue