[PATCH] systemd restart retries on failure

Cristian Patrascu cristian.patrascu at windriver.com
Tue Jul 5 01:11:34 PDT 2011


---
 src/dbus-service.c  |    4 ++++
 src/load-fragment.c |    1 +
 src/service.c       |   50 +++++++++++++++++++++++++++++++++++++++++++++++=
++-
 src/service.h       |    3 +++
 src/unit.c          |    4 ++++
 5 files changed, 61 insertions(+), 1 deletions(-)

diff --git a/src/dbus-service.c b/src/dbus-service.c
index 3486623..40e1efe 100644
--- a/src/dbus-service.c
+++ b/src/dbus-service.c
@@ -42,6 +42,8 @@
         "  <property name=3D\"PIDFile\" type=3D\"s\" access=3D\"read\"/>\n=
"   \
         "  <property name=3D\"NotifyAccess\" type=3D\"s\" access=3D\"read\=
"/>\n" \
         "  <property name=3D\"RestartUSec\" type=3D\"t\" access=3D\"read\"=
/>\n" \
+        "  <property name=3D\"MaxRestartRetries\" type=3D\"u\" access=3D\"=
read\"/>\n" \
+        "  <property name=3D\"RestartRetry\" type=3D\"u\" access=3D\"read\=
"/>\n" \
         "  <property name=3D\"TimeoutUSec\" type=3D\"t\" access=3D\"read\"=
/>\n" \
         BUS_EXEC_COMMAND_INTERFACE("ExecStartPre")                      \
         BUS_EXEC_COMMAND_INTERFACE("ExecStart")                         \
@@ -103,6 +105,8 @@ DBusHandlerResult bus_service_message_handler(Unit *u, =
DBusConnection *connectio
                 { "org.freedesktop.systemd1.Service", "PIDFile",          =
      bus_property_append_string, "s", u->service.pid_file                 =
  },
                 { "org.freedesktop.systemd1.Service", "NotifyAccess",     =
      bus_service_append_notify_access, "s", &u->service.notify_access     =
  },
                 { "org.freedesktop.systemd1.Service", "RestartUSec",      =
      bus_property_append_usec,   "t", &u->service.restart_usec            =
  },
+                { "org.freedesktop.systemd1.Service", "MaxRestartRetries",=
      bus_property_append_unsigned, "u", &u->service.restart_retries       =
    },
