diff options
author | Lennart Poettering <lennart@poettering.net> | 2015-03-03 00:13:12 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2015-03-03 00:13:12 +0100 |
commit | 26166c88e0b47b83972f32b5057ecbffe06bf904 (patch) | |
tree | afff66bbc1b717d9202c16ff1c1b131fa307c272 /src/import/import-job.c | |
parent | a68188812290cb9ec9f3f8a17b65e64549a4fd65 (diff) |
importd: automatically grow /var/lib/machines/ loopback filesystem during downloads
If /var/lib/machines is mounted as btrfs loopback file system in
/var/lib/machines.raw with this change we automatically grow the file
system as it fills up. After each 10M we write to it during imports, we
check the free disk space, and if the fill level grows beyond 66% we
increase the size of the file system to 3x the fill level (thus lowering
it to 33%).
Diffstat (limited to 'src/import/import-job.c')
-rw-r--r-- | src/import/import-job.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/src/import/import-job.c b/src/import/import-job.c index 809486500b..980b639b5d 100644 --- a/src/import/import-job.c +++ b/src/import/import-job.c @@ -22,8 +22,12 @@ #include <sys/xattr.h> #include "strv.h" +#include "machine-pool.h" #include "import-job.h" +/* Grow the /var/lib/machines directory after each 10MiB written */ +#define IMPORT_GROW_INTERVAL_BYTES (UINT64_C(10) * UINT64_C(1024) * UINT64_C(1024)) + ImportJob* import_job_unref(ImportJob *j) { if (!j) return NULL; @@ -197,6 +201,11 @@ static int import_job_write_uncompressed(ImportJob *j, void *p, size_t sz) { if (j->disk_fd >= 0) { + if (j->grow_machine_directory && j->written_since_last_grow >= IMPORT_GROW_INTERVAL_BYTES) { + j->written_since_last_grow = 0; + grow_machine_directory(); + } + if (j->allow_sparse) n = sparse_write(j->disk_fd, p, sz, 64); else @@ -219,6 +228,7 @@ static int import_job_write_uncompressed(ImportJob *j, void *p, size_t sz) { } j->written_uncompressed += sz; + j->written_since_last_grow += sz; return 0; } @@ -667,6 +677,9 @@ int import_job_begin(ImportJob *j) { if (j->state != IMPORT_JOB_INIT) return -EBUSY; + if (j->grow_machine_directory) + grow_machine_directory(); + r = curl_glue_make(&j->curl, j->url, j); if (r < 0) return r; |