chiark / gitweb /
unit: record inactive enter/exit timestamps to facilitate syslog lookups
authorLennart Poettering <lennart@poettering.net>
Fri, 14 May 2010 01:05:38 +0000 (03:05 +0200)
committerLennart Poettering <lennart@poettering.net>
Fri, 14 May 2010 01:05:38 +0000 (03:05 +0200)
dbus-unit.h
systemd-interfaces.vala
unit.c
unit.h

index 471f64cbe88045574855ec1bcfd302910cae4d99..db1716ea355ff3761ef12603b0f9fe6d8a0ebf07 100644 (file)
         "  <property name=\"ActiveState\" type=\"s\" access=\"read\"/>" \
         "  <property name=\"SubState\" type=\"s\" access=\"read\"/>"    \
         "  <property name=\"FragmentPath\" type=\"s\" access=\"read\"/>" \
+        "  <property name=\"InactiveExitTimestamp\" type=\"t\" access=\"read\"/>" \
         "  <property name=\"ActiveEnterTimestamp\" type=\"t\" access=\"read\"/>" \
         "  <property name=\"ActiveExitTimestamp\" type=\"t\" access=\"read\"/>" \
+        "  <property name=\"InactiveEnterTimestamp\" type=\"t\" access=\"read\"/>" \
         "  <property name=\"CanReload\" type=\"b\" access=\"read\"/>"   \
         "  <property name=\"CanStart\" type=\"b\" access=\"read\"/>"    \
         "  <property name=\"Job\" type=\"(uo)\" access=\"read\"/>"      \
         { "org.freedesktop.systemd1.Unit", "ActiveState",          bus_unit_append_active_state,   "s",    u                               }, \
         { "org.freedesktop.systemd1.Unit", "SubState",             bus_unit_append_sub_state,      "s",    u                               }, \
         { "org.freedesktop.systemd1.Unit", "FragmentPath",         bus_property_append_string,     "s",    u->meta.fragment_path           }, \
+        { "org.freedesktop.systemd1.Unit", "InactiveExitTimestamp",bus_property_append_uint64,     "t",    &u->meta.inactive_exit_timestamp}, \
         { "org.freedesktop.systemd1.Unit", "ActiveEnterTimestamp", bus_property_append_uint64,     "t",    &u->meta.active_enter_timestamp }, \
         { "org.freedesktop.systemd1.Unit", "ActiveExitTimestamp",  bus_property_append_uint64,     "t",    &u->meta.active_exit_timestamp  }, \
+        { "org.freedesktop.systemd1.Unit", "InActiveEnterTimestamp",bus_property_append_uint64,    "t",    &u->meta.inactive_enter_timestamp}, \
         { "org.freedesktop.systemd1.Unit", "CanStart",             bus_unit_append_can_start,      "b",    u                               }, \
         { "org.freedesktop.systemd1.Unit", "CanReload",            bus_unit_append_can_reload,     "b",    u                               }, \
         { "org.freedesktop.systemd1.Unit", "Job",                  bus_unit_append_job,            "(uo)", u                               }, \
