You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
134 lines
4.4 KiB
134 lines
4.4 KiB
From: Peter Lemenkov <lemenkov@gmail.com> |
|
Date: Thu, 19 May 2016 16:04:56 +0300 |
|
Subject: [PATCH] Remove excessive sd_notify code |
|
|
|
Signed-off-by: Peter Lemenkov <lemenkov@gmail.com> |
|
|
|
diff --git a/src/rabbit.erl b/src/rabbit.erl |
|
index d30542a6f..c0bbdbaa2 100644 |
|
--- a/src/rabbit.erl |
|
+++ b/src/rabbit.erl |
|
@@ -352,123 +352,9 @@ broker_start() -> |
|
Plugins = rabbit_plugins:setup(), |
|
ToBeLoaded = Plugins ++ ?APPS, |
|
start_apps(ToBeLoaded), |
|
- maybe_sd_notify(), |
|
ok = rabbit_lager:broker_is_started(), |
|
ok = log_broker_started(rabbit_plugins:strictly_plugins(rabbit_plugins:active())). |
|
|
|
-%% Try to send systemd ready notification if it makes sense in the |
|
-%% current environment. standard_error is used intentionally in all |
|
-%% logging statements, so all this messages will end in systemd |
|
-%% journal. |
|
-maybe_sd_notify() -> |
|
- case sd_notify_ready() of |
|
- false -> |
|
- io:format(standard_error, "systemd READY notification failed, beware of timeouts~n", []); |
|
- _ -> |
|
- ok |
|
- end. |
|
- |
|
-sd_notify_ready() -> |
|
- case {os:type(), os:getenv("NOTIFY_SOCKET")} of |
|
- {{win32, _}, _} -> |
|
- true; |
|
- {_, [_|_]} -> %% Non-empty NOTIFY_SOCKET, give it a try |
|
- sd_notify_legacy() orelse sd_notify_socat(); |
|
- _ -> |
|
- true |
|
- end. |
|
- |
|
-sd_notify_data() -> |
|
- "READY=1\nSTATUS=Initialized\nMAINPID=" ++ os:getpid() ++ "\n". |
|
- |
|
-sd_notify_legacy() -> |
|
- case code:load_file(sd_notify) of |
|
- {module, sd_notify} -> |
|
- SDNotify = sd_notify, |
|
- SDNotify:sd_notify(0, sd_notify_data()), |
|
- true; |
|
- {error, _} -> |
|
- false |
|
- end. |
|
- |
|
-%% socat(1) is the most portable way the sd_notify could be |
|
-%% implemented in erlang, without introducing some NIF. Currently the |
|
-%% following issues prevent us from implementing it in a more |
|
-%% reasonable way: |
|
-%% - systemd-notify(1) is unstable for non-root users |
|
-%% - erlang doesn't support unix domain sockets. |
|
-%% |
|
-%% Some details on how we ended with such a solution: |
|
-%% https://github.com/rabbitmq/rabbitmq-server/issues/664 |
|
-sd_notify_socat() -> |
|
- case sd_current_unit() of |
|
- {ok, Unit} -> |
|
- io:format(standard_error, "systemd unit for activation check: \"~s\"~n", [Unit]), |
|
- sd_notify_socat(Unit); |
|
- _ -> |
|
- false |
|
- end. |
|
- |
|
-socat_socket_arg("@" ++ AbstractUnixSocket) -> |
|
- "abstract-sendto:" ++ AbstractUnixSocket; |
|
-socat_socket_arg(UnixSocket) -> |
|
- "unix-sendto:" ++ UnixSocket. |
|
- |
|
-sd_open_port() -> |
|
- open_port( |
|
- {spawn_executable, os:find_executable("socat")}, |
|
- [{args, [socat_socket_arg(os:getenv("NOTIFY_SOCKET")), "STDIO"]}, |
|
- use_stdio, out]). |
|
- |
|
-sd_notify_socat(Unit) -> |
|
- try sd_open_port() of |
|
- Port -> |
|
- Port ! {self(), {command, sd_notify_data()}}, |
|
- Result = sd_wait_activation(Port, Unit), |
|
- port_close(Port), |
|
- Result |
|
- catch |
|
- Class:Reason -> |
|
- io:format(standard_error, "Failed to start socat ~p:~p~n", [Class, Reason]), |
|
- false |
|
- end. |
|
- |
|
-sd_current_unit() -> |
|
- CmdOut = os:cmd("ps -o unit= -p " ++ os:getpid()), |
|
- case catch re:run(CmdOut, "([-.@0-9a-zA-Z]+)", [unicode, {capture, all_but_first, list}]) of |
|
- {'EXIT', _} -> |
|
- error; |
|
- {match, [Unit]} -> |
|
- {ok, Unit}; |
|
- _ -> |
|
- error |
|
- end. |
|
- |
|
-sd_wait_activation(Port, Unit) -> |
|
- case os:find_executable("systemctl") of |
|
- false -> |
|
- io:format(standard_error, "'systemctl' unavailable, falling back to sleep~n", []), |
|
- timer:sleep(5000), |
|
- true; |
|
- _ -> |
|
- sd_wait_activation(Port, Unit, 10) |
|
- end. |
|
- |
|
-sd_wait_activation(_, _, 0) -> |
|
- io:format(standard_error, "Service still in 'activating' state, bailing out~n", []), |
|
- false; |
|
-sd_wait_activation(Port, Unit, AttemptsLeft) -> |
|
- case os:cmd("systemctl show --property=ActiveState -- '" ++ Unit ++ "'") of |
|
- "ActiveState=activating\n" -> |
|
- timer:sleep(1000), |
|
- sd_wait_activation(Port, Unit, AttemptsLeft - 1); |
|
- "ActiveState=" ++ _ -> |
|
- true; |
|
- _ = Err-> |
|
- io:format(standard_error, "Unexpected status from systemd ~p~n", [Err]), |
|
- false |
|
- end. |
|
- |
|
start_it(StartFun) -> |
|
Marker = spawn_link(fun() -> receive stop -> ok end end), |
|
case catch register(rabbit_boot, Marker) of
|
|
|