[v9,06/10] inventory: save uptime to know when dump had happened

Submitted by Pavel Tikhomirov on April 3, 2018, 9:34 a.m.

Details

Message ID 20180403093426.10894-7-ptikhomirov@virtuozzo.com
State New
Series "don't use wrong pagemap (from other task) on pid reuse"
Headers show

Commit Message

Pavel Tikhomirov April 3, 2018, 9:34 a.m.
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.

Signed-off-by: Pavel Tikhomirov <ptikhomirov@virtuozzo.com>
---
 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(-)

Patch hide | download patch | download mbox

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 @@  static int cr_pre_dump_finish(int ret)
 	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 387a90323..5bd56b3bc 100644
--- a/criu/proc_parse.c
+++ b/criu/proc_parse.c
@@ -2715,7 +2715,7 @@  int parse_children(pid_t pid, pid_t **_c, int *_n)
 
 #define CSEC_PER_SEC 100
 
-__maybe_unused int parse_uptime(u_int64_t *upt)
+int parse_uptime(u_int64_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;
 }