chiark / gitweb /
readahead-replay: delay ready notification until we queued first read
[elogind.git] / src / readahead-replay.c
index b886857ffba9475c7581325c61cfae593ae02db1..c01f73e6a99d011f0232ac77fc43a63244237041 100644 (file)
@@ -114,7 +114,7 @@ static int replay(const char *root) {
         char line[LINE_MAX];
         int r = 0;
         char *pack_fn = NULL, c;
-        bool on_ssd;
+        bool on_ssd, ready = false;
         int prio;
 
         assert(root);
@@ -168,9 +168,7 @@ static int replay(const char *root) {
         if (ioprio_set(IOPRIO_WHO_PROCESS, getpid(), prio) < 0)
                 log_warning("Failed to set IDLE IO priority class: %m");
 
-        sd_notify(0,
-                  "READY=1\n"
-                  "STATUS=Replaying readahead data");
+        sd_notify(0, "STATUS=Replaying readahead data");
 
         log_debug("Replaying...");
 
@@ -181,8 +179,18 @@ static int replay(const char *root) {
                         r = k;
                         goto finish;
                 }
+
+                if (!ready) {
+                        /* We delay the ready notification until we
+                         * queued at least one read */
+                        sd_notify(0, "READY=1");
+                        ready = true;
+                }
         }
 
+        if (!ready)
+                sd_notify(0, "READY=1");
+
         if (ferror(pack)) {
                 log_error("Failed to read pack file.");
                 r = -EIO;
@@ -201,13 +209,17 @@ finish:
 }
 
 int main(int argc, char*argv[]) {
-        /* log_set_target(LOG_TARGET_SYSLOG_OR_KMSG); */
+
+        log_set_target(LOG_TARGET_SYSLOG_OR_KMSG);
         log_parse_environment();
         log_open();
 
-        log_set_max_level(LOG_DEBUG);
+        if (!enough_ram()) {
+                log_info("Disabling readahead replay due to low memory.");
+                return 0;
+        }
 
-        if (replay("/") < 0)
+        if (replay(argc >= 2 ? argv[1] : "/") < 0)
                 return 1;
 
         return 0;