Commit 408b85df authored by Lennart Poettering's avatar Lennart Poettering
Browse files

readahead: exit after a maximum runtime

parent 902a339c
...@@ -49,12 +49,18 @@ ...@@ -49,12 +49,18 @@
#include "readahead-common.h" #include "readahead-common.h"
#define MINCORE_VEC_SIZE (READAHEAD_FILE_SIZE_MAX/PAGE_SIZE) #define MINCORE_VEC_SIZE (READAHEAD_FILE_SIZE_MAX/PAGE_SIZE)
#define TIMEOUT_USEC (2*USEC_PER_MINUTE)
/* fixme: /* fixme:
* *
* - detect ssd/lvm/... on btrfs * - detect ssd on btrfs/lvm...
* - read ahead directories * - read ahead directories
* - sd_readahead_cancel * - sd_readahead_cancel
* - gzip?
* - oom adjust
* - remount rw
* - are filenames from anotify normalized regards /../ and // and /./?
* - does ioprio_set work with fadvise()?
*/ */
static int btrfs_defrag(int fd) { static int btrfs_defrag(int fd) {
...@@ -111,7 +117,7 @@ static int pack_file(FILE *pack, const char *fn, bool on_btrfs) { ...@@ -111,7 +117,7 @@ static int pack_file(FILE *pack, const char *fn, bool on_btrfs) {
pages = l / PAGE_SIZE; pages = l / PAGE_SIZE;
mapped = false; mapped = false;
for (c = 0; c < pages; c++) { for (c = 0; c < pages; c++) {
bool new_mapped = (vec[c] & 1); bool new_mapped = !!(vec[c] & 1);
if (!mapped && new_mapped) if (!mapped && new_mapped)
b = c; b = c;
...@@ -206,6 +212,7 @@ static int collect(const char *root) { ...@@ -206,6 +212,7 @@ static int collect(const char *root) {
char *pack_fn_new = NULL, *pack_fn = NULL; char *pack_fn_new = NULL, *pack_fn = NULL;
bool on_ssd, on_btrfs; bool on_ssd, on_btrfs;
struct statfs sfs; struct statfs sfs;
usec_t not_after;
assert(root); assert(root);
...@@ -228,7 +235,7 @@ static int collect(const char *root) { ...@@ -228,7 +235,7 @@ static int collect(const char *root) {
goto finish; goto finish;
} }
if ((fanotify_fd = fanotify_init(FAN_CLOEXEC, O_RDONLY|O_LARGEFILE|O_CLOEXEC|O_NOATIME)) < 0) { if ((fanotify_fd = fanotify_init(FAN_CLOEXEC|FAN_NONBLOCK, O_RDONLY|O_LARGEFILE|O_CLOEXEC|O_NOATIME)) < 0) {
log_error("Failed to create fanotify object: %m"); log_error("Failed to create fanotify object: %m");
r = -errno; r = -errno;
goto finish; goto finish;
...@@ -240,6 +247,8 @@ static int collect(const char *root) { ...@@ -240,6 +247,8 @@ static int collect(const char *root) {
goto finish; goto finish;
} }
not_after = now(CLOCK_MONOTONIC) + TIMEOUT_USEC;
my_pid = getpid(); my_pid = getpid();
zero(pollfd); zero(pollfd);
...@@ -261,11 +270,21 @@ static int collect(const char *root) { ...@@ -261,11 +270,21 @@ static int collect(const char *root) {
} data; } data;
ssize_t n; ssize_t n;
struct fanotify_event_metadata *m; struct fanotify_event_metadata *m;
usec_t t;
int h;
if (hashmap_size(files) > READAHEAD_FILES_MAX) if (hashmap_size(files) > READAHEAD_FILES_MAX) {
log_debug("Reached maximum number of read ahead files, ending collection.");
break; break;
}
t = now(CLOCK_MONOTONIC);
if (t >= not_after) {
log_debug("Reached maximum collection time, ending collection.");
break;
}
if (poll(pollfd, _FD_MAX, -1) < 0) { if ((h = poll(pollfd, _FD_MAX, (int) ((not_after - t) / USEC_PER_MSEC))) < 0) {
if (errno == EINTR) if (errno == EINTR)
continue; continue;
...@@ -278,6 +297,11 @@ static int collect(const char *root) { ...@@ -278,6 +297,11 @@ static int collect(const char *root) {
if (pollfd[FD_SIGNAL].revents != 0) if (pollfd[FD_SIGNAL].revents != 0)
break; break;
if (h == 0) {
log_debug("Reached maximum collection time, ending collection.");
break;
}
if ((n = read(fanotify_fd, &data, sizeof(data))) < 0) { if ((n = read(fanotify_fd, &data, sizeof(data))) < 0) {
if (errno == EINTR || errno == EAGAIN) if (errno == EINTR || errno == EAGAIN)
...@@ -288,8 +312,7 @@ static int collect(const char *root) { ...@@ -288,8 +312,7 @@ static int collect(const char *root) {
goto finish; goto finish;
} }
m = &data.metadata; for (m = &data.metadata; FAN_EVENT_OK(m, n); m = FAN_EVENT_NEXT(m, n)) {
while (FAN_EVENT_OK(m, n)) {
if (m->pid != my_pid && m->fd >= 0) { if (m->pid != my_pid && m->fd >= 0) {
char fn[PATH_MAX]; char fn[PATH_MAX];
...@@ -320,8 +343,6 @@ static int collect(const char *root) { ...@@ -320,8 +343,6 @@ static int collect(const char *root) {
if (m->fd) if (m->fd)
close_nointr_nofail(m->fd); close_nointr_nofail(m->fd);
m = FAN_EVENT_NEXT(m, n);
} }
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment