From 688ffa50f1247f7bdf4e5e9e5f887f5940d690e0 Mon Sep 17 00:00:00 2001 From: Pavel Tikhomirov Date: Fri, 6 Apr 2018 10:31:28 +0300 Subject: [PATCH] inventory: save uptime to know when dump had happened We want to use a simple fact: If we have an alive process in a pstree we want to dump, and a starttime of that process is less than pre-dump's timestamp (taken while all processes were freezed), then these exact process existed (100% sure) at the time of these pre-dump and the process' memory was dumped in images. So save inventory image on pre-dump and put there an uptime. https://jira.sw.ru/browse/PSBM-67502 v9: improve comment, put uptime to ivnentory image as 1) where is no stats in parent images directory if --work-dir option is set to something different then images directory, 2) stats-dump is not an image and it is a bad practice to put there data required for restoring. v10:s/u_int64_t/uint64_t/ Signed-off-by: Pavel Tikhomirov Signed-off-by: Andrei Vagin --- criu/cr-dump.c | 6 ++++++ criu/image.c | 11 +++++++++++ criu/include/crtools.h | 1 + criu/proc_parse.c | 2 +- images/inventory.proto | 1 + 5 files changed, 20 insertions(+), 1 deletion(-) diff --git a/criu/cr-dump.c b/criu/cr-dump.c index 0f4f438b3..35c4d512f 100644 --- a/criu/cr-dump.c +++ b/criu/cr-dump.c @@ -1563,6 +1563,7 @@ static int setup_alarm_handler() static int cr_pre_dump_finish(int ret) { + InventoryEntry he = INVENTORY_ENTRY__INIT; struct pstree_item *item; /* @@ -1571,6 +1572,8 @@ static int cr_pre_dump_finish(int ret) */ if (arch_set_thread_regs(root_item, false) < 0) goto err; + + prepare_inventory_pre_dump(&he); pstree_switch_state(root_item, TASK_ALIVE); timing_stop(TIME_FROZEN); @@ -1621,6 +1624,9 @@ err: if (bfd_flush_images()) ret = -1; + if (write_img_inventory(&he)) + ret = -1; + if (ret) pr_err("Pre-dumping FAILED.\n"); else { diff --git a/criu/image.c b/criu/image.c index 9201f6a30..2667863db 100644 --- a/criu/image.c +++ b/criu/image.c @@ -17,6 +17,7 @@ #include "images/inventory.pb-c.h" #include "images/pagemap.pb-c.h" #include "img-remote.h" +#include "proc_parse.h" bool ns_per_id = false; bool img_common_magic = true; @@ -112,6 +113,16 @@ int write_img_inventory(InventoryEntry *he) return 0; } +void prepare_inventory_pre_dump(InventoryEntry *he) +{ + pr_info("Perparing image inventory for pre-dump (version %u)\n", CRTOOLS_IMAGES_V1); + + he->img_version = CRTOOLS_IMAGES_V1_1; + + if (!parse_uptime(&he->dump_uptime)) + he->has_dump_uptime = true; +} + int prepare_inventory(InventoryEntry *he) { struct pid pid; diff --git a/criu/include/crtools.h b/criu/include/crtools.h index a78a577cd..88d2220a4 100644 --- a/criu/include/crtools.h +++ b/criu/include/crtools.h @@ -12,6 +12,7 @@ extern int check_img_inventory(void); extern int write_img_inventory(InventoryEntry *he); +extern void prepare_inventory_pre_dump(InventoryEntry *he); extern int prepare_inventory(InventoryEntry *he); struct pprep_head { int (*actor)(struct pprep_head *); diff --git a/criu/proc_parse.c b/criu/proc_parse.c index 30760cf39..27719416a 100644 --- a/criu/proc_parse.c +++ b/criu/proc_parse.c @@ -2715,7 +2715,7 @@ err: #define CSEC_PER_SEC 100 -__maybe_unused int parse_uptime(uint64_t *upt) +int parse_uptime(uint64_t *upt) { unsigned long sec, csec; FILE *f; diff --git a/images/inventory.proto b/images/inventory.proto index 5bc3db240..3e64602c4 100644 --- a/images/inventory.proto +++ b/images/inventory.proto @@ -16,4 +16,5 @@ message inventory_entry { optional uint32 root_cg_set = 5; optional lsmtype lsmtype = 6; optional bool check_only = 7; + optional uint64 dump_uptime = 8; }