chiark / gitweb /
journal: add call to determine current journal file disk usage
[elogind.git] / src / journal / sd-journal.c
index 672896d57ceb913af96ec91505add9ce37008b68..b4d35eebafd7612f7b8cd128bc0bc996d810b624 100644 (file)
@@ -1098,7 +1098,9 @@ static int add_file(sd_journal *j, const char *prefix, const char *filename) {
 
         if ((j->flags & SD_JOURNAL_SYSTEM_ONLY) &&
             !(streq(filename, "system.journal") ||
-             (startswith(filename, "system@") && endswith(filename, ".journal"))))
+              streq(filename, "system.journal~") ||
+              (startswith(filename, "system@") &&
+               (endswith(filename, ".journal") || endswith(filename, ".journal~")))))
                 return 0;
 
         path = strjoin(prefix, "/", filename, NULL);
@@ -1116,7 +1118,7 @@ static int add_file(sd_journal *j, const char *prefix, const char *filename) {
                 return 0;
         }
 
-        r = journal_file_open(path, O_RDONLY, 0, NULL, NULL, &f);
+        r = journal_file_open(path, O_RDONLY, 0, false, false, NULL, j->mmap, NULL, &f);
         free(path);
 
         if (r < 0) {
@@ -1233,7 +1235,7 @@ static int add_directory(sd_journal *j, const char *prefix, const char *dirname)
                 m->wd = inotify_add_watch(j->inotify_fd, m->path,
                                           IN_CREATE|IN_MOVED_TO|IN_MODIFY|IN_ATTRIB|IN_DELETE|
                                           IN_DELETE_SELF|IN_MOVE_SELF|IN_UNMOUNT|
-                                          IN_DONT_FOLLOW|IN_ONLYDIR);
+                                          IN_ONLYDIR);
 
                 if (m->wd > 0 && hashmap_put(j->directories_by_wd, INT_TO_PTR(m->wd), m) < 0)
                         inotify_rm_watch(j->inotify_fd, m->wd);
@@ -1246,7 +1248,8 @@ static int add_directory(sd_journal *j, const char *prefix, const char *dirname)
                 if (r != 0 || !de)
                         break;
 
-                if (dirent_is_file_with_suffix(de, ".journal")) {
+                if (dirent_is_file_with_suffix(de, ".journal") ||
+                    dirent_is_file_with_suffix(de, ".journal~")) {
                         r = add_file(j, m->path, de->d_name);
                         if (r < 0)
                                 log_debug("Failed to add file %s/%s: %s", m->path, de->d_name, strerror(-r));
@@ -1310,7 +1313,7 @@ static int add_root_directory(sd_journal *j, const char *p) {
 
                 m->wd = inotify_add_watch(j->inotify_fd, m->path,
                                           IN_CREATE|IN_MOVED_TO|IN_MODIFY|IN_ATTRIB|IN_DELETE|
-                                          IN_DONT_FOLLOW|IN_ONLYDIR);
+                                          IN_ONLYDIR);
 
                 if (m->wd > 0 && hashmap_put(j->directories_by_wd, INT_TO_PTR(m->wd), m) < 0)
                         inotify_rm_watch(j->inotify_fd, m->wd);
@@ -1324,7 +1327,8 @@ static int add_root_directory(sd_journal *j, const char *p) {
                 if (r != 0 || !de)
                         break;
 
-                if (dirent_is_file_with_suffix(de, ".journal")) {
+                if (dirent_is_file_with_suffix(de, ".journal") ||
+                    dirent_is_file_with_suffix(de, ".journal~")) {
                         r = add_file(j, m->path, de->d_name);
                         if (r < 0)
                                 log_debug("Failed to add file %s/%s: %s", m->path, de->d_name, strerror(-r));
@@ -1435,6 +1439,15 @@ static sd_journal *journal_new(int flags, const char *path) {
                 return NULL;
         }
 
+        j->mmap = mmap_cache_new();
+        if (!j->mmap) {
+                hashmap_free(j->files);
+                hashmap_free(j->directories_by_path);
+                free(j->path);
+                free(j);
+                return NULL;
+        }
+
         return j;
 }
 
@@ -1523,6 +1536,9 @@ _public_ void sd_journal_close(sd_journal *j) {
 
         sd_journal_flush_matches(j);
 
+        if (j->mmap)
+                mmap_cache_unref(j->mmap);
+
         free(j->path);
         free(j);
 }
@@ -1823,7 +1839,9 @@ static void process_inotify_event(sd_journal *j, struct inotify_event *e) {
         if (d) {
                 sd_id128_t id;
 
-                if (!(e->mask & IN_ISDIR) && e->len > 0 && endswith(e->name, ".journal")) {
+                if (!(e->mask & IN_ISDIR) && e->len > 0 &&
+                    (endswith(e->name, ".journal") ||
+                     endswith(e->name, ".journal~"))) {
 
                         /* Event for a journal file */
 
@@ -2044,6 +2062,29 @@ void journal_print_header(sd_journal *j) {
         }
 }
 
+_public_ int sd_journal_get_usage(sd_journal *j, uint64_t *bytes) {
+        Iterator i;
+        JournalFile *f;
+        uint64_t sum = 0;
+
+        if (!j)
+                return -EINVAL;
+        if (!bytes)
+                return -EINVAL;
+
+        HASHMAP_FOREACH(f, j->files, i) {
+                struct stat st;
+
+                if (fstat(f->fd, &st) < 0)
+                        return -errno;
+
+                sum += (uint64_t) st.st_blocks * 512ULL;
+        }
+
+        *bytes = sum;
+        return 0;
+}
+
 /* _public_ int sd_journal_query_unique(sd_journal *j, const char *field) { */
 /*         if (!j) */
 /*                 return -EINVAL; */