index a95dc01f55e62e81c0a3463416484e54d26b3885..72655d63505674059298886df470266f0209444d 100644 (file)
@@ -88,8 +88,10 @@ public interface Unit : DBus.Object {
         public abstract string active_state { owned get; }
         public abstract string sub_state { owned get; }
         public abstract string fragment_path { owned get; }
+        public abstract uint64 inactive_exit_timestamp { owned get; }
         public abstract uint64 active_enter_timestamp { owned get; }
         public abstract uint64 active_exit_timestamp { owned get; }
+        public abstract uint64 inactive_enter_timestamp { owned get; }
         public abstract bool can_start { owned get; }
         public abstract bool can_reload { owned get; }
         public abstract JobLink job { owned get; /* FIXME: this setter is a temporary fix to make valac not segfault */ set; }
diff --git a/unit.c b/unit.c
index fd6723f4ce77796f8439f9291e4280d33aca9d7a..7779753591921d29ba4f6ff7043b9c18288ff04b 100644 (file)
--- a/unit.c
+++ b/unit.c
@@ -558,7 +558,11 @@ void unit_dump(Unit *u, FILE *f, const char *prefix) {
         char *p2;
         const char *prefix2;
         CGroupBonding *b;
-        char timestamp1[FORMAT_TIMESTAMP_MAX], timestamp2[FORMAT_TIMESTAMP_MAX];
+        char
+                timestamp1[FORMAT_TIMESTAMP_MAX],
+                timestamp2[FORMAT_TIMESTAMP_MAX],
+                timestamp3[FORMAT_TIMESTAMP_MAX],
+                timestamp4[FORMAT_TIMESTAMP_MAX];
 
         assert(u);
         assert(u->meta.type >= 0);
@@ -574,16 +578,20 @@ void unit_dump(Unit *u, FILE *f, const char *prefix) {
                 "%s\tInstance: %s\n"
                 "%s\tUnit Load State: %s\n"
                 "%s\tUnit Active State: %s\n"
+                "%s\tInactive Exit Timestamp: %s\n"
                 "%s\tActive Enter Timestamp: %s\n"
                 "%s\tActive Exit Timestamp: %s\n"
+                "%s\tInactive Enter Timestamp: %s\n"
                 "%s\tGC Check Good: %s\n",
                 prefix, u->meta.id,
                 prefix, unit_description(u),
                 prefix, strna(u->meta.instance),
                 prefix, unit_load_state_to_string(u->meta.load_state),
                 prefix, unit_active_state_to_string(unit_active_state(u)),
-                prefix, strna(format_timestamp(timestamp1, sizeof(timestamp1), u->meta.active_enter_timestamp)),
-                prefix, strna(format_timestamp(timestamp2, sizeof(timestamp2), u->meta.active_exit_timestamp)),
+                prefix, strna(format_timestamp(timestamp1, sizeof(timestamp1), u->meta.inactive_exit_timestamp)),
+                prefix, strna(format_timestamp(timestamp2, sizeof(timestamp2), u->meta.active_enter_timestamp)),
+                prefix, strna(format_timestamp(timestamp3, sizeof(timestamp3), u->meta.active_exit_timestamp)),
+                prefix, strna(format_timestamp(timestamp4, sizeof(timestamp4), u->meta.inactive_enter_timestamp)),
                 prefix, yes_no(unit_check_gc(u)));
 
         SET_FOREACH(t, u->meta.names, i)
@@ -908,6 +916,7 @@ static void retroactively_stop_dependencies(Unit *u) {
 
 void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns) {
         bool unexpected = false;
+        usec_t ts;
 
         assert(u);
         assert(os < _UNIT_ACTIVE_STATE_MAX);
@@ -920,10 +929,17 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns) {
          * this function will be called too and the utmp code below
          * relies on that! */
 
+        ts = now(CLOCK_REALTIME);
+
+        if (os == UNIT_INACTIVE && ns != UNIT_INACTIVE)
+                u->meta.inactive_exit_timestamp = ts;
+        else if (os != UNIT_INACTIVE && ns == UNIT_INACTIVE)
+                u->meta.inactive_enter_timestamp = ts;
+
         if (!UNIT_IS_ACTIVE_OR_RELOADING(os) && UNIT_IS_ACTIVE_OR_RELOADING(ns))
-                u->meta.active_enter_timestamp = now(CLOCK_REALTIME);
+                u->meta.active_enter_timestamp = ts;
         else if (UNIT_IS_ACTIVE_OR_RELOADING(os) && !UNIT_IS_ACTIVE_OR_RELOADING(ns))
-                u->meta.active_exit_timestamp = now(CLOCK_REALTIME);
+                u->meta.active_exit_timestamp = ts;
 
         if (u->meta.job) {
 
diff --git a/unit.h b/unit.h
index 5b76a59b790f5611a00c10ef6fe55f41715bf055..8f9d9e98601925f308277f0501f8f178ee1141c4 100644 (file)
--- a/unit.h
+++ b/unit.h
@@ -149,8 +149,10 @@ struct Meta {
          * the job for it */
         Job *job;
 
+        usec_t inactive_exit_timestamp;
         usec_t active_enter_timestamp;
         usec_t active_exit_timestamp;
+        usec_t inactive_enter_timestamp;
 
         /* Counterparts in the cgroup filesystem */
         CGroupBonding *cgroup_bondings;