+                { "org.freedesktop.systemd1.Service", "RestartRetry",     =
      bus_property_append_unsigned, "u", &u->service.restart_current_retry =
        },
                 { "org.freedesktop.systemd1.Service", "TimeoutUSec",      =
      bus_property_append_usec,   "t", &u->service.timeout_usec            =
  },
                 BUS_EXEC_COMMAND_PROPERTY("org.freedesktop.systemd1.Servic=
e", u->service.exec_command[SERVICE_EXEC_START_PRE],  "ExecStartPre"),
                 BUS_EXEC_COMMAND_PROPERTY("org.freedesktop.systemd1.Servic=
e", u->service.exec_command[SERVICE_EXEC_START],      "ExecStart"),
diff --git a/src/load-fragment.c b/src/load-fragment.c
index 56eaed9..7e9efaa 100644
--- a/src/load-fragment.c
+++ b/src/load-fragment.c
@@ -1951,6 +1951,7 @@ static int load_from_path(Unit *u, const char *path) =
{
                 { "TimeoutSec",             config_parse_usec,            =
0, &u->service.timeout_usec,                        "Service" },
                 { "Type",                   config_parse_service_type,    =
0, &u->service.type,                                "Service" },
                 { "Restart",                config_parse_service_restart, =
0, &u->service.restart,                             "Service" },
+                { "MaxRestartRetries",      config_parse_unsigned,        =
0, &u->service.restart_retries,                     "Service" },
                 { "PermissionsStartOnly",   config_parse_bool,            =
0, &u->service.permissions_start_only,              "Service" },
                 { "RootDirectoryStartOnly", config_parse_bool,            =
0, &u->service.root_directory_start_only,           "Service" },
                 { "RemainAfterExit",        config_parse_bool,            =
0, &u->service.remain_after_exit,                   "Service" },
diff --git a/src/service.c b/src/service.c
index d59c4cb..b5159a6 100644
--- a/src/service.c
+++ b/src/service.c
@@ -1151,6 +1151,20 @@ static int service_load(Unit *u) {
                 if (s->meta.default_dependencies)
                         if ((r =3D service_add_default_dependencies(s)) < =
0)
                                 return r;
+
+                /* If the option "RestartRetries=3D" is set then the servi=
ce will be "revived" */
+                if (s->restart_retries > 0) {
+                        /* If the option "Restart=3D" is not set, then for=
 the service to be "revived"
+                           we must set "Restart=3D" to "on-failure" */
+                        if (s->restart =3D=3D SERVICE_RESTART_NO)
+                                s->restart =3D SERVICE_RESTART_ON_FAILURE;
+
+                        /* If the option "Restart=3D" is already set, then=
 for the service to be "revived"
+                           and be restarted on failure we must set "Restar=
t=3D" to "always"
+                           only if it's "on-success" */
+                        else if (s->restart =3D=3D SERVICE_RESTART_ON_SUCC=
ESS)
+                                s->restart =3D SERVICE_RESTART_ALWAYS;
+                }
         }
=20
         return service_verify(s);
@@ -1488,6 +1502,16 @@ static void service_set_state(Service *s, ServiceSta=
te state) {
                 log_debug("%s changed %s -> %s", s->meta.id, service_state=
_to_string(old_state), service_state_to_string(state));
=20
         unit_notify(UNIT(s), state_translation_table[old_state], state_tra=
nslation_table[state], !s->reload_failure);
+
+        /* If service finished, reset restart-retry counter, if applicable=
 */
+        if (old_state !=3D state &&
+            (state =3D=3D SERVICE_DEAD || state =3D=3D SERVICE_FAILED) &&
+            s->restart_current_retry > s->restart_retries) {
+                    log_debug("Service %s entered dead or failed, restart =
retries at max, reset counter (%u -> 0)!",
+                              s->meta.id, s->restart_current_retry);
+                    s->restart_current_retry =3D 0;
+        }
+
         s->reload_failure =3D false;
 }
=20
@@ -2291,6 +2315,7 @@ static int service_start(Unit *u) {
=20
         /* Make sure we don't enter a busy loop of some kind. */
         if (!ratelimit_test(&s->ratelimit)) {
+                s->restart_current_retry =3D 0;
                 log_warning("%s start request repeated too quickly, refusi=
ng to start.", u->meta.id);
                 return -ECANCELED;
         }
@@ -2311,6 +2336,7 @@ static int service_stop(Unit *u) {
=20
         /* This is a user request, so don't do restarts on this
          * shutdown. */
+        s->restart_current_retry =3D 0;
         s->forbid_restart =3D true;
=20
         /* Already on it */
@@ -2411,6 +2437,8 @@ static int service_serialize(Unit *u, FILE *f, FDSet =
*fds) {
                 }
         }
=20
+        unit_serialize_item_format(u, f, "restart-current-retry", "%u", s-=
>restart_current_retry);
+
         return 0;
 }
=20
@@ -2510,6 +2538,13 @@ static int service_deserialize_item(Unit *u, const c=
har *key, const char *value,
                 dual_timestamp_deserialize(value, &s->main_exec_status.sta=
rt_timestamp);
         else if (streq(key, "main-exec-status-exit"))
                 dual_timestamp_deserialize(value, &s->main_exec_status.exi=
t_timestamp);
+        else if (streq(key, "restart-current-retry")) {
+                unsigned i;
+                if (safe_atou(value, &i) < 0)
+                        log_debug("Failed to parse restart-current-retry %=
s", value);
+                else
+                        s->restart_current_retry =3D i;
+        }
         else
                 log_debug("Unknown serialization key '%s'", key);
=20
@@ -2604,6 +2639,11 @@ static void service_sigchld_event(Unit *u, pid_t pid=
, int code, int status) {
                          * gone. */
                         s->main_command =3D NULL;
=20
+                        if (success && s->restart_current_retry) {
+                                log_debug("%s changed restart_crt_retry fr=
om %u to 0", s->meta.id, s->restart_current_retry);
+                                s->restart_current_retry =3D 0;
+                        }
+
                         switch (s->state) {
=20
                         case SERVICE_START_POST:
@@ -2832,7 +2872,15 @@ static void service_timer_event(Unit *u, uint64_t el=
apsed, Watch* w) {
                 break;
=20
         case SERVICE_AUTO_RESTART:
-                log_info("%s holdoff time over, scheduling restart.", u->m=
eta.id);
+                if (s->restart_retries > 0) {
+                        s->restart_current_retry ++;
+                        if (s->restart_current_retry > s->restart_retries)=
 {
+                                log_warning("%s maximum number of restarti=
ng retries reached. Stopping.", s->meta.id);
+                                service_enter_dead(s, true, false);
+                                break;
+                        }
+                }
+                log_info("%s holdoff time over, scheduling restart (retry =
%u of %u).", u->meta.id, s->restart_current_retry, s->restart_retries);
                 service_enter_restart(s);
                 break;
=20
diff --git a/src/service.h b/src/service.h
index 55b9513..1d6c42c 100644
--- a/src/service.h
+++ b/src/service.h
@@ -92,6 +92,9 @@ struct Service {
         ServiceType type;
         ServiceRestart restart;
=20
+        unsigned restart_retries;
+        unsigned restart_current_retry;
+
         /* If set we'll read the main daemon PID from this file */
         char *pid_file;
=20
diff --git a/src/unit.c b/src/unit.c
index 9bb4e56..2ae63d1 100644
--- a/src/unit.c
+++ b/src/unit.c
@@ -1114,6 +1114,10 @@ void unit_trigger_on_failure(Unit *u) {
         if (set_size(u->meta.dependencies[UNIT_ON_FAILURE]) <=3D 0)
                 return;
=20
+        if (u->meta.type =3D=3D UNIT_SERVICE &&
+                u->service.restart_current_retry <=3D u->service.restart_r=
etries)
+                return;
+
         log_info("Triggering OnFailure=3D dependencies of %s.", u->meta.id=
);
=20
         SET_FOREACH(other, u->meta.dependencies[UNIT_ON_FAILURE], i) {
--=20
1.7.0.4


________________________________________
From: Lennart Poettering [lennart at poettering.net]
Sent: Monday, July 04, 2011 8:35 PM
To: Patrascu, Cristian
Cc: Zaharia, Adrian; systemd-devel at lists.freedesktop.org
Subject: Re: [systemd-devel] [PATCH] systemd restart patch

On Mon, 04.07.11 18:18, Cristian Patrascu (Cristian.Patrascu at windriver.com)=
 wrote:

>
> Thank you for your observations and interest!
>
> So I made some modifications:
> - changed restart variables to unsigned
> - changed to 0 as default (not -1, also dropped the define)
> - moved counter reset from unit.c to service.c (after unit_notify call)
> - because the "OnFailure" unit is triggered in unit.c, I still left
> the checking before that.
> - updated coding style
> - added restart counter (de)serialization

heya,

Can you please post this patch properly formatted with git's
format-patch command and not with line breaking added by your mailer?
Otherwise I have trouble reviewing and applying your patch!

Thanks,

Lennart

>
> The patch is for the same branch
> (3661ac04b4f2840d3345605aa35963bbde3c469d) as before:
>
> Index: systemd-29/src/dbus-service.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> --- systemd-29.orig/src/dbus-service.c    2011-07-04
> 16:19:37.000000000 +0300
> +++ systemd-29/src/dbus-service.c    2011-07-04 17:07:09.971651549 +0300
> @@ -42,6 +42,8 @@
>          " <property name=3D\"PIDFile\" type=3D\"s\" access=3D\"read\"/>\=
n"   \
>          " <property name=3D\"NotifyAccess\" type=3D\"s\"
> access=3D\"read\"/>\n" \
>          " <property name=3D\"RestartUSec\" type=3D\"t\" access=3D\"read\=
"/>\n" \
> +        " <property name=3D\"MaxRestartRetries\" type=3D\"u\"
> access=3D\"read\"/>\n" \
> +        " <property name=3D\"RestartRetry\" type=3D\"u\" access=3D\"read=
\"/>\n" \
>          " <property name=3D\"TimeoutUSec\" type=3D\"t\" access=3D\"read\=
"/>\n" \
>          BUS_EXEC_COMMAND_INTERFACE("ExecStartPre")                      =
\
>          BUS_EXEC_COMMAND_INTERFACE("ExecStart")                         =
\
> @@ -103,6 +105,8 @@
>                  { "org.freedesktop.systemd1.Service", "PIDFile",
> bus_property_append_string, "s", u->service.pid_file
> },
>                  { "org.freedesktop.systemd1.Service",
> "NotifyAccess",           bus_service_append_notify_access, "s",
> &u->service.notify_access       },
>                  { "org.freedesktop.systemd1.Service",
> "RestartUSec",            bus_property_append_usec,   "t",
> &u->service.restart_usec              },
> +                { "org.freedesktop.systemd1.Service",
> "MaxRestartRetries",      bus_property_append_unsigned, "u",
> &u->service.restart_retries           },
> +                { "org.freedesktop.systemd1.Service",
> "RestartRetry",           bus_property_append_unsigned, "u",
> &u->service.restart_current_retry         },
>                  { "org.freedesktop.systemd1.Service",
> "TimeoutUSec",            bus_property_append_usec,   "t",
> &u->service.timeout_usec              },

> BUS_EXEC_COMMAND_PROPERTY("org.freedesktop.systemd1.Service",
> u->service.exec_command[SERVICE_EXEC_START_PRE],  "ExecStartPre"),

> BUS_EXEC_COMMAND_PROPERTY("org.freedesktop.systemd1.Service",
> u->service.exec_command[SERVICE_EXEC_START],      "ExecStart"),
> Index: systemd-29/src/load-fragment.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> --- systemd-29.orig/src/load-fragment.c    2011-07-04
> 16:19:37.000000000 +0300
> +++ systemd-29/src/load-fragment.c    2011-07-04 17:07:09.975651196 +0300
> @@ -1951,6 +1951,7 @@
>                  { "TimeoutSec",             config_parse_usec,
> 0, &u->service.timeout_usec,                        "Service" },
>                  { "Type",
> config_parse_service_type,    0, &u->service.type,
> "Service" },
>                  { "Restart",
> config_parse_service_restart, 0, &u->service.restart,
> "Service" },
> +                { "MaxRestartRetries",      config_parse_unsigned,
> 0, &u->service.restart_retries,                     "Service" },
>                  { "PermissionsStartOnly",   config_parse_bool,
> 0, &u->service.permissions_start_only,              "Service" },
>                  { "RootDirectoryStartOnly", config_parse_bool,
> 0, &u->service.root_directory_start_only,           "Service" },
>                  { "RemainAfterExit",        config_parse_bool,
> 0, &u->service.remain_after_exit,                   "Service" },
> Index: systemd-29/src/service.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> --- systemd-29.orig/src/service.c    2011-07-04 16:19:37.000000000 +0300
> +++ systemd-29/src/service.c    2011-07-04 17:14:32.823465057 +0300
> @@ -1151,6 +1166,20 @@
>                  if (s->meta.default_dependencies)
>                          if ((r =3D service_add_default_dependencies(s)) =
< 0)
>                                  return r;
> +
> +                /* If the option "RestartRetries=3D" is set then the
> service will be "revived" */
> +                if (s->restart_retries > 0) {
> +                        /* If the option "Restart=3D" is not set,
> then for the service to be "revived"
> +                           we must set "Restart=3D" to "on-failure" */
> +                        if (s->restart =3D=3D SERVICE_RESTART_NO)
> +                                s->restart =3D SERVICE_RESTART_ON_FAILUR=
E;
> +
> +                        /* If the option "Restart=3D" is already set,
> then for the service to be "revived"
> +                           and be restarted on failure we must set
> "Restart=3D" to "always"
> +                           only if it's "on-success" */
> +                        else if (s->restart =3D=3D SERVICE_RESTART_ON_SU=
CCESS)
> +                                s->restart =3D SERVICE_RESTART_ALWAYS;
> +                }
>          }
>
>          return service_verify(s);
> @@ -1488,6 +1517,16 @@
>                  log_debug("%s changed %s -> %s", s->meta.id,
> service_state_to_string(old_state), service_state_to_string(state));
>
>          unit_notify(UNIT(s), state_translation_table[old_state],
> state_translation_table[state], !s->reload_failure);
> +
> +        /* If service finished, reset restart-retry counter, if
> applicable */
> +        if (old_state !=3D state &&
> +            (state =3D=3D SERVICE_DEAD || state =3D=3D SERVICE_FAILED) &=
&
> +            s->restart_current_retry > s->restart_retries) {
> +                    log_debug("Service %s entered dead or failed,
> restart retries at max, reset counter (%u -> 0)!",
> +                              s->meta.id, s->restart_current_retry);
> +                    s->restart_current_retry =3D 0;
> +        }
> +
>          s->reload_failure =3D false;
>  }
>
> @@ -2291,6 +2330,7 @@
>
>          /* Make sure we don't enter a busy loop of some kind. */
>          if (!ratelimit_test(&s->ratelimit)) {
> +                s->restart_current_retry =3D 0;
>                  log_warning("%s start request repeated too quickly,
> refusing to start.", u->meta.id);
>                  return -ECANCELED;
>          }
> @@ -2311,6 +2351,7 @@
>
>          /* This is a user request, so don't do restarts on this
>           * shutdown. */
> +        s->restart_current_retry =3D 0;
>          s->forbid_restart =3D true;
>
>          /* Already on it */
> @@ -2411,6 +2452,8 @@
>                  }
>          }
>
> +        unit_serialize_item_format(u, f, "restart-current-retry",
> "%u", s->restart_current_retry);
> +
>          return 0;
>  }
>
> @@ -2510,6 +2553,13 @@
>                  dual_timestamp_deserialize(value,
> &s->main_exec_status.start_timestamp);
>          else if (streq(key, "main-exec-status-exit"))
>                  dual_timestamp_deserialize(value,
> &s->main_exec_status.exit_timestamp);
> +        else if (streq(key, "restart-current-retry")) {
> +                unsigned i;
> +                if (safe_atou(value, &i) < 0)
> +                        log_debug("Failed to parse
> restart-current-retry %s", value);
> +                else
> +                        s->restart_current_retry =3D i;
> +        }
>          else
>                  log_debug("Unknown serialization key '%s'", key);
>
> @@ -2604,6 +2654,11 @@
>                           * gone. */
>                          s->main_command =3D NULL;
>
> +                        if (success && s->restart_current_retry) {
> +                                log_debug("%s changed
> restart_crt_retry from %u to 0", s->meta.id,
> s->restart_current_retry);
> +                                s->restart_current_retry =3D 0;
> +                        }
> +
>                          switch (s->state) {
>
>                          case SERVICE_START_POST:
> @@ -2832,7 +2887,15 @@
>                  break;
>
>          case SERVICE_AUTO_RESTART:
> -                log_info("%s holdoff time over, scheduling
> restart.", u->meta.id);
> +                if (s->restart_retries > 0) {
> +                        s->restart_current_retry ++;
> +                        if (s->restart_current_retry >
> s->restart_retries) {
> +                                log_warning("%s maximum number of
> restarting retries reached. Stopping.", s->meta.id);
> +                                service_enter_dead(s, true, false);
> +                                break;
> +                        }
> +                }
> +                log_info("%s holdoff time over, scheduling restart
> (retry %u of %u).", u->meta.id, s->restart_current_retry,
> s->restart_retries);
>                  service_enter_restart(s);
>                  break;
>
> Index: systemd-29/src/service.h
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> --- systemd-29.orig/src/service.h    2011-07-04 16:19:37.000000000 +0300
> +++ systemd-29/src/service.h    2011-07-04 17:07:09.975651196 +0300
> @@ -92,6 +92,9 @@
>          ServiceType type;
>          ServiceRestart restart;
>
> +        unsigned restart_retries;
> +        unsigned restart_current_retry;
> +
>          /* If set we'll read the main daemon PID from this file */
>          char *pid_file;
>
> Index: systemd-29/src/unit.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> --- systemd-29.orig/src/unit.c    2011-07-04 16:19:37.000000000 +0300
> +++ systemd-29/src/unit.c    2011-07-04 17:07:09.979652060 +0300
> @@ -1114,6 +1114,10 @@
>          if (set_size(u->meta.dependencies[UNIT_ON_FAILURE]) <=3D 0)
>                  return;
>
> +        if (u->meta.type =3D=3D UNIT_SERVICE &&
> +                u->service.restart_current_retry <=3D
> u->service.restart_retries)
> +                return;
> +
>          log_info("Triggering OnFailure=3D dependencies of %s.", u->meta.=
id);
>
>          SET_FOREACH(other, u->meta.dependencies[UNIT_ON_FAILURE], i) {
>
>
> On 07/02/2011 03:21 AM, Lennart Poettering wrote:
> >On Fri, 01.07.11 15:35, Cristian Patrascu (Cristian.Patrascu at windriver.c=
om) wrote:
> >
> >Heya!
> >
> >(BTW, got your first post of this patch too, just didn't find the time
> >to review the patch, sorry. It was still in my mail queue however.)
> >
> >>      After "x" restarts have happened, the "OnFailure" unit will start
> >>(if specified) but only after all unsuccessfull restarts (after "x"
> >>restarts reached).
> >Patch looks pretty good. A few comments though.
> >>This patch is made for systemd-29, on master branch with SHA1 ID:
> >>3661ac04b4f2840d3345605aa35963bbde3c469d
> >>
> >>________systemd-restart-on-fail.patch : _______________________________
> >>
> >>Index: systemd-29/src/dbus-service.c
> >>=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> >>--- systemd-29.orig/src/dbus-service.c      2011-06-22 10:47:14.0000000=
00 +0300
> >>+++ systemd-29/src/dbus-service.c   2011-06-22 13:48:51.292321742 +0300
> >>@@ -42,6 +42,8 @@
> >>          "<property name=3D\"PIDFile\" type=3D\"s\" access=3D\"read\"/=
>\n"   \
> >>          "<property name=3D\"NotifyAccess\" type=3D\"s\" access=3D\"re=
ad\"/>\n" \
> >>          "<property name=3D\"RestartUSec\" type=3D\"t\" access=3D\"rea=
d\"/>\n" \
> >>+        "<property name=3D\"MaxRestartRetries\" type=3D\"i\" access=3D=
\"read\"/>\n" \
> >>+        "<property name=3D\"RestartRetry\" type=3D\"i\"
> >>access=3D\"read\"/>\n" \
> >I Think it would make sense to make both of these unsigned, in order to
> >avoid confusion whether these actually ever can be negative.
> >
> >If I read your patch correctly right now MaxRestartRetries=3D-1 means th=
at
> >there is no limit on the number of retries. I'd use 0 for that instead
> >(0 is not needed to indicate disabling, since we can indicate that with
> >Restart=3Dno already.)
> >
> >>+        s->restart_retries =3D DEFAULT_RESTART_RETRIES;
> >>+        s->restart_crt_retry =3D 0;
> >We generally try not to abbrievate variables unnecessarily, so I'd sugge=
st
> >to call this variable "restart_current_retry" or so.
> >
> >>  #ifdef HAVE_SYSV_COMPAT
> >>          s->sysv_start_priority =3D -1;
> >>          s->sysv_start_priority_from_rcnd =3D -1;
> >>@@ -1151,6 +1153,22 @@
> >>                  if (s->meta.default_dependencies)
> >>                          if ((r =3D service_add_default_dependencies(s=
))<   0)
> >>                                  return r;
> >>+
> >>+                /* If the option "RestartRetries=3D" is set then the s=
ervice will be "revived" */
> >>+                if (s->restart_retries !=3D DEFAULT_RESTART_RETRIES){
> >>+                        /* If the option "Restart=3D" is not set, then=
 for the service to be "revived"
> >>+                           we must set "Restart=3D" to "on-failure" */
> >>+                        if (s->restart =3D=3D SERVICE_RESTART_NO){
> >>+                                s->restart =3D SERVICE_RESTART_ON_FAIL=
URE;
> >>+                        }
> >Please follow coding style. We generally place no {} brackets around
> >single line blocks.
> >
> >>          case SERVICE_AUTO_RESTART:
> >>-                log_info("%s holdoff time over, scheduling restart.", =
u->meta.id);
> >>+                if (0<=3D s->restart_retries){
> >Please follow coding style, compare variables with constants not
> >constants with variables. Also, please place spaces before the<=3D and
> >the {.
> >
> >>+        if (u->meta.type =3D=3D UNIT_SERVICE&&
> >>+                u->service.restart_crt_retry<=3D u->service.restart_re=
tries)
> >>+                return;
> >>+
> >Huhm, I wonder if we could fine a better place for this, not sure where =
though.
> >
> >>          log_info("Triggering OnFailure=3D dependencies of %s.", u->me=
ta.id);
> >>
> >>          SET_FOREACH(other, u->meta.dependencies[UNIT_ON_FAILURE], i) =
{
> >>@@ -1245,6 +1249,17 @@
> >>                          log_notice("Unit %s entered failed state.", u=
->meta.id);
> >>                          unit_trigger_on_failure(u);
> >>                  }
> >>+
> >>+                /* When a unit is of type service and has finished,
> >>+                   reset restart-retry counter, if applicable */
> >>+                if (ns !=3D os&&
> >>+                    u->meta.type =3D=3D UNIT_SERVICE&&
> >>+                    UNIT_IS_INACTIVE_OR_FAILED(ns)&&
> >>+                    u->service.restart_crt_retry>   u->service.restart=
_retries ){
> >>+                            log_debug("Unit %s entered inactive or fai=
led, restart retries at max, reset counter (%d ->   0)!",
> >>+                                      u->meta.id, u->service.restart_c=
rt_retry, u->service.restart_retries);
> >>+                            u->service.restart_crt_retry =3D 0;
> >Hmm, I think it would be nicer to reset this counter in service.c only, =
not
> >in the generic code. I'd like to avoid that we access too many
> >service-private fields from generic unit code.
> >
> >>  #include "execute.h"
> >>  #include "condition.h"
> >>
> >>+/* default =3D infinite retries (=3D systemd behaviour not patched) */
> >>+#define DEFAULT_RESTART_RETRIES -1
> >>+
> >Hee, if I commit this, then it won't be patched anymore, so the comment
> >should not refer to it being unpatched ;-)
> >
> >Patch looks quite OK in general.
> >
> >Thanks for the work,
> >
> >Lennart


Lennart

--
Lennart Poettering - Red Hat, Inc.

--_002_15156629E4E7ED4B92E7DE56896C43B60E41B784ALAMBBcorpadwrs_
Content-Type: text/x-patch;
	name="0001-systemd-restart-retries-on-failure.patch"
Content-Description: 0001-systemd-restart-retries-on-failure.patch
Content-Disposition: attachment;
	filename="0001-systemd-restart-retries-on-failure.patch"; size=9949;
	creation-date="Tue, 05 Jul 2011 08:28:14 GMT";
	modification-date="Tue, 05 Jul 2011 08:28:14 GMT"
Content-Transfer-Encoding: base64

RnJvbSA0ZDBjN2RjNDM5NDMwZjU5MmU1YzYyNTFkOTFlMTYyZDIxOTEyNzdkIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBDcmlzdGlhbiBQYXRyYXNjdSA8Y3Jpc3RpYW4ucGF0cmFzY3VA
d2luZHJpdmVyLmNvbT4KRGF0ZTogVHVlLCA1IEp1bCAyMDExIDExOjExOjM0ICswMzAwClN1Ympl
Y3Q6IFtQQVRDSF0gc3lzdGVtZCByZXN0YXJ0IHJldHJpZXMgb24gZmFpbHVyZQoKLS0tCiBzcmMv
ZGJ1cy1zZXJ2aWNlLmMgIHwgICAgNCArKysrCiBzcmMvbG9hZC1mcmFnbWVudC5jIHwgICAgMSAr
CiBzcmMvc2VydmljZS5jICAgICAgIHwgICA1MCArKysrKysrKysrKysrKysrKysrKysrKysrKysr
KysrKysrKysrKysrKysrKysrKysrLQogc3JjL3NlcnZpY2UuaCAgICAgICB8ICAgIDMgKysrCiBz
cmMvdW5pdC5jICAgICAgICAgIHwgICAgNCArKysrCiA1IGZpbGVzIGNoYW5nZWQsIDYxIGluc2Vy
dGlvbnMoKyksIDEgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2RidXMtc2VydmljZS5j
IGIvc3JjL2RidXMtc2VydmljZS5jCmluZGV4IDM0ODY2MjMuLjQwZTFlZmUgMTAwNjQ0Ci0tLSBh
L3NyYy9kYnVzLXNlcnZpY2UuYworKysgYi9zcmMvZGJ1cy1zZXJ2aWNlLmMKQEAgLTQyLDYgKzQy
LDggQEAKICAgICAgICAgIiAgPHByb3BlcnR5IG5hbWU9XCJQSURGaWxlXCIgdHlwZT1cInNcIiBh
Y2Nlc3M9XCJyZWFkXCIvPlxuIiAgIFwKICAgICAgICAgIiAgPHByb3BlcnR5IG5hbWU9XCJOb3Rp
ZnlBY2Nlc3NcIiB0eXBlPVwic1wiIGFjY2Vzcz1cInJlYWRcIi8+XG4iIFwKICAgICAgICAgIiAg
PHByb3BlcnR5IG5hbWU9XCJSZXN0YXJ0VVNlY1wiIHR5cGU9XCJ0XCIgYWNjZXNzPVwicmVhZFwi
Lz5cbiIgXAorICAgICAgICAiICA8cHJvcGVydHkgbmFtZT1cIk1heFJlc3RhcnRSZXRyaWVzXCIg
dHlwZT1cInVcIiBhY2Nlc3M9XCJyZWFkXCIvPlxuIiBcCisgICAgICAgICIgIDxwcm9wZXJ0eSBu
YW1lPVwiUmVzdGFydFJldHJ5XCIgdHlwZT1cInVcIiBhY2Nlc3M9XCJyZWFkXCIvPlxuIiBcCiAg
ICAgICAgICIgIDxwcm9wZXJ0eSBuYW1lPVwiVGltZW91dFVTZWNcIiB0eXBlPVwidFwiIGFjY2Vz
cz1cInJlYWRcIi8+XG4iIFwKICAgICAgICAgQlVTX0VYRUNfQ09NTUFORF9JTlRFUkZBQ0UoIkV4
ZWNTdGFydFByZSIpICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgQlVTX0VYRUNfQ09N
TUFORF9JTlRFUkZBQ0UoIkV4ZWNTdGFydCIpICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAg
LTEwMyw2ICsxMDUsOCBAQCBEQnVzSGFuZGxlclJlc3VsdCBidXNfc2VydmljZV9tZXNzYWdlX2hh
bmRsZXIoVW5pdCAqdSwgREJ1c0Nvbm5lY3Rpb24gKmNvbm5lY3RpbwogICAgICAgICAgICAgICAg
IHsgIm9yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMS5TZXJ2aWNlIiwgIlBJREZpbGUiLCAgICAgICAg
ICAgICAgICBidXNfcHJvcGVydHlfYXBwZW5kX3N0cmluZywgInMiLCB1LT5zZXJ2aWNlLnBpZF9m
aWxlICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgeyAib3JnLmZyZWVkZXNr
dG9wLnN5c3RlbWQxLlNlcnZpY2UiLCAiTm90aWZ5QWNjZXNzIiwgICAgICAgICAgIGJ1c19zZXJ2
aWNlX2FwcGVuZF9ub3RpZnlfYWNjZXNzLCAicyIsICZ1LT5zZXJ2aWNlLm5vdGlmeV9hY2Nlc3Mg
ICAgICAgfSwKICAgICAgICAgICAgICAgICB7ICJvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEuU2Vy
dmljZSIsICJSZXN0YXJ0VVNlYyIsICAgICAgICAgICAgYnVzX3Byb3BlcnR5X2FwcGVuZF91c2Vj
LCAgICJ0IiwgJnUtPnNlcnZpY2UucmVzdGFydF91c2VjICAgICAgICAgICAgICB9LAorICAgICAg
ICAgICAgICAgIHsgIm9yZy5mcmVlZGVza3RvcC5zeXN0ZW1kMS5TZXJ2aWNlIiwgIk1heFJlc3Rh
cnRSZXRyaWVzIiwgICAgICBidXNfcHJvcGVydHlfYXBwZW5kX3Vuc2lnbmVkLCAidSIsICZ1LT5z
ZXJ2aWNlLnJlc3RhcnRfcmV0cmllcyAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7ICJv
cmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEuU2VydmljZSIsICJSZXN0YXJ0UmV0cnkiLCAgICAgICAg
ICAgYnVzX3Byb3BlcnR5X2FwcGVuZF91bnNpZ25lZCwgInUiLCAmdS0+c2VydmljZS5yZXN0YXJ0
X2N1cnJlbnRfcmV0cnkgICAgICAgICB9LAogICAgICAgICAgICAgICAgIHsgIm9yZy5mcmVlZGVz
a3RvcC5zeXN0ZW1kMS5TZXJ2aWNlIiwgIlRpbWVvdXRVU2VjIiwgICAgICAgICAgICBidXNfcHJv
cGVydHlfYXBwZW5kX3VzZWMsICAgInQiLCAmdS0+c2VydmljZS50aW1lb3V0X3VzZWMgICAgICAg
ICAgICAgIH0sCiAgICAgICAgICAgICAgICAgQlVTX0VYRUNfQ09NTUFORF9QUk9QRVJUWSgib3Jn
LmZyZWVkZXNrdG9wLnN5c3RlbWQxLlNlcnZpY2UiLCB1LT5zZXJ2aWNlLmV4ZWNfY29tbWFuZFtT
RVJWSUNFX0VYRUNfU1RBUlRfUFJFXSwgICJFeGVjU3RhcnRQcmUiKSwKICAgICAgICAgICAgICAg
ICBCVVNfRVhFQ19DT01NQU5EX1BST1BFUlRZKCJvcmcuZnJlZWRlc2t0b3Auc3lzdGVtZDEuU2Vy
dmljZSIsIHUtPnNlcnZpY2UuZXhlY19jb21tYW5kW1NFUlZJQ0VfRVhFQ19TVEFSVF0sICAgICAg
IkV4ZWNTdGFydCIpLApkaWZmIC0tZ2l0IGEvc3JjL2xvYWQtZnJhZ21lbnQuYyBiL3NyYy9sb2Fk
LWZyYWdtZW50LmMKaW5kZXggNTZlYWVkOS4uN2U5ZWZhYSAxMDA2NDQKLS0tIGEvc3JjL2xvYWQt
ZnJhZ21lbnQuYworKysgYi9zcmMvbG9hZC1mcmFnbWVudC5jCkBAIC0xOTUxLDYgKzE5NTEsNyBA
QCBzdGF0aWMgaW50IGxvYWRfZnJvbV9wYXRoKFVuaXQgKnUsIGNvbnN0IGNoYXIgKnBhdGgpIHsK
ICAgICAgICAgICAgICAgICB7ICJUaW1lb3V0U2VjIiwgICAgICAgICAgICAgY29uZmlnX3BhcnNl
X3VzZWMsICAgICAgICAgICAgMCwgJnUtPnNlcnZpY2UudGltZW91dF91c2VjLCAgICAgICAgICAg
ICAgICAgICAgICAgICJTZXJ2aWNlIiB9LAogICAgICAgICAgICAgICAgIHsgIlR5cGUiLCAgICAg
ICAgICAgICAgICAgICBjb25maWdfcGFyc2Vfc2VydmljZV90eXBlLCAgICAwLCAmdS0+c2Vydmlj
ZS50eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlcnZpY2UiIH0sCiAgICAg
ICAgICAgICAgICAgeyAiUmVzdGFydCIsICAgICAgICAgICAgICAgIGNvbmZpZ19wYXJzZV9zZXJ2
aWNlX3Jlc3RhcnQsIDAsICZ1LT5zZXJ2aWNlLnJlc3RhcnQsICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAiU2VydmljZSIgfSwKKyAgICAgICAgICAgICAgICB7ICJNYXhSZXN0YXJ0UmV0cmll
cyIsICAgICAgY29uZmlnX3BhcnNlX3Vuc2lnbmVkLCAgICAgICAgMCwgJnUtPnNlcnZpY2UucmVz
dGFydF9yZXRyaWVzLCAgICAgICAgICAgICAgICAgICAgICJTZXJ2aWNlIiB9LAogICAgICAgICAg
ICAgICAgIHsgIlBlcm1pc3Npb25zU3RhcnRPbmx5IiwgICBjb25maWdfcGFyc2VfYm9vbCwgICAg
ICAgICAgICAwLCAmdS0+c2VydmljZS5wZXJtaXNzaW9uc19zdGFydF9vbmx5LCAgICAgICAgICAg
ICAgIlNlcnZpY2UiIH0sCiAgICAgICAgICAgICAgICAgeyAiUm9vdERpcmVjdG9yeVN0YXJ0T25s
eSIsIGNvbmZpZ19wYXJzZV9ib29sLCAgICAgICAgICAgIDAsICZ1LT5zZXJ2aWNlLnJvb3RfZGly
ZWN0b3J5X3N0YXJ0X29ubHksICAgICAgICAgICAiU2VydmljZSIgfSwKICAgICAgICAgICAgICAg
ICB7ICJSZW1haW5BZnRlckV4aXQiLCAgICAgICAgY29uZmlnX3BhcnNlX2Jvb2wsICAgICAgICAg
ICAgMCwgJnUtPnNlcnZpY2UucmVtYWluX2FmdGVyX2V4aXQsICAgICAgICAgICAgICAgICAgICJT
ZXJ2aWNlIiB9LApkaWZmIC0tZ2l0IGEvc3JjL3NlcnZpY2UuYyBiL3NyYy9zZXJ2aWNlLmMKaW5k
ZXggZDU5YzRjYi4uYjUxNTlhNiAxMDA2NDQKLS0tIGEvc3JjL3NlcnZpY2UuYworKysgYi9zcmMv
c2VydmljZS5jCkBAIC0xMTUxLDYgKzExNTEsMjAgQEAgc3RhdGljIGludCBzZXJ2aWNlX2xvYWQo
VW5pdCAqdSkgewogICAgICAgICAgICAgICAgIGlmIChzLT5tZXRhLmRlZmF1bHRfZGVwZW5kZW5j
aWVzKQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChyID0gc2VydmljZV9hZGRfZGVmYXVs
dF9kZXBlbmRlbmNpZXMocykpIDwgMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
cmV0dXJuIHI7CisKKyAgICAgICAgICAgICAgICAvKiBJZiB0aGUgb3B0aW9uICJSZXN0YXJ0UmV0
cmllcz0iIGlzIHNldCB0aGVuIHRoZSBzZXJ2aWNlIHdpbGwgYmUgInJldml2ZWQiICovCisgICAg
ICAgICAgICAgICAgaWYgKHMtPnJlc3RhcnRfcmV0cmllcyA+IDApIHsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIC8qIElmIHRoZSBvcHRpb24gIlJlc3RhcnQ9IiBpcyBub3Qgc2V0LCB0aGVuIGZv
ciB0aGUgc2VydmljZSB0byBiZSAicmV2aXZlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
IHdlIG11c3Qgc2V0ICJSZXN0YXJ0PSIgdG8gIm9uLWZhaWx1cmUiICovCisgICAgICAgICAgICAg
ICAgICAgICAgICBpZiAocy0+cmVzdGFydCA9PSBTRVJWSUNFX1JFU1RBUlRfTk8pCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnJlc3RhcnQgPSBTRVJWSUNFX1JFU1RBUlRfT05f
RkFJTFVSRTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhlIG9wdGlvbiAiUmVz
dGFydD0iIGlzIGFscmVhZHkgc2V0LCB0aGVuIGZvciB0aGUgc2VydmljZSB0byBiZSAicmV2aXZl
ZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBiZSByZXN0YXJ0ZWQgb24gZmFpbHVy
ZSB3ZSBtdXN0IHNldCAiUmVzdGFydD0iIHRvICJhbHdheXMiCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICBvbmx5IGlmIGl0J3MgIm9uLXN1Y2Nlc3MiICovCisgICAgICAgICAgICAgICAgICAg
ICAgICBlbHNlIGlmIChzLT5yZXN0YXJ0ID09IFNFUlZJQ0VfUkVTVEFSVF9PTl9TVUNDRVNTKQor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5yZXN0YXJ0ID0gU0VSVklDRV9SRVNU
QVJUX0FMV0FZUzsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICByZXR1
cm4gc2VydmljZV92ZXJpZnkocyk7CkBAIC0xNDg4LDYgKzE1MDIsMTYgQEAgc3RhdGljIHZvaWQg
c2VydmljZV9zZXRfc3RhdGUoU2VydmljZSAqcywgU2VydmljZVN0YXRlIHN0YXRlKSB7CiAgICAg
ICAgICAgICAgICAgbG9nX2RlYnVnKCIlcyBjaGFuZ2VkICVzIC0+ICVzIiwgcy0+bWV0YS5pZCwg
c2VydmljZV9zdGF0ZV90b19zdHJpbmcob2xkX3N0YXRlKSwgc2VydmljZV9zdGF0ZV90b19zdHJp
bmcoc3RhdGUpKTsKIAogICAgICAgICB1bml0X25vdGlmeShVTklUKHMpLCBzdGF0ZV90cmFuc2xh
dGlvbl90YWJsZVtvbGRfc3RhdGVdLCBzdGF0ZV90cmFuc2xhdGlvbl90YWJsZVtzdGF0ZV0sICFz
LT5yZWxvYWRfZmFpbHVyZSk7CisKKyAgICAgICAgLyogSWYgc2VydmljZSBmaW5pc2hlZCwgcmVz
ZXQgcmVzdGFydC1yZXRyeSBjb3VudGVyLCBpZiBhcHBsaWNhYmxlICovCisgICAgICAgIGlmIChv
bGRfc3RhdGUgIT0gc3RhdGUgJiYKKyAgICAgICAgICAgIChzdGF0ZSA9PSBTRVJWSUNFX0RFQUQg
fHwgc3RhdGUgPT0gU0VSVklDRV9GQUlMRUQpICYmCisgICAgICAgICAgICBzLT5yZXN0YXJ0X2N1
cnJlbnRfcmV0cnkgPiBzLT5yZXN0YXJ0X3JldHJpZXMpIHsKKyAgICAgICAgICAgICAgICAgICAg
bG9nX2RlYnVnKCJTZXJ2aWNlICVzIGVudGVyZWQgZGVhZCBvciBmYWlsZWQsIHJlc3RhcnQgcmV0
cmllcyBhdCBtYXgsIHJlc2V0IGNvdW50ZXIgKCV1IC0+IDApISIsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBzLT5tZXRhLmlkLCBzLT5yZXN0YXJ0X2N1cnJlbnRfcmV0cnkpOworICAg
ICAgICAgICAgICAgICAgICBzLT5yZXN0YXJ0X2N1cnJlbnRfcmV0cnkgPSAwOworICAgICAgICB9
CisKICAgICAgICAgcy0+cmVsb2FkX2ZhaWx1cmUgPSBmYWxzZTsKIH0KIApAQCAtMjI5MSw2ICsy
MzE1LDcgQEAgc3RhdGljIGludCBzZXJ2aWNlX3N0YXJ0KFVuaXQgKnUpIHsKIAogICAgICAgICAv
KiBNYWtlIHN1cmUgd2UgZG9uJ3QgZW50ZXIgYSBidXN5IGxvb3Agb2Ygc29tZSBraW5kLiAqLwog
ICAgICAgICBpZiAoIXJhdGVsaW1pdF90ZXN0KCZzLT5yYXRlbGltaXQpKSB7CisgICAgICAgICAg
ICAgICAgcy0+cmVzdGFydF9jdXJyZW50X3JldHJ5ID0gMDsKICAgICAgICAgICAgICAgICBsb2df
d2FybmluZygiJXMgc3RhcnQgcmVxdWVzdCByZXBlYXRlZCB0b28gcXVpY2tseSwgcmVmdXNpbmcg
dG8gc3RhcnQuIiwgdS0+bWV0YS5pZCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FQ0FOQ0VM
RUQ7CiAgICAgICAgIH0KQEAgLTIzMTEsNiArMjMzNiw3IEBAIHN0YXRpYyBpbnQgc2VydmljZV9z
dG9wKFVuaXQgKnUpIHsKIAogICAgICAgICAvKiBUaGlzIGlzIGEgdXNlciByZXF1ZXN0LCBzbyBk
b24ndCBkbyByZXN0YXJ0cyBvbiB0aGlzCiAgICAgICAgICAqIHNodXRkb3duLiAqLworICAgICAg
ICBzLT5yZXN0YXJ0X2N1cnJlbnRfcmV0cnkgPSAwOwogICAgICAgICBzLT5mb3JiaWRfcmVzdGFy
dCA9IHRydWU7CiAKICAgICAgICAgLyogQWxyZWFkeSBvbiBpdCAqLwpAQCAtMjQxMSw2ICsyNDM3
LDggQEAgc3RhdGljIGludCBzZXJ2aWNlX3NlcmlhbGl6ZShVbml0ICp1LCBGSUxFICpmLCBGRFNl
dCAqZmRzKSB7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgdW5pdF9z
ZXJpYWxpemVfaXRlbV9mb3JtYXQodSwgZiwgInJlc3RhcnQtY3VycmVudC1yZXRyeSIsICIldSIs
IHMtPnJlc3RhcnRfY3VycmVudF9yZXRyeSk7CisKICAgICAgICAgcmV0dXJuIDA7CiB9CiAKQEAg
LTI1MTAsNiArMjUzOCwxMyBAQCBzdGF0aWMgaW50IHNlcnZpY2VfZGVzZXJpYWxpemVfaXRlbShV
bml0ICp1LCBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbHVlLAogICAgICAgICAgICAg
ICAgIGR1YWxfdGltZXN0YW1wX2Rlc2VyaWFsaXplKHZhbHVlLCAmcy0+bWFpbl9leGVjX3N0YXR1
cy5zdGFydF90aW1lc3RhbXApOwogICAgICAgICBlbHNlIGlmIChzdHJlcShrZXksICJtYWluLWV4
ZWMtc3RhdHVzLWV4aXQiKSkKICAgICAgICAgICAgICAgICBkdWFsX3RpbWVzdGFtcF9kZXNlcmlh
bGl6ZSh2YWx1ZSwgJnMtPm1haW5fZXhlY19zdGF0dXMuZXhpdF90aW1lc3RhbXApOworICAgICAg
ICBlbHNlIGlmIChzdHJlcShrZXksICJyZXN0YXJ0LWN1cnJlbnQtcmV0cnkiKSkgeworICAgICAg
ICAgICAgICAgIHVuc2lnbmVkIGk7CisgICAgICAgICAgICAgICAgaWYgKHNhZmVfYXRvdSh2YWx1
ZSwgJmkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19kZWJ1ZygiRmFpbGVkIHRv
IHBhcnNlIHJlc3RhcnQtY3VycmVudC1yZXRyeSAlcyIsIHZhbHVlKTsKKyAgICAgICAgICAgICAg
ICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5yZXN0YXJ0X2N1cnJlbnRfcmV0cnkg
PSBpOworICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICBsb2dfZGVidWco
IlVua25vd24gc2VyaWFsaXphdGlvbiBrZXkgJyVzJyIsIGtleSk7CiAKQEAgLTI2MDQsNiArMjYz
OSwxMSBAQCBzdGF0aWMgdm9pZCBzZXJ2aWNlX3NpZ2NobGRfZXZlbnQoVW5pdCAqdSwgcGlkX3Qg
cGlkLCBpbnQgY29kZSwgaW50IHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICog
Z29uZS4gKi8KICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1haW5fY29tbWFuZCA9IE5VTEw7
CiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzICYmIHMtPnJlc3RhcnRfY3Vy
cmVudF9yZXRyeSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfZGVidWco
IiVzIGNoYW5nZWQgcmVzdGFydF9jcnRfcmV0cnkgZnJvbSAldSB0byAwIiwgcy0+bWV0YS5pZCwg
cy0+cmVzdGFydF9jdXJyZW50X3JldHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgcy0+cmVzdGFydF9jdXJyZW50X3JldHJ5ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAg
IH0KKwogICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzLT5zdGF0ZSkgewogCiAgICAg
ICAgICAgICAgICAgICAgICAgICBjYXNlIFNFUlZJQ0VfU1RBUlRfUE9TVDoKQEAgLTI4MzIsNyAr
Mjg3MiwxNSBAQCBzdGF0aWMgdm9pZCBzZXJ2aWNlX3RpbWVyX2V2ZW50KFVuaXQgKnUsIHVpbnQ2
NF90IGVsYXBzZWQsIFdhdGNoKiB3KSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAg
ICAgY2FzZSBTRVJWSUNFX0FVVE9fUkVTVEFSVDoKLSAgICAgICAgICAgICAgICBsb2dfaW5mbygi
JXMgaG9sZG9mZiB0aW1lIG92ZXIsIHNjaGVkdWxpbmcgcmVzdGFydC4iLCB1LT5tZXRhLmlkKTsK
KyAgICAgICAgICAgICAgICBpZiAocy0+cmVzdGFydF9yZXRyaWVzID4gMCkgeworICAgICAgICAg
ICAgICAgICAgICAgICAgcy0+cmVzdGFydF9jdXJyZW50X3JldHJ5ICsrOworICAgICAgICAgICAg
ICAgICAgICAgICAgaWYgKHMtPnJlc3RhcnRfY3VycmVudF9yZXRyeSA+IHMtPnJlc3RhcnRfcmV0
cmllcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfd2FybmluZygiJXMg
bWF4aW11bSBudW1iZXIgb2YgcmVzdGFydGluZyByZXRyaWVzIHJlYWNoZWQuIFN0b3BwaW5nLiIs
IHMtPm1ldGEuaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX2Vu
dGVyX2RlYWQocywgdHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAgICAgbG9nX2luZm8oIiVzIGhvbGRvZmYgdGltZSBvdmVyLCBzY2hlZHVsaW5n
IHJlc3RhcnQgKHJldHJ5ICV1IG9mICV1KS4iLCB1LT5tZXRhLmlkLCBzLT5yZXN0YXJ0X2N1cnJl
bnRfcmV0cnksIHMtPnJlc3RhcnRfcmV0cmllcyk7CiAgICAgICAgICAgICAgICAgc2VydmljZV9l
bnRlcl9yZXN0YXJ0KHMpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCmRpZmYgLS1naXQgYS9z
cmMvc2VydmljZS5oIGIvc3JjL3NlcnZpY2UuaAppbmRleCA1NWI5NTEzLi4xZDZjNDJjIDEwMDY0
NAotLS0gYS9zcmMvc2VydmljZS5oCisrKyBiL3NyYy9zZXJ2aWNlLmgKQEAgLTkyLDYgKzkyLDkg
QEAgc3RydWN0IFNlcnZpY2UgewogICAgICAgICBTZXJ2aWNlVHlwZSB0eXBlOwogICAgICAgICBT
ZXJ2aWNlUmVzdGFydCByZXN0YXJ0OwogCisgICAgICAgIHVuc2lnbmVkIHJlc3RhcnRfcmV0cmll
czsKKyAgICAgICAgdW5zaWduZWQgcmVzdGFydF9jdXJyZW50X3JldHJ5OworCiAgICAgICAgIC8q
IElmIHNldCB3ZSdsbCByZWFkIHRoZSBtYWluIGRhZW1vbiBQSUQgZnJvbSB0aGlzIGZpbGUgKi8K
ICAgICAgICAgY2hhciAqcGlkX2ZpbGU7CiAKZGlmZiAtLWdpdCBhL3NyYy91bml0LmMgYi9zcmMv
dW5pdC5jCmluZGV4IDliYjRlNTYuLjJhZTYzZDEgMTAwNjQ0Ci0tLSBhL3NyYy91bml0LmMKKysr
IGIvc3JjL3VuaXQuYwpAQCAtMTExNCw2ICsxMTE0LDEwIEBAIHZvaWQgdW5pdF90cmlnZ2VyX29u
X2ZhaWx1cmUoVW5pdCAqdSkgewogICAgICAgICBpZiAoc2V0X3NpemUodS0+bWV0YS5kZXBlbmRl
bmNpZXNbVU5JVF9PTl9GQUlMVVJFXSkgPD0gMCkKICAgICAgICAgICAgICAgICByZXR1cm47CiAK
KyAgICAgICAgaWYgKHUtPm1ldGEudHlwZSA9PSBVTklUX1NFUlZJQ0UgJiYKKyAgICAgICAgICAg
ICAgICB1LT5zZXJ2aWNlLnJlc3RhcnRfY3VycmVudF9yZXRyeSA8PSB1LT5zZXJ2aWNlLnJlc3Rh
cnRfcmV0cmllcykKKyAgICAgICAgICAgICAgICByZXR1cm47CisKICAgICAgICAgbG9nX2luZm8o
IlRyaWdnZXJpbmcgT25GYWlsdXJlPSBkZXBlbmRlbmNpZXMgb2YgJXMuIiwgdS0+bWV0YS5pZCk7
CiAKICAgICAgICAgU0VUX0ZPUkVBQ0gob3RoZXIsIHUtPm1ldGEuZGVwZW5kZW5jaWVzW1VOSVRf
T05fRkFJTFVSRV0sIGkpIHsKLS0gCjEuNy4wLjQKCg==

--_002_15156629E4E7ED4B92E7DE56896C43B60E41B784ALAMBBcorpadwrs_--


More information about the systemd-devel mailing list