All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC][PATCH 0/5][lxc]: Link with USERCR
@ 2010-03-19  6:39 Sukadev Bhattiprolu
       [not found] ` <20100319063912.GA25732-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
  0 siblings, 1 reply; 20+ messages in thread
From: Sukadev Bhattiprolu @ 2010-03-19  6:39 UTC (permalink / raw)
  To: dlezcano-NmTC/0ZBporQT0dZR+AlfA; +Cc: Containers, clg-NmTC/0ZBporQT0dZR+AlfA


Link lxc_checkpoint, lxc_restart with USERCR[2]

Following set of patches, when applied to LXC 0.6.5 and built with
USERCR, enable lxc_checkpoint and lxc_restart of some simple containers.

TODO:
	- For simplicity, this patchset currently links *statically* with
	  USERCR. We should eventually build checkpoint.o and restart.o in
	  USERCR as shared objects and link lxc_checkpoint/lxc_restart with
	  these shared objects and liblxc.so. (This also required rebuilding
	  lxc-execute statically, so lxc_checkpoint can communicate with
	  lxc-execute to get the root-pid of container).

	- Determine if lxc_checkpoint needs a --container option (see
	  TODOs in src/lxc/checkpoint.c)

	- This patchset was tested using lxc-macvlan.conf. But for the VNC
	  server testing I ran into a problem with lxc-macvlan.conf. I
	  switched to 'lxc-no-netns.conf' and was able to C/R the VNC server.
	  I have not debugged the problem with VNC and lxc-macvlan.conf.

	- 'global_send_sigint' is still a global variable in USERCR. We need
	  to define a better interface to expose its functionality to callers
	  of app_restart().

	- Choose better names and API for USERCR :-)

Changelog[v2]: 
	(Based on feedback from Oren Laadan, Serge Hallyn, Daniel Lezcano
	and Cedric Le Goater)

	- Rather than drop --directory option to lxc_checkpoint/lxc_restart
	  add a new option (--image).

	- Integrate lxc_checkpoint to work with USERCR

	- USERCR renamed usercr.h to "app-checkpoint.h"

	- USERCR does not create/install libcheckpoint.a and usercr.h for now.
	  So link directly with app-checkpoint.h, restart.o and checkpoint.o

	- USERCR renames the interfaces to app_checkpoint() and app_restart()
	  'struct app_checkpoint_args' 'struct app_restart_args'.
	  
USAGE:

1. Build USERCR

	$ cd /root

	$ git-clone git://git.ncl.cs.columbia.edu/pub/git/user-cr.git user-cr

	$ git-checkout ckpt-v20 
	
	# Apply patches in the following set:

	# https://lists.linux-foundation.org/pipermail/containers/2010-March/023793.html

	$ cd /root/user-cr

	$ make 

		This should create restart.o and checkpoint.o

2. Build/install lxc_checkpoint and lxc_restart

	# Do normal LXC build/install of 0.6.5.

	# Then replace 'lxc-execute', 'lxc-checkpoint', 'lxc-restart' with
	# new version. i.e Apply attached patches and:

	$ cd src/lxc

	$ USERCR=/root/user-cr \
		make -f Makefile2 lxc_checkpoint lxc_restart lxc_execute

	$ cp lxc_checkpoint lxc_restart lxc-execute  /usr/local/bin

3. Checkpoint/restart a simple LXC container

	$ lxc-execute --name foo --rcfile lxc-no-netns.conf -- /bin/sleep 1000

	$ lxc-freeze --name foo

	$ lxc-checkpoint --name foo --image /root/lxc-foo.ckpt

	$ lxc-unfreeze --name foo

	$ lxc-stop --name foo

	$ lxc-restart --name foo --image /root/lxc-foo.ckpt

4. Checkpoint/restart other LXC containers such as:

	- a file-io session (see run-fileio1 in cr-tests[1])

	- process-tree (see run-ptree1 in cr-tests[1])

	- A vi session inside a VNC Server using "twm". i.e

		$ cat /root/.vnc/xstartup
		#!/bin/sh

		xsetroot -solid grey
		vncconfig -iconic &
		xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
		twm &

		$ lxc-execute --name foo --rcfile lxc-no-netns.conf -- \
			/usr/bin/vncserver :1

		$ vncviewer :1

			# Open a vi session

		$ lxc-freeze --name foo 

			etc

[1]: cr-tests:	git://git.sr71.net/~hallyn/cr_tests.git
[2]: USERCR: git://git.ncl.cs.columbia.edu/pub/git/user-cr.git

Signed-off-by: Sukadev Bhattiprolu <sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH 1/5][lxc] Enable static linking of some lxc binaries
       [not found] ` <20100319063912.GA25732-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
@ 2010-03-19  6:40   ` Sukadev Bhattiprolu
       [not found]     ` <20100319064024.GB25732-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
  2010-03-19  6:40   ` [PATCH 2/5][lxc] lxc_restart: Add --image option Sukadev Bhattiprolu
                     ` (5 subsequent siblings)
  6 siblings, 1 reply; 20+ messages in thread
From: Sukadev Bhattiprolu @ 2010-03-19  6:40 UTC (permalink / raw)
  To: dlezcano-NmTC/0ZBporQT0dZR+AlfA; +Cc: Containers, clg-NmTC/0ZBporQT0dZR+AlfA


From: Sukadev Bhattiprolu <sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
Date: Wed, 10 Mar 2010 22:12:34 -0800
Subject: [PATCH 1/5][lxc] Enable static linking of some lxc binaries

This is a temporary commit to statically link lxc_checkpoint, lxc_execute
and lxc_restart.

Signed-off-by: Sukadev Bhattiprolu <sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
---
 src/lxc/Makefile2 |   35 +++++++++++++++++++++++++++++++++++
 1 files changed, 35 insertions(+), 0 deletions(-)
 create mode 100644 src/lxc/Makefile2

diff --git a/src/lxc/Makefile2 b/src/lxc/Makefile2
new file mode 100644
index 0000000..26b9cd3
--- /dev/null
+++ b/src/lxc/Makefile2
@@ -0,0 +1,35 @@
+BASEDIR = ../..
+
+USERCR ?= 	$(BASEDIR)/../user-cr-lxc/
+
+CFLAGS = 	-static -I . -I .. -I $(USERCR) -I $(USERCR)/include
+LDFLAGS = 	$(USERCR)/libeclone.a -lutil
+
+LXC_OBJS = 	start.o stop.o conf.o confile.o arguments.o monitor.o	\
+		log.o mainloop.o utils.o commands.o state.o cgroup.o	\
+		error.o namespace.o parse.o network.o af_unix.o 	\
+		console.o nl.o
+
+USERCR_CHECKPOINT_OBJ =	$(USERCR)/checkpoint.o
+
+USERCR_RESTART_OBJ = 	$(USERCR)/restart.o
+
+LXC_CHECKPOINT_OBJS = 	$(LXC_OBJS) $(USERCR_CHECKPOINT_OBJ) \
+			lxc_checkpoint.o checkpoint.o
+
+LXC_RESTART_OBJS = 	$(LXC_OBJS) $(USERCR_RESTART_OBJ) \
+			lxc_restart.o restart.o 
+
+LXC_EXECUTE_OBJS =	$(LXC_OBJS) lxc_execute.o
+
+lxc_checkpoint: $(LXC_CHECKPOINT_OBJS)
+	$(CC) -o lxc_checkpoint $(LXC_CHECKPOINT_OBJS) $(LDFLAGS)
+
+lxc_restart: $(LXC_RESTART_OBJS)
+	$(CC) -o lxc_restart $(LXC_RESTART_OBJS) $(LDFLAGS)
+
+lxc_execute: $(LXC_EXECUTE_OBJS)
+	$(CC) -o lxc_execute $(LXC_EXECUTE_OBJS) $(LDFLAGS)
+
+clean:
+	rm -f $(RESTART_OBJS)
-- 
1.6.6.1

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 2/5][lxc] lxc_restart: Add --image option
       [not found] ` <20100319063912.GA25732-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
  2010-03-19  6:40   ` [PATCH 1/5][lxc] Enable static linking of some lxc binaries Sukadev Bhattiprolu
@ 2010-03-19  6:40   ` Sukadev Bhattiprolu
       [not found]     ` <20100319064046.GC25732-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
  2010-03-19  6:41   ` [PATCH 3/5][lxc] lxc_checkpoint: " Sukadev Bhattiprolu
                     ` (4 subsequent siblings)
  6 siblings, 1 reply; 20+ messages in thread
From: Sukadev Bhattiprolu @ 2010-03-19  6:40 UTC (permalink / raw)
  To: dlezcano-NmTC/0ZBporQT0dZR+AlfA; +Cc: Containers, clg-NmTC/0ZBporQT0dZR+AlfA


From: Sukadev Bhattiprolu <sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
Date: Wed, 10 Mar 2010 21:59:39 -0800
Subject: [PATCH 2/5][lxc] lxc_restart: Add --image option

The existing --directory option to lxc_restart expects the checkpoint state
to be a directory. USERCR however uses a single regular file to store the
checkpoint image. So add a --image option to enable checkpointing and
restarting applications using USERCR.

Depending on how the application was checkpointed, users should specify
either --image=CHECKPOINT-IMAGE or the --directory=STATEFILE option (but not
both).

Signed-off-by: Sukadev Bhattiprolu <sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
---
 src/lxc/arguments.h   |    1 +
 src/lxc/lxc_restart.c |   29 ++++++++++++++++++++++-------
 2 files changed, 23 insertions(+), 7 deletions(-)

diff --git a/src/lxc/arguments.h b/src/lxc/arguments.h
index 3bc027d..30953ee 100644
--- a/src/lxc/arguments.h
+++ b/src/lxc/arguments.h
@@ -45,6 +45,7 @@ struct lxc_arguments {
 	int daemonize;
 	const char *rcfile;
 	const char *statefile;
+	const char *imagefile;
 
 	/* for lxc-checkpoint */
 	int flags;
diff --git a/src/lxc/lxc_restart.c b/src/lxc/lxc_restart.c
index 7db1d85..39f7ea8 100644
--- a/src/lxc/lxc_restart.c
+++ b/src/lxc/lxc_restart.c
@@ -41,10 +41,17 @@ static struct lxc_list defines;
 
 static int my_checker(const struct lxc_arguments* args)
 {
-	if (!args->statefile) {
-		lxc_error(args, "no statefile specified");
-		return -1;
-	}
+	int i, s;
+	
+	/* make them boolean */
+	i = !!(args->imagefile);
+	s = !!(args->statefile);
+
+        if (!(i ^ s)) {
+                lxc_error(args, "Must specify exactly one of --directory "
+                                "and --image options");
+                return -1;
+        }
 
 	return 0;
 }
@@ -54,6 +61,7 @@ static int my_parser(struct lxc_arguments* args, int c, char* arg)
 	switch (c) {
 	case 'd': args->statefile = arg; break;
 	case 'f': args->rcfile = arg; break;
+	case 'i': args->imagefile = arg; break;
 	case 'p': args->flags = LXC_FLAG_PAUSE; break;
 	case 's': return lxc_config_define_add(&defines, arg);
 	}
@@ -66,6 +74,7 @@ static const struct option my_longopts[] = {
 	{"rcfile", required_argument, 0, 'f'},
 	{"pause", no_argument, 0, 'p'},
 	{"define", required_argument, 0, 's'},
+	{"image", required_argument, 0, 'i'},
 	LXC_COMMON_OPTIONS
 };
 
@@ -73,14 +82,16 @@ static struct lxc_arguments my_args = {
 	.progname = "lxc-restart",
 	.help     = "\
 --name=NAME --directory STATEFILE\n\
+\tlxc_restart --name=NAME --image CHECKPOINT-IMAGE\n\
 \n\
 lxc-restart restarts from STATEFILE the NAME container\n\
 \n\
 Options :\n\
   -n, --name=NAME      NAME for name of the container\n\
   -p, --pause          do not release the container after the restart\n\
-  -d, --directory=STATEFILE for name of statefile\n\
+  -d, --directory=STATEFILE for name of statefile(legacy mode)\n\
   -f, --rcfile=FILE Load configuration file FILE\n\
+  -i, --image=FILE Load the application state from FILE(user-cr mode)\n\
   -s, --define KEY=VAL Assign VAL to configuration variable KEY\n",
 	.options  = my_longopts,
 	.parser   = my_parser,
@@ -90,6 +101,7 @@ Options :\n\
 int main(int argc, char *argv[])
 {
 	char *rcfile = NULL;
+	const char *image = NULL;
 	struct lxc_conf *conf;
 
 	lxc_list_init(&defines);
@@ -131,6 +143,9 @@ int main(int argc, char *argv[])
 	if (lxc_config_define_load(&defines, conf))
 		return -1;
 
-	return lxc_restart(my_args.name, my_args.statefile, conf,
-			   my_args.flags);
+	image = my_args.imagefile;
+	if (my_args.statefile)
+		image = my_args.statefile;
+
+	return lxc_restart(my_args.name, image, conf, my_args.flags);
 }
-- 
1.6.6.1

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 3/5][lxc] lxc_checkpoint: Add --image option
       [not found] ` <20100319063912.GA25732-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
  2010-03-19  6:40   ` [PATCH 1/5][lxc] Enable static linking of some lxc binaries Sukadev Bhattiprolu
  2010-03-19  6:40   ` [PATCH 2/5][lxc] lxc_restart: Add --image option Sukadev Bhattiprolu
@ 2010-03-19  6:41   ` Sukadev Bhattiprolu
  2010-03-19  6:41   ` [PATCH 4/5][lxc] Hook up lxc_restart() with app_restart() Sukadev Bhattiprolu
                     ` (3 subsequent siblings)
  6 siblings, 0 replies; 20+ messages in thread
From: Sukadev Bhattiprolu @ 2010-03-19  6:41 UTC (permalink / raw)
  To: dlezcano-NmTC/0ZBporQT0dZR+AlfA; +Cc: Containers, clg-NmTC/0ZBporQT0dZR+AlfA


From: Sukadev Bhattiprolu <sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
Date: Wed, 10 Mar 2010 22:24:17 -0800
Subject: [PATCH 3/5][lxc] lxc_checkpoint: Add --image option

The existing --directory option to lxc_checkpoint expects to save the
checkpoint state in a directory. USERCR however uses a single regular
file to store the checkpoint image. So add a --image option to enable
checkpointing and restarting applications using USERCR.

Users should specify either --image or --directory option (but not both)
to select the file/directory where the application state will be stored.

Signed-off-by: Sukadev Bhattiprolu <sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
---
 src/lxc/lxc_checkpoint.c |   34 +++++++++++++++++++++++++---------
 1 files changed, 25 insertions(+), 9 deletions(-)

diff --git a/src/lxc/lxc_checkpoint.c b/src/lxc/lxc_checkpoint.c
index a8c74a9..3554518 100644
--- a/src/lxc/lxc_checkpoint.c
+++ b/src/lxc/lxc_checkpoint.c
@@ -39,10 +39,17 @@ lxc_log_define(lxc_checkpoint_ui, lxc_checkpoint);
 
 static int my_checker(const struct lxc_arguments* args)
 {
-	if (!args->statefile) {
-		lxc_error(args, "no statefile specified");
-		return -1;
-	}
+	int i, s;
+	
+	/* make them boolean */
+	i = !!(args->imagefile);
+	s = !!(args->statefile);
+
+        if (!(i ^ s)) {
+                lxc_error(args, "Must specify exactly one of --directory "
+                                "and --image options");
+                return -1;
+        }
 
 	return 0;
 }
@@ -53,6 +60,7 @@ static int my_parser(struct lxc_arguments* args, int c, char* arg)
 	case 'k': args->flags = LXC_FLAG_HALT; break;
 	case 'p': args->flags = LXC_FLAG_PAUSE; break;
 	case 'd': args->statefile = arg; break;
+	case 'i': args->imagefile = arg; break;
 	}
 	return 0;
 }
@@ -61,6 +69,7 @@ static const struct option my_longopts[] = {
 	{"kill", no_argument, 0, 'k'},
 	{"pause", no_argument, 0, 'p'},
 	{"directory", required_argument, 0, 'd'},
+	{"image", required_argument, 0, 'i'},
 	LXC_COMMON_OPTIONS
 };
 
@@ -68,6 +77,7 @@ static struct lxc_arguments my_args = {
 	.progname = "lxc-checkpoint",
 	.help     = "\
 --name=NAME --directory STATEFILE\n\
+\tlxc_checkpoint --name=NAME --image CHECKPOINT-IMAGE\n\
 \n\
 lxc-checkpoint checkpoints in STATEFILE the NAME container\n\
 \n\
@@ -75,7 +85,8 @@ Options :\n\
   -n, --name=NAME      NAME for name of the container\n\
   -k, --kill           stop the container after checkpoint\n\
   -p, --pause          don't unfreeze the container after the checkpoint\n\
-  -d, --directory=STATEFILE where to store the statefile\n",
+  -d, --directory=STATEFILE where to store the statefile (legacy mode)\n\
+  -i, --image=FILE where to store the checkpoint-image (USERCR mode)\n",
 
 	.options  = my_longopts,
 	.parser   = my_parser,
@@ -97,6 +108,7 @@ static int create_statefile(const char *dir)
 int main(int argc, char *argv[])
 {
 	int ret;
+	const char *image;
 
 	ret = lxc_arguments_parse(&my_args, argc, argv);
 	if (ret)
@@ -107,11 +119,15 @@ int main(int argc, char *argv[])
 	if (ret)
 		return ret;
 
-	ret = create_statefile(my_args.statefile);
-	if (ret)
-		return ret;
+	image = my_args.imagefile;
+	if (my_args.statefile) {
+		image = my_args.statefile;
+		ret = create_statefile(my_args.statefile);
+		if (ret)
+			return ret;
+	}
 
-	ret = lxc_checkpoint(my_args.name, my_args.statefile, my_args.flags);
+	ret = lxc_checkpoint(my_args.name, image, my_args.flags);
 	if (ret)
 		ERROR("failed to checkpoint '%s'", my_args.name);
 	else
-- 
1.6.6.1

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 4/5][lxc] Hook up lxc_restart() with app_restart()
       [not found] ` <20100319063912.GA25732-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
                     ` (2 preceding siblings ...)
  2010-03-19  6:41   ` [PATCH 3/5][lxc] lxc_checkpoint: " Sukadev Bhattiprolu
@ 2010-03-19  6:41   ` Sukadev Bhattiprolu
       [not found]     ` <20100319064121.GE25732-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
  2010-03-19  6:41   ` [PATCH 5/5][lxc] Hook up lxc_checkpoint() with app_checkpoint() Sukadev Bhattiprolu
                     ` (2 subsequent siblings)
  6 siblings, 1 reply; 20+ messages in thread
From: Sukadev Bhattiprolu @ 2010-03-19  6:41 UTC (permalink / raw)
  To: dlezcano-NmTC/0ZBporQT0dZR+AlfA; +Cc: Containers, clg-NmTC/0ZBporQT0dZR+AlfA


From: Sukadev Bhattiprolu <sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
Date: Thu, 11 Mar 2010 20:47:56 -0800
Subject: [PATCH 4/5][lxc] Hook up lxc_restart() with app_restart()

Have lxc_restart() call app_restart() implemented in the 'restart.o' from
USER-CR git tree.

Changelog[v2]:
	- Link with restart.o from usercr rather than libcheckpoint.a
	- rename 'struct restart_args' to 'struct app_restart_args'
	- Initialize the new field app_restart_args->uerrfd
	- (Oren Laadan)Remove ->send_sigint field from 'struct app_restart_args'
---
 src/lxc/restart.c |  104 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 104 insertions(+), 0 deletions(-)

diff --git a/src/lxc/restart.c b/src/lxc/restart.c
index 467489e..945435c 100644
--- a/src/lxc/restart.c
+++ b/src/lxc/restart.c
@@ -22,11 +22,115 @@
  */
 #include <lxc/lxc.h>
 #include <lxc/log.h>
+#include <lxc/start.h>
+#include <lxc/namespace.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <sys/prctl.h>
+#include <app-checkpoint.h>
+
+struct lxc_restart_arg {
+	const char *name;
+	const char *statefile;
+	char *const argv;
+	struct lxc_handler *handler;
+};
 
 lxc_log_define(lxc_restart, lxc);
 
+static int do_restart(struct lxc_restart_arg *lxcarg)
+{
+	int pid;
+	struct lxc_handler *handler = lxcarg->handler;
+	const char *name = lxcarg->name;
+	char *const argv = lxcarg->argv;
+	const char *statefile = lxcarg->statefile;
+	struct app_restart_args restart_args;
+
+        if (sigprocmask(SIG_SETMASK, &handler->oldmask, NULL)) {
+                SYSERROR("failed to set sigprocmask");
+                return -1;
+        }
+
+        if (prctl(PR_SET_PDEATHSIG, SIGKILL, 0, 0, 0)) {
+                SYSERROR("failed to set pdeath signal");
+                return -1;
+        }
+
+	memset(&restart_args, 0, sizeof(restart_args));
+
+	if (statefile) {
+		restart_args.infd = open(statefile, O_RDONLY, 0);
+		if (restart_args.infd < 0) {
+			SYSERROR("Failed to open statefile %s\n", statefile);
+			return -1;
+		}
+	}
+
+	restart_args.pids = 1;
+	restart_args.pidns = 1;
+	restart_args.mnt_pty = 1;
+	restart_args.mntns = 1;
+	restart_args.klogfd = -1;
+	restart_args.ulogfd = lxc_log_fd;
+	restart_args.uerrfd = fileno(stderr);
+	restart_args.debug = 1;
+	restart_args.wait = 0;
+
+        pid = app_restart(&restart_args);
+
+        return pid;
+}
+
 int lxc_restart(const char *name, const char *statefile, struct lxc_conf *conf,
 		int flags)
 {
+	int err;
+	int status;
+	struct lxc_handler *handler;
+	struct lxc_restart_arg lxcarg = {
+		.name = name,
+		.statefile = statefile,
+		.handler = NULL,
+	};
+
+	handler = lxc_init(name, conf);
+	if (!handler) {
+		ERROR("failed to initialize the container");
+		return -1;
+	}
+
+	lxcarg.handler = handler;
+	handler->pid = do_restart(&lxcarg);
+
+	INFO("do_restart(): returns pid %d\n", handler->pid);
+	lxc_rename_nsgroup(name, handler);
+
+	err = lxc_close_all_inherited_fd();
+	if (err) {
+		ERROR("unable to close inherited fds");
+		goto out_abort;
+	}
+
+	err = lxc_poll(name, handler);
+	if (err) {
+		ERROR("mainloop exited with an error");
+		goto out_abort;
+	}
+
+	while (waitpid(handler->pid, &status, 0) < 0 && errno == EINTR)
+		continue;
+
+	err =  lxc_error_set_and_log(handler->pid, status);
+
+out_fini:
+	lxc_fini(name, handler);
+	return err;
+
+out_abort:
+	lxc_abort(name, handler);
+	goto out_fini;
+
 	return 0;
 }
-- 
1.6.6.1

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 5/5][lxc] Hook up lxc_checkpoint() with app_checkpoint()
       [not found] ` <20100319063912.GA25732-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
                     ` (3 preceding siblings ...)
  2010-03-19  6:41   ` [PATCH 4/5][lxc] Hook up lxc_restart() with app_restart() Sukadev Bhattiprolu
@ 2010-03-19  6:41   ` Sukadev Bhattiprolu
       [not found]     ` <20100319064141.GF25732-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
  2010-03-19 10:44   ` [RFC][PATCH 0/5][lxc]: Link with USERCR Michel Normand
  2010-03-22 14:45   ` Daniel Lezcano
  6 siblings, 1 reply; 20+ messages in thread
From: Sukadev Bhattiprolu @ 2010-03-19  6:41 UTC (permalink / raw)
  To: dlezcano-NmTC/0ZBporQT0dZR+AlfA; +Cc: Containers, clg-NmTC/0ZBporQT0dZR+AlfA


From: Sukadev Bhattiprolu <sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
Date: Thu, 11 Mar 2010 21:32:38 -0800
Subject: [PATCH 5/5][lxc] Hook up lxc_checkpoint() with app_checkpoint()

Have lxc_checkpoint() call app_checkpoint() implemented in checkpoint.o
in the USER-CR git tree

TODO:
	- Map lxc_flags to flags in sys_checkpoint()
	- Initialize app_checkpoint_args.debug and other fields based on
	  command line options to lxc_checkpoint rather than hard-coding
	  them

Signed-off-by: Sukadev Bhattiprolu <sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
---
 src/lxc/checkpoint.c |   91 +++++++++++++++++++++++++++++++++++++++++++++++++-
 src/lxc/commands.c   |    3 ++
 src/lxc/commands.h   |    1 +
 src/lxc/state.c      |   26 ++++++++++++++
 4 files changed, 120 insertions(+), 1 deletions(-)

diff --git a/src/lxc/checkpoint.c b/src/lxc/checkpoint.c
index 7e8a93e..0fbabc8 100644
--- a/src/lxc/checkpoint.c
+++ b/src/lxc/checkpoint.c
@@ -22,10 +22,99 @@
  */
 #include <lxc/lxc.h>
 #include <lxc/log.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <linux/checkpoint.h>
+
+#include "commands.h"
+#include "arguments.h"
+#include "app-checkpoint.h"
 
 lxc_log_define(lxc_checkpoint, lxc);
 
-int lxc_checkpoint(const char *name, const char *statefile, int flags)
+find_cinit_pid(const char *name)
 {
+	struct lxc_command command = {
+		.request = { .type = LXC_COMMAND_CINIT_PID },
+	};
+
+	int ret, stopped;
+
+	ret = lxc_command(name, &command, &stopped);
+	if (ret < 0) {
+		ERROR("failed to send command");
+		return -1;
+	}
+
+	ERROR("find_cinit_pid %d\n", command.answer.ret);
+
+	return command.answer.ret;
+}
+
+int lxc_checkpoint(const char *name, const char *statefile, int lxc_flags)
+{
+	int ret;
+	int pid;
+	int flags;
+	struct stat statbuf;
+	struct app_checkpoint_args crargs;
+
+	if (access(statefile, F_OK) == 0) {
+		ret = stat(statefile, &statbuf);
+		if (ret < 0) {
+			ERROR("stat(%s): %s\n", statefile, strerror(errno));
+			return -1;
+		}
+
+		if (S_ISDIR(statbuf.st_mode)) {
+			ERROR("--directory option not implemented");
+			return -1;
+		} else {
+			ERROR("Checkpoint image file %s exists\n", statefile);
+			return -1;
+		}
+	}
+
+	pid = find_cinit_pid(name);
+	if (pid < 0) {
+		ERROR("Unable to find cinit pid");
+		return -1;
+	}
+
+	memset(&crargs, 0, sizeof(crargs));
+
+	ret = open(statefile, O_CREAT|O_RDWR|O_EXCL, 0644);
+	if (ret < 0) {
+		ERROR("open(%s) failed\n", statefile);
+		return -1;
+	}
+
+	crargs.outfd = ret;
+	crargs.logfd = lxc_log_fd;
+	crargs.uerrfd = lxc_log_fd;
+	/*
+	 * TODO: Set this to 0 for now - otherwise we get an objhash leak
+	 * 	 due to mismatched references to current PTY which needs to
+	 * 	 be investigated.
+	 *
+	 * TODO: Map @lxc_flags to user-cr flags ?
+	 *
+	 * TODO: We can probably drop the ->container field since @flags
+	 * 	 can provide the same selection. 
+	 *
+	 * TODO: Do we may need a --container option to lxc_checkpoint or
+	 * 	 assume that we always work with full containers ?
+	 */
+	crargs.container = 0;
+
+	flags = CHECKPOINT_SUBTREE;
+
+	ret = app_checkpoint(pid, flags, &crargs);
+	if (ret < 0) {
+		ERROR("checkpoint of %s (pid %d) failed\n", name);
+		return -1;
+	}
+
 	return 0;
 }
diff --git a/src/lxc/commands.c b/src/lxc/commands.c
index 4c48571..af5c947 100644
--- a/src/lxc/commands.c
+++ b/src/lxc/commands.c
@@ -114,6 +114,8 @@ extern void lxc_console_remove_fd(int, struct lxc_tty_info *);
 extern int  lxc_console_callback(int, struct lxc_request *, struct lxc_handler *);
 extern int  lxc_stop_callback(int, struct lxc_request *, struct lxc_handler *);
 extern int  lxc_state_callback(int, struct lxc_request *, struct lxc_handler *);
+extern int  lxc_cinit_pid_callback(int, struct lxc_request *,
+				struct lxc_handler *);
 
 static int trigger_command(int fd, struct lxc_request *request,
 			   struct lxc_handler *handler)
@@ -124,6 +126,7 @@ static int trigger_command(int fd, struct lxc_request *request,
 		[LXC_COMMAND_TTY]   = lxc_console_callback,
 		[LXC_COMMAND_STOP]  = lxc_stop_callback,
 		[LXC_COMMAND_STATE] = lxc_state_callback,
+		[LXC_COMMAND_CINIT_PID] = lxc_cinit_pid_callback,
 	};
 
 	if (request->type < 0 || request->type >= LXC_COMMAND_MAX)
diff --git a/src/lxc/commands.h b/src/lxc/commands.h
index 3c6c082..22b24a9 100644
--- a/src/lxc/commands.h
+++ b/src/lxc/commands.h
@@ -27,6 +27,7 @@ enum {
 	LXC_COMMAND_TTY,
 	LXC_COMMAND_STOP,
 	LXC_COMMAND_STATE,
+	LXC_COMMAND_CINIT_PID,
 	LXC_COMMAND_MAX,
 };
 
diff --git a/src/lxc/state.c b/src/lxc/state.c
index ba63805..837d2da 100644
--- a/src/lxc/state.c
+++ b/src/lxc/state.c
@@ -168,3 +168,29 @@ out:
 	return ret;
 }
 
+extern int lxc_cinit_pid_callback(int fd, struct lxc_request *request,
+		struct lxc_handler *handler)
+{
+	struct lxc_answer answer;
+	int ret;
+	FILE *fp;
+
+	answer.ret = handler->pid;
+
+	INFO("Returning pid %d\n", handler->pid);
+
+	ret = send(fd, &answer, sizeof(answer), 0);
+	if (ret < 0) {
+		WARN("failed to send answer to the peer");
+		goto out;
+	}
+
+	if (ret != sizeof(answer)) {
+		ERROR("partial answer sent");
+		goto out;
+	}
+
+out:
+	return ret;
+}
+
-- 
1.6.6.1

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* Re: [RFC][PATCH 0/5][lxc]: Link with USERCR
       [not found] ` <20100319063912.GA25732-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
                     ` (4 preceding siblings ...)
  2010-03-19  6:41   ` [PATCH 5/5][lxc] Hook up lxc_checkpoint() with app_checkpoint() Sukadev Bhattiprolu
@ 2010-03-19 10:44   ` Michel Normand
  2010-03-24 19:22     ` Sukadev Bhattiprolu
  2010-03-22 14:45   ` Daniel Lezcano
  6 siblings, 1 reply; 20+ messages in thread
From: Michel Normand @ 2010-03-19 10:44 UTC (permalink / raw)
  To: Sukadev Bhattiprolu
  Cc: Containers, clg-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8,
	DLEZCANO-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8

Le jeudi 18 mars 2010 à 23:39 -0700, Sukadev Bhattiprolu a écrit :
> Link lxc_checkpoint, lxc_restart with USERCR[2]
> 
> Following set of patches, when applied to LXC 0.6.5 and built with
> USERCR, enable lxc_checkpoint and lxc_restart of some simple containers.
> 
> TODO:
> 	- For simplicity, this patchset currently links *statically* with
> 	  USERCR. We should eventually build checkpoint.o and restart.o in
> 	  USERCR as shared objects and link lxc_checkpoint/lxc_restart with
> 	  these shared objects and liblxc.so. (This also required rebuilding
> 	  lxc-execute statically, so lxc_checkpoint can communicate with
> 	  lxc-execute to get the root-pid of container).
> 
> 	- Determine if lxc_checkpoint needs a --container option (see
> 	  TODOs in src/lxc/checkpoint.c)
> 
> 	- This patchset was tested using lxc-macvlan.conf. But for the VNC
> 	  server testing I ran into a problem with lxc-macvlan.conf. I
> 	  switched to 'lxc-no-netns.conf' and was able to C/R the VNC server.
> 	  I have not debugged the problem with VNC and lxc-macvlan.conf.
> 
> 	- 'global_send_sigint' is still a global variable in USERCR. We need
> 	  to define a better interface to expose its functionality to callers
> 	  of app_restart().
> 
> 	- Choose better names and API for USERCR :-)
> 
> Changelog[v2]: 
> 	(Based on feedback from Oren Laadan, Serge Hallyn, Daniel Lezcano
> 	and Cedric Le Goater)
> 
> 	- Rather than drop --directory option to lxc_checkpoint/lxc_restart
> 	  add a new option (--image).
> 
> 	- Integrate lxc_checkpoint to work with USERCR
> 
> 	- USERCR renamed usercr.h to "app-checkpoint.h"
> 
> 	- USERCR does not create/install libcheckpoint.a and usercr.h for now.
> 	  So link directly with app-checkpoint.h, restart.o and checkpoint.o
> 
> 	- USERCR renames the interfaces to app_checkpoint() and app_restart()
> 	  'struct app_checkpoint_args' 'struct app_restart_args'.
> 	  
> USAGE:
> 
> 1. Build USERCR
> 
> 	$ cd /root
> 
> 	$ git-clone git://git.ncl.cs.columbia.edu/pub/git/user-cr.git user-cr
> 
> 	$ git-checkout ckpt-v20 
> 	
> 	# Apply patches in the following set:
> 
> 	# https://lists.linux-foundation.org/pipermail/containers/2010-March/023793.html
> 
> 	$ cd /root/user-cr
> 
> 	$ make 
> 
> 		This should create restart.o and checkpoint.o
> 
> 2. Build/install lxc_checkpoint and lxc_restart
> 
> 	# Do normal LXC build/install of 0.6.5.
> 
> 	# Then replace 'lxc-execute', 'lxc-checkpoint', 'lxc-restart' with
> 	# new version. i.e Apply attached patches and:
> 
> 	$ cd src/lxc

Your patch set is not usable as is, with requirement to apply the patch
between two sequences of build, and lxc unable to be built with it.

Please do a patch of automake files and related configure.ac
rather than to create a Makefile2 file.

> 
> 	$ USERCR=/root/user-cr \
> 		make -f Makefile2 lxc_checkpoint lxc_restart lxc_execute
> 
> 	$ cp lxc_checkpoint lxc_restart lxc-execute  /usr/local/bin
> 
> 3. Checkpoint/restart a simple LXC container
> 
> 	$ lxc-execute --name foo --rcfile lxc-no-netns.conf -- /bin/sleep 1000
> 
> 	$ lxc-freeze --name foo
> 
> 	$ lxc-checkpoint --name foo --image /root/lxc-foo.ckpt
> 
> 	$ lxc-unfreeze --name foo
> 
> 	$ lxc-stop --name foo
> 
> 	$ lxc-restart --name foo --image /root/lxc-foo.ckpt
> 
> 4. Checkpoint/restart other LXC containers such as:
> 
> 	- a file-io session (see run-fileio1 in cr-tests[1])
> 
> 	- process-tree (see run-ptree1 in cr-tests[1])
> 
> 	- A vi session inside a VNC Server using "twm". i.e
> 
> 		$ cat /root/.vnc/xstartup
> 		#!/bin/sh
> 
> 		xsetroot -solid grey
> 		vncconfig -iconic &
> 		xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
> 		twm &
> 
> 		$ lxc-execute --name foo --rcfile lxc-no-netns.conf -- \
> 			/usr/bin/vncserver :1
> 
> 		$ vncviewer :1
> 
> 			# Open a vi session
> 
> 		$ lxc-freeze --name foo 
> 
> 			etc
> 
> [1]: cr-tests:	git://git.sr71.net/~hallyn/cr_tests.git
> [2]: USERCR: git://git.ncl.cs.columbia.edu/pub/git/user-cr.git
> 
> Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
> _______________________________________________
> Containers mailing list
> Containers@lists.linux-foundation.org
> https://lists.linux-foundation.org/mailman/listinfo/containers


_______________________________________________
Containers mailing list
Containers@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/containers

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 1/5][lxc] Enable static linking of some lxc binaries
       [not found]     ` <20100319064024.GB25732-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
@ 2010-03-22 14:44       ` Daniel Lezcano
  0 siblings, 0 replies; 20+ messages in thread
From: Daniel Lezcano @ 2010-03-22 14:44 UTC (permalink / raw)
  To: Sukadev Bhattiprolu; +Cc: Containers, clg-NmTC/0ZBporQT0dZR+AlfA

Sukadev Bhattiprolu wrote:
> From: Sukadev Bhattiprolu <sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
> Date: Wed, 10 Mar 2010 22:12:34 -0800
> Subject: [PATCH 1/5][lxc] Enable static linking of some lxc binaries
> 
> This is a temporary commit to statically link lxc_checkpoint, lxc_execute
> and lxc_restart.
> 
> Signed-off-by: Sukadev Bhattiprolu <sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
> ---
>  src/lxc/Makefile2 |   35 +++++++++++++++++++++++++++++++++++
>  1 files changed, 35 insertions(+), 0 deletions(-)
>  create mode 100644 src/lxc/Makefile2
> 
> diff --git a/src/lxc/Makefile2 b/src/lxc/Makefile2
> new file mode 100644
> index 0000000..26b9cd3
> --- /dev/null
> +++ b/src/lxc/Makefile2
> @@ -0,0 +1,35 @@
> +BASEDIR = ../..
> +
> +USERCR ?= 	$(BASEDIR)/../user-cr-lxc/
> +
> +CFLAGS = 	-static -I . -I .. -I $(USERCR) -I $(USERCR)/include
> +LDFLAGS = 	$(USERCR)/libeclone.a -lutil
> +
> +LXC_OBJS = 	start.o stop.o conf.o confile.o arguments.o monitor.o	\
> +		log.o mainloop.o utils.o commands.o state.o cgroup.o	\
> +		error.o namespace.o parse.o network.o af_unix.o 	\
> +		console.o nl.o
> +
> +USERCR_CHECKPOINT_OBJ =	$(USERCR)/checkpoint.o
> +
> +USERCR_RESTART_OBJ = 	$(USERCR)/restart.o
> +
> +LXC_CHECKPOINT_OBJS = 	$(LXC_OBJS) $(USERCR_CHECKPOINT_OBJ) \
> +			lxc_checkpoint.o checkpoint.o
> +
> +LXC_RESTART_OBJS = 	$(LXC_OBJS) $(USERCR_RESTART_OBJ) \
> +			lxc_restart.o restart.o 
> +
> +LXC_EXECUTE_OBJS =	$(LXC_OBJS) lxc_execute.o
> +
> +lxc_checkpoint: $(LXC_CHECKPOINT_OBJS)
> +	$(CC) -o lxc_checkpoint $(LXC_CHECKPOINT_OBJS) $(LDFLAGS)
> +
> +lxc_restart: $(LXC_RESTART_OBJS)
> +	$(CC) -o lxc_restart $(LXC_RESTART_OBJS) $(LDFLAGS)
> +
> +lxc_execute: $(LXC_EXECUTE_OBJS)
> +	$(CC) -o lxc_execute $(LXC_EXECUTE_OBJS) $(LDFLAGS)
> +
> +clean:
> +	rm -f $(RESTART_OBJS)

Is it possible to add a 'configure' option and merge that with the lxc 
Makefile.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 5/5][lxc] Hook up lxc_checkpoint() with app_checkpoint()
       [not found]     ` <20100319064141.GF25732-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
@ 2010-03-22 14:44       ` Daniel Lezcano
       [not found]         ` <4BA78262.6050109-NmTC/0ZBporQT0dZR+AlfA@public.gmane.org>
  0 siblings, 1 reply; 20+ messages in thread
From: Daniel Lezcano @ 2010-03-22 14:44 UTC (permalink / raw)
  To: Sukadev Bhattiprolu; +Cc: Containers, clg-NmTC/0ZBporQT0dZR+AlfA

Sukadev Bhattiprolu wrote:
> From: Sukadev Bhattiprolu <sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
> Date: Thu, 11 Mar 2010 21:32:38 -0800
> Subject: [PATCH 5/5][lxc] Hook up lxc_checkpoint() with app_checkpoint()
> 
> Have lxc_checkpoint() call app_checkpoint() implemented in checkpoint.o
> in the USER-CR git tree
> 
> TODO:
> 	- Map lxc_flags to flags in sys_checkpoint()
> 	- Initialize app_checkpoint_args.debug and other fields based on
> 	  command line options to lxc_checkpoint rather than hard-coding
> 	  them
> 
> Signed-off-by: Sukadev Bhattiprolu <sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
> ---
>  src/lxc/checkpoint.c |   91 +++++++++++++++++++++++++++++++++++++++++++++++++-
>  src/lxc/commands.c   |    3 ++
>  src/lxc/commands.h   |    1 +
>  src/lxc/state.c      |   26 ++++++++++++++
>  4 files changed, 120 insertions(+), 1 deletions(-)
> 
> diff --git a/src/lxc/checkpoint.c b/src/lxc/checkpoint.c
> index 7e8a93e..0fbabc8 100644
> --- a/src/lxc/checkpoint.c
> +++ b/src/lxc/checkpoint.c
> @@ -22,10 +22,99 @@
>   */
>  #include <lxc/lxc.h>
>  #include <lxc/log.h>
> +#include <sys/stat.h>
> +#include <fcntl.h>
> +#include <errno.h>
> +#include <linux/checkpoint.h>
> +
> +#include "commands.h"
> +#include "arguments.h"
> +#include "app-checkpoint.h"
> 
>  lxc_log_define(lxc_checkpoint, lxc);
> 
> -int lxc_checkpoint(const char *name, const char *statefile, int flags)
> +find_cinit_pid(const char *name)
>  {
> +	struct lxc_command command = {
> +		.request = { .type = LXC_COMMAND_CINIT_PID },
> +	};
> +
> +	int ret, stopped;
> +
> +	ret = lxc_command(name, &command, &stopped);
> +	if (ret < 0) {
> +		ERROR("failed to send command");
> +		return -1;
> +	}
> +
> +	ERROR("find_cinit_pid %d\n", command.answer.ret);
> +
> +	return command.answer.ret;
> +}

I just committed the same function for the lxc_attach command. I think 
you can reuse it.

> +int lxc_checkpoint(const char *name, const char *statefile, int lxc_flags)
> +{
> +	int ret;
> +	int pid;
> +	int flags;
> +	struct stat statbuf;
> +	struct app_checkpoint_args crargs;
> +
> +	if (access(statefile, F_OK) == 0) {
> +		ret = stat(statefile, &statbuf);
> +		if (ret < 0) {
> +			ERROR("stat(%s): %s\n", statefile, strerror(errno));
> +			return -1;
> +		}
> +
> +		if (S_ISDIR(statbuf.st_mode)) {
> +			ERROR("--directory option not implemented");
> +			return -1;
> +		} else {
> +			ERROR("Checkpoint image file %s exists\n", statefile);
> +			return -1;
> +		}
> +	}

For the checkpoint, you don't need to check if it's a directory or a 
file (but it should be done at restart time). I am not sure 'access' is 
really necessary because the O_EXCL is set in the open below.

> +
> +	pid = find_cinit_pid(name);
> +	if (pid < 0) {
> +		ERROR("Unable to find cinit pid");
> +		return -1;
> +	}
> +
> +	memset(&crargs, 0, sizeof(crargs));
> +
> +	ret = open(statefile, O_CREAT|O_RDWR|O_EXCL, 0644);
> +	if (ret < 0) {
> +		ERROR("open(%s) failed\n", statefile);
> +		return -1;
> +	}

As the statefile may contain sensible data, it would be preferable to 
set it 0600, no ?

> +	crargs.outfd = ret;
> +	crargs.logfd = lxc_log_fd;
> +	crargs.uerrfd = lxc_log_fd;
> +	/*
> +	 * TODO: Set this to 0 for now - otherwise we get an objhash leak
> +	 * 	 due to mismatched references to current PTY which needs to
> +	 * 	 be investigated.
> +	 *
> +	 * TODO: Map @lxc_flags to user-cr flags ?
> +	 *
> +	 * TODO: We can probably drop the ->container field since @flags
> +	 * 	 can provide the same selection. 
> +	 *
> +	 * TODO: Do we may need a --container option to lxc_checkpoint or
> +	 * 	 assume that we always work with full containers ?
> +	 */
> +	crargs.container = 0;
> +
> +	flags = CHECKPOINT_SUBTREE;
> +
> +	ret = app_checkpoint(pid, flags, &crargs);
> +	if (ret < 0) {
> +		ERROR("checkpoint of %s (pid %d) failed\n", name);
> +		return -1;
> +	}
> +
>  	return 0;
>  }

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC][PATCH 0/5][lxc]: Link with USERCR
       [not found] ` <20100319063912.GA25732-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
                     ` (5 preceding siblings ...)
  2010-03-19 10:44   ` [RFC][PATCH 0/5][lxc]: Link with USERCR Michel Normand
@ 2010-03-22 14:45   ` Daniel Lezcano
       [not found]     ` <4BA7826D.10706-NmTC/0ZBporQT0dZR+AlfA@public.gmane.org>
  6 siblings, 1 reply; 20+ messages in thread
From: Daniel Lezcano @ 2010-03-22 14:45 UTC (permalink / raw)
  To: Sukadev Bhattiprolu; +Cc: Containers, clg-NmTC/0ZBporQT0dZR+AlfA

Sukadev Bhattiprolu wrote:
> Link lxc_checkpoint, lxc_restart with USERCR[2]
> 

> 3. Checkpoint/restart a simple LXC container
> 
> 	$ lxc-execute --name foo --rcfile lxc-no-netns.conf -- /bin/sleep 1000
> 
> 	$ lxc-freeze --name foo
> 
> 	$ lxc-checkpoint --name foo --image /root/lxc-foo.ckpt
> 
> 	$ lxc-unfreeze --name foo

IMO, the freeze / thaw should be done in the lxc_checkpoint function code.

> 	$ lxc-stop --name foo
> 
> 	$ lxc-restart --name foo --image /root/lxc-foo.ckpt

Is the container restarted in a frozen state ?

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 2/5][lxc] lxc_restart: Add --image option
       [not found]     ` <20100319064046.GC25732-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
@ 2010-03-22 14:45       ` Daniel Lezcano
       [not found]         ` <4BA78276.2040308-NmTC/0ZBporQT0dZR+AlfA@public.gmane.org>
  0 siblings, 1 reply; 20+ messages in thread
From: Daniel Lezcano @ 2010-03-22 14:45 UTC (permalink / raw)
  To: Sukadev Bhattiprolu; +Cc: Containers, clg-NmTC/0ZBporQT0dZR+AlfA

Sukadev Bhattiprolu wrote:
> From: Sukadev Bhattiprolu <sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
> Date: Wed, 10 Mar 2010 21:59:39 -0800
> Subject: [PATCH 2/5][lxc] lxc_restart: Add --image option
> 
> The existing --directory option to lxc_restart expects the checkpoint state
> to be a directory. USERCR however uses a single regular file to store the
> checkpoint image. So add a --image option to enable checkpointing and
> restarting applications using USERCR.
> 
> Depending on how the application was checkpointed, users should specify
> either --image=CHECKPOINT-IMAGE or the --directory=STATEFILE option (but not
> both).

It's a detail but I would prefer to replace --image by --statefile. So 
we can put --directory deprecated and use --statefile as a more generic 
name.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 4/5][lxc] Hook up lxc_restart() with app_restart()
       [not found]     ` <20100319064121.GE25732-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
@ 2010-03-22 14:48       ` Daniel Lezcano
  0 siblings, 0 replies; 20+ messages in thread
From: Daniel Lezcano @ 2010-03-22 14:48 UTC (permalink / raw)
  To: Sukadev Bhattiprolu; +Cc: Containers, clg-NmTC/0ZBporQT0dZR+AlfA

Sukadev Bhattiprolu wrote:
> From: Sukadev Bhattiprolu <sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
> Date: Thu, 11 Mar 2010 20:47:56 -0800
> Subject: [PATCH 4/5][lxc] Hook up lxc_restart() with app_restart()
> 
> Have lxc_restart() call app_restart() implemented in the 'restart.o' from
> USER-CR git tree.
> 
> Changelog[v2]:
> 	- Link with restart.o from usercr rather than libcheckpoint.a
> 	- rename 'struct restart_args' to 'struct app_restart_args'
> 	- Initialize the new field app_restart_args->uerrfd
> 	- (Oren Laadan)Remove ->send_sigint field from 'struct app_restart_args'
> ---
>  src/lxc/restart.c |  104 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 104 insertions(+), 0 deletions(-)
> 
> diff --git a/src/lxc/restart.c b/src/lxc/restart.c
> index 467489e..945435c 100644
> --- a/src/lxc/restart.c
> +++ b/src/lxc/restart.c
> @@ -22,11 +22,115 @@
>   */
>  #include <lxc/lxc.h>
>  #include <lxc/log.h>
> +#include <lxc/start.h>
> +#include <lxc/namespace.h>
> +#include <errno.h>
> +#include <fcntl.h>
> +#include <signal.h>
> +#include <sys/prctl.h>
> +#include <app-checkpoint.h>
> +
> +struct lxc_restart_arg {
> +	const char *name;
> +	const char *statefile;
> +	char *const argv;
> +	struct lxc_handler *handler;
> +};
> 
>  lxc_log_define(lxc_restart, lxc);
> 
> +static int do_restart(struct lxc_restart_arg *lxcarg)
> +{
> +	int pid;
> +	struct lxc_handler *handler = lxcarg->handler;
> +	const char *name = lxcarg->name;
> +	char *const argv = lxcarg->argv;
> +	const char *statefile = lxcarg->statefile;
> +	struct app_restart_args restart_args;
> +
> +        if (sigprocmask(SIG_SETMASK, &handler->oldmask, NULL)) {
> +                SYSERROR("failed to set sigprocmask");
> +                return -1;
> +        }
> +
> +        if (prctl(PR_SET_PDEATHSIG, SIGKILL, 0, 0, 0)) {
> +                SYSERROR("failed to set pdeath signal");
> +                return -1;
> +        }
> +
> +	memset(&restart_args, 0, sizeof(restart_args));
> +
> +	if (statefile) {

Why do you need to check if statefile is valid ? It's a mandatory 
option, no ? if it is not specified, we should not reach this point.

> +		restart_args.infd = open(statefile, O_RDONLY, 0);
> +		if (restart_args.infd < 0) {
> +			SYSERROR("Failed to open statefile %s\n", statefile);
> +			return -1;
> +		}
> +	}
> +
> +	restart_args.pids = 1;
> +	restart_args.pidns = 1;
> +	restart_args.mnt_pty = 1;
> +	restart_args.mntns = 1;
> +	restart_args.klogfd = -1;
> +	restart_args.ulogfd = lxc_log_fd;
> +	restart_args.uerrfd = fileno(stderr);
> +	restart_args.debug = 1;
> +	restart_args.wait = 0;
> +
> +        pid = app_restart(&restart_args);
> +
> +        return pid;
> +}
> +
>  int lxc_restart(const char *name, const char *statefile, struct lxc_conf *conf,
>  		int flags)
>  {
> +	int err;
> +	int status;
> +	struct lxc_handler *handler;
> +	struct lxc_restart_arg lxcarg = {
> +		.name = name,
> +		.statefile = statefile,
> +		.handler = NULL,
> +	};
> +
> +	handler = lxc_init(name, conf);
> +	if (!handler) {
> +		ERROR("failed to initialize the container");
> +		return -1;
> +	}
> +
> +	lxcarg.handler = handler;
> +	handler->pid = do_restart(&lxcarg);
> +
> +	INFO("do_restart(): returns pid %d\n", handler->pid);
> +	lxc_rename_nsgroup(name, handler);
> +
> +	err = lxc_close_all_inherited_fd();
> +	if (err) {
> +		ERROR("unable to close inherited fds");
> +		goto out_abort;
> +	}

A small change here, recently committed. Now we check there is *no* 
inherited fd at this point instead of trying to detect them.

> +	err = lxc_poll(name, handler);
> +	if (err) {
> +		ERROR("mainloop exited with an error");
> +		goto out_abort;
> +	}
> +
> +	while (waitpid(handler->pid, &status, 0) < 0 && errno == EINTR)
> +		continue;
> +
> +	err =  lxc_error_set_and_log(handler->pid, status);
> +
> +out_fini:
> +	lxc_fini(name, handler);
> +	return err;
> +
> +out_abort:
> +	lxc_abort(name, handler);
> +	goto out_fini;
> +
>  	return 0;
>  }

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC][PATCH 0/5][lxc]: Link with USERCR
  2010-03-19 10:44   ` [RFC][PATCH 0/5][lxc]: Link with USERCR Michel Normand
@ 2010-03-24 19:22     ` Sukadev Bhattiprolu
  0 siblings, 0 replies; 20+ messages in thread
From: Sukadev Bhattiprolu @ 2010-03-24 19:22 UTC (permalink / raw)
  To: Michel Normand
  Cc: Containers, clg-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8,
	dlezcano-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8

Michel Normand [normand-NmTC/0ZBporQT0dZR+AlfA@public.gmane.org] wrote:
| Le jeudi 18 mars 2010 à 23:39 -0700, Sukadev Bhattiprolu a écrit :
| > 2. Build/install lxc_checkpoint and lxc_restart
| > 
| > 	# Do normal LXC build/install of 0.6.5.
| > 
| > 	# Then replace 'lxc-execute', 'lxc-checkpoint', 'lxc-restart' with
| > 	# new version. i.e Apply attached patches and:
| > 
| > 	$ cd src/lxc
| 
| Your patch set is not usable as is, with requirement to apply the patch
| between two sequences of build, and lxc unable to be built with it.
| 
| Please do a patch of automake files and related configure.ac
| rather than to create a Makefile2 file.

Sure, I am working on it and will resend in a couple of days after
addressing Daniel's comments also. If you have other comments on the
code, please let me know.

Sukadev.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC][PATCH 0/5][lxc]: Link with USERCR
       [not found]     ` <4BA7826D.10706-NmTC/0ZBporQT0dZR+AlfA@public.gmane.org>
@ 2010-03-24 19:27       ` Oren Laadan
  2010-03-24 19:47       ` Sukadev Bhattiprolu
  1 sibling, 0 replies; 20+ messages in thread
From: Oren Laadan @ 2010-03-24 19:27 UTC (permalink / raw)
  To: Daniel Lezcano
  Cc: Containers, Sukadev Bhattiprolu, clg-NmTC/0ZBporQT0dZR+AlfA



Daniel Lezcano wrote:
> Sukadev Bhattiprolu wrote:
>> Link lxc_checkpoint, lxc_restart with USERCR[2]
>>
> 
>> 3. Checkpoint/restart a simple LXC container
>>
>>     $ lxc-execute --name foo --rcfile lxc-no-netns.conf -- /bin/sleep 
>> 1000
>>
>>     $ lxc-freeze --name foo
>>
>>     $ lxc-checkpoint --name foo --image /root/lxc-foo.ckpt
>>
>>     $ lxc-unfreeze --name foo
> 
> IMO, the freeze / thaw should be done in the lxc_checkpoint function code.
> 
>>     $ lxc-stop --name foo
>>
>>     $ lxc-restart --name foo --image /root/lxc-foo.ckpt
> 
> Is the container restarted in a frozen state ?
> 
> 

It could if given the proper flag to sys_restart().

Oren.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 5/5][lxc] Hook up lxc_checkpoint() with app_checkpoint()
       [not found]         ` <4BA78262.6050109-NmTC/0ZBporQT0dZR+AlfA@public.gmane.org>
@ 2010-03-24 19:35           ` Sukadev Bhattiprolu
       [not found]             ` <20100324193537.GB20031-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
  0 siblings, 1 reply; 20+ messages in thread
From: Sukadev Bhattiprolu @ 2010-03-24 19:35 UTC (permalink / raw)
  To: Daniel Lezcano; +Cc: Containers, clg-NmTC/0ZBporQT0dZR+AlfA

Daniel Lezcano [dlezcano-NmTC/0ZBporQT0dZR+AlfA@public.gmane.org] wrote:
>> +find_cinit_pid(const char *name)
>>  {
>> +	struct lxc_command command = {
>> +		.request = { .type = LXC_COMMAND_CINIT_PID },
>> +	};
>> +
>> +	int ret, stopped;
>> +
>> +	ret = lxc_command(name, &command, &stopped);
>> +	if (ret < 0) {
>> +		ERROR("failed to send command");
>> +		return -1;
>> +	}
>> +
>> +	ERROR("find_cinit_pid %d\n", command.answer.ret);
>> +
>> +	return command.answer.ret;
>> +}
>
> I just committed the same function for the lxc_attach command. I think  
> you can reuse it.

Ok, will try to reuse it.

>
>> +int lxc_checkpoint(const char *name, const char *statefile, int lxc_flags)
>> +{
>> +	int ret;
>> +	int pid;
>> +	int flags;
>> +	struct stat statbuf;
>> +	struct app_checkpoint_args crargs;
>> +
>> +	if (access(statefile, F_OK) == 0) {
>> +		ret = stat(statefile, &statbuf);
>> +		if (ret < 0) {
>> +			ERROR("stat(%s): %s\n", statefile, strerror(errno));
>> +			return -1;
>> +		}
>> +
>> +		if (S_ISDIR(statbuf.st_mode)) {
>> +			ERROR("--directory option not implemented");
>> +			return -1;
>> +		} else {
>> +			ERROR("Checkpoint image file %s exists\n", statefile);
>> +			return -1;
>> +		}
>> +	}
>
> For the checkpoint, you don't need to check if it's a directory or a  
> file (but it should be done at restart time).

I need to open() the statefile and pass its fd to app_checkpoint().
If I don't check for directory, the open() below would fail, only
because of the O_RDWR flag. By checking, we could give a more useful
error message ?

> I am not sure 'access' is  
> really necessary because the O_EXCL is set in the open below.

Agree. How about just the stat() and the error message ?

Maybe later we could bury this code under say #ifdef USERCR so
if LXC is configured without USERCR, the current behavior is preserved ?

>
>> +
>> +	pid = find_cinit_pid(name);
>> +	if (pid < 0) {
>> +		ERROR("Unable to find cinit pid");
>> +		return -1;
>> +	}
>> +
>> +	memset(&crargs, 0, sizeof(crargs));
>> +
>> +	ret = open(statefile, O_CREAT|O_RDWR|O_EXCL, 0644);
>> +	if (ret < 0) {
>> +		ERROR("open(%s) failed\n", statefile);
>> +		return -1;
>> +	}
>
> As the statefile may contain sensible data, it would be preferable to  
> set it 0600, no ?

Agree.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC][PATCH 0/5][lxc]: Link with USERCR
       [not found]     ` <4BA7826D.10706-NmTC/0ZBporQT0dZR+AlfA@public.gmane.org>
  2010-03-24 19:27       ` Oren Laadan
@ 2010-03-24 19:47       ` Sukadev Bhattiprolu
       [not found]         ` <20100324194744.GC20031-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
  1 sibling, 1 reply; 20+ messages in thread
From: Sukadev Bhattiprolu @ 2010-03-24 19:47 UTC (permalink / raw)
  To: Daniel Lezcano; +Cc: Containers, clg-NmTC/0ZBporQT0dZR+AlfA

Daniel Lezcano [dlezcano-NmTC/0ZBporQT0dZR+AlfA@public.gmane.org] wrote:
> Sukadev Bhattiprolu wrote:
>> Link lxc_checkpoint, lxc_restart with USERCR[2]
>>
>
>> 3. Checkpoint/restart a simple LXC container
>>
>> 	$ lxc-execute --name foo --rcfile lxc-no-netns.conf -- /bin/sleep 1000
>>
>> 	$ lxc-freeze --name foo
>>
>> 	$ lxc-checkpoint --name foo --image /root/lxc-foo.ckpt
>>
>> 	$ lxc-unfreeze --name foo
>
> IMO, the freeze / thaw should be done in the lxc_checkpoint function code.

Well, by separating the freeze and checkpoint, we could do things like
snapshot the filesystem or would lxc_checkpoint make an external call
to do that ?

I will leave it as is for my next version and I am guessing it can be done
easily later ?
>
>> 	$ lxc-stop --name foo
>>
>> 	$ lxc-restart --name foo --image /root/lxc-foo.ckpt
>
> Is the container restarted in a frozen state ?

It can be (by setting the restart_args->freezer). I will leave it in
frozen for now. Maybe later we can add a command line option to let
user choose whether or not to leave it frozen

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 2/5][lxc] lxc_restart: Add --image option
       [not found]         ` <4BA78276.2040308-NmTC/0ZBporQT0dZR+AlfA@public.gmane.org>
@ 2010-03-24 19:48           ` Sukadev Bhattiprolu
       [not found]             ` <20100324194851.GD20031-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
  0 siblings, 1 reply; 20+ messages in thread
From: Sukadev Bhattiprolu @ 2010-03-24 19:48 UTC (permalink / raw)
  To: Daniel Lezcano; +Cc: Containers, clg-NmTC/0ZBporQT0dZR+AlfA

Daniel Lezcano [dlezcano-NmTC/0ZBporQT0dZR+AlfA@public.gmane.org] wrote:
> Sukadev Bhattiprolu wrote:
>> From: Sukadev Bhattiprolu <sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
>> Date: Wed, 10 Mar 2010 21:59:39 -0800
>> Subject: [PATCH 2/5][lxc] lxc_restart: Add --image option
>>
>> The existing --directory option to lxc_restart expects the checkpoint state
>> to be a directory. USERCR however uses a single regular file to store the
>> checkpoint image. So add a --image option to enable checkpointing and
>> restarting applications using USERCR.
>>
>> Depending on how the application was checkpointed, users should specify
>> either --image=CHECKPOINT-IMAGE or the --directory=STATEFILE option (but not
>> both).
>
> It's a detail but I would prefer to replace --image by --statefile. So  
> we can put --directory deprecated and use --statefile as a more generic  
> name.

Ok will fix.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 5/5][lxc] Hook up lxc_checkpoint() with app_checkpoint()
       [not found]             ` <20100324193537.GB20031-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
@ 2010-03-24 20:51               ` Daniel Lezcano
  0 siblings, 0 replies; 20+ messages in thread
From: Daniel Lezcano @ 2010-03-24 20:51 UTC (permalink / raw)
  To: Sukadev Bhattiprolu; +Cc: Containers, clg-NmTC/0ZBporQT0dZR+AlfA

Sukadev Bhattiprolu wrote:
> Daniel Lezcano [dlezcano-NmTC/0ZBporQT0dZR+AlfA@public.gmane.org] wrote:
>>> +find_cinit_pid(const char *name)
>>>  {
>>> +	struct lxc_command command = {
>>> +		.request = { .type = LXC_COMMAND_CINIT_PID },
>>> +	};
>>> +
>>> +	int ret, stopped;
>>> +
>>> +	ret = lxc_command(name, &command, &stopped);
>>> +	if (ret < 0) {
>>> +		ERROR("failed to send command");
>>> +		return -1;
>>> +	}
>>> +
>>> +	ERROR("find_cinit_pid %d\n", command.answer.ret);
>>> +
>>> +	return command.answer.ret;
>>> +}
>> I just committed the same function for the lxc_attach command. I think  
>> you can reuse it.
> 
> Ok, will try to reuse it.
> 
>>> +int lxc_checkpoint(const char *name, const char *statefile, int lxc_flags)
>>> +{
>>> +	int ret;
>>> +	int pid;
>>> +	int flags;
>>> +	struct stat statbuf;
>>> +	struct app_checkpoint_args crargs;
>>> +
>>> +	if (access(statefile, F_OK) == 0) {
>>> +		ret = stat(statefile, &statbuf);
>>> +		if (ret < 0) {
>>> +			ERROR("stat(%s): %s\n", statefile, strerror(errno));
>>> +			return -1;
>>> +		}
>>> +
>>> +		if (S_ISDIR(statbuf.st_mode)) {
>>> +			ERROR("--directory option not implemented");
>>> +			return -1;
>>> +		} else {
>>> +			ERROR("Checkpoint image file %s exists\n", statefile);
>>> +			return -1;
>>> +		}
>>> +	}
>> For the checkpoint, you don't need to check if it's a directory or a  
>> file (but it should be done at restart time).
> 
> I need to open() the statefile and pass its fd to app_checkpoint().
> If I don't check for directory, the open() below would fail, only
> because of the O_RDWR flag. By checking, we could give a more useful
> error message ?

What I meant is the directory shall not exists when checkpointing, if 
the directory or the file exists, the checkpoint should fail.

>> I am not sure 'access' is  
>> really necessary because the O_EXCL is set in the open below.
> 
> Agree. How about just the stat() and the error message ?

IMO, just fail when trying to open the file, the O_EXCL flag will do the 
job for us.

> Maybe later we could bury this code under say #ifdef USERCR so
> if LXC is configured without USERCR, the current behavior is preserved ?

Right, it's an aspect we have to address. But we can do that later, IMHO 
the main objective would be to correctly integrate lxc and the CR with 
the 'configure' script. eg configure --with-linux=<path> .... and the 
makefiles.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC][PATCH 0/5][lxc]: Link with USERCR
       [not found]         ` <20100324194744.GC20031-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
@ 2010-03-24 20:52           ` Daniel Lezcano
  0 siblings, 0 replies; 20+ messages in thread
From: Daniel Lezcano @ 2010-03-24 20:52 UTC (permalink / raw)
  To: Sukadev Bhattiprolu; +Cc: Containers, clg-NmTC/0ZBporQT0dZR+AlfA

Sukadev Bhattiprolu wrote:
> Daniel Lezcano [dlezcano-NmTC/0ZBporQT0dZR+AlfA@public.gmane.org] wrote:
>> Sukadev Bhattiprolu wrote:
>>> Link lxc_checkpoint, lxc_restart with USERCR[2]
>>>
>>> 3. Checkpoint/restart a simple LXC container
>>>
>>> 	$ lxc-execute --name foo --rcfile lxc-no-netns.conf -- /bin/sleep 1000
>>>
>>> 	$ lxc-freeze --name foo
>>>
>>> 	$ lxc-checkpoint --name foo --image /root/lxc-foo.ckpt
>>>
>>> 	$ lxc-unfreeze --name foo
>> IMO, the freeze / thaw should be done in the lxc_checkpoint function code.
> 
> Well, by separating the freeze and checkpoint, we could do things like
> snapshot the filesystem or would lxc_checkpoint make an external call
> to do that ?
> 
> I will leave it as is for my next version and I am guessing it can be done
> easily later ?
>>> 	$ lxc-stop --name foo
>>>
>>> 	$ lxc-restart --name foo --image /root/lxc-foo.ckpt
>> Is the container restarted in a frozen state ?
> 
> It can be (by setting the restart_args->freezer). I will leave it in
> frozen for now. Maybe later we can add a command line option to let
> user choose whether or not to leave it frozen

The lxc_checkpoint / lxc_restart API have already the --pause option 
defined.

If you don't specify the --pause option, the checkpoint and the restart 
release the application right after finishing their job.

There is also the --kill option for the checkpoint, to kill the 
container after the checkpoint.

The lxc_checkpoint function should do:

    freeze();

    checkpoint();

    if (kill) {
        stop();
        unfreeze();
        return;
    }

    if (!pause)
        unfreeze();

    return;

The same for the restart except for the 'kill'.

The functions are already defined in lxc, it takes 5 mins to write this 
code.

Defined in lxc.h :
extern int lxc_stop(const char *name);
extern int lxc_freeze(const char *name);
extern int lxc_unfreeze(const char *name);

The lxc_checkpoint / lxc_restart functions have a 'flags' parameter with 
LXC_FLAG_PAUSE or LXC_FLAG_HALT (if set in the command line).

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 2/5][lxc] lxc_restart: Add --image option
       [not found]             ` <20100324194851.GD20031-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
@ 2010-03-24 20:53               ` Daniel Lezcano
  0 siblings, 0 replies; 20+ messages in thread
From: Daniel Lezcano @ 2010-03-24 20:53 UTC (permalink / raw)
  To: Sukadev Bhattiprolu; +Cc: Containers, clg-NmTC/0ZBporQT0dZR+AlfA

Sukadev Bhattiprolu wrote:
> Daniel Lezcano [dlezcano-NmTC/0ZBporQT0dZR+AlfA@public.gmane.org] wrote:
>> Sukadev Bhattiprolu wrote:
>>> From: Sukadev Bhattiprolu <sukadev-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
>>> Date: Wed, 10 Mar 2010 21:59:39 -0800
>>> Subject: [PATCH 2/5][lxc] lxc_restart: Add --image option
>>>
>>> The existing --directory option to lxc_restart expects the checkpoint state
>>> to be a directory. USERCR however uses a single regular file to store the
>>> checkpoint image. So add a --image option to enable checkpointing and
>>> restarting applications using USERCR.
>>>
>>> Depending on how the application was checkpointed, users should specify
>>> either --image=CHECKPOINT-IMAGE or the --directory=STATEFILE option (but not
>>> both).
>> It's a detail but I would prefer to replace --image by --statefile. So  
>> we can put --directory deprecated and use --statefile as a more generic  
>> name.
> 
> Ok will fix.

Thanks.

^ permalink raw reply	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2010-03-24 20:53 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-03-19  6:39 [RFC][PATCH 0/5][lxc]: Link with USERCR Sukadev Bhattiprolu
     [not found] ` <20100319063912.GA25732-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2010-03-19  6:40   ` [PATCH 1/5][lxc] Enable static linking of some lxc binaries Sukadev Bhattiprolu
     [not found]     ` <20100319064024.GB25732-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2010-03-22 14:44       ` Daniel Lezcano
2010-03-19  6:40   ` [PATCH 2/5][lxc] lxc_restart: Add --image option Sukadev Bhattiprolu
     [not found]     ` <20100319064046.GC25732-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2010-03-22 14:45       ` Daniel Lezcano
     [not found]         ` <4BA78276.2040308-NmTC/0ZBporQT0dZR+AlfA@public.gmane.org>
2010-03-24 19:48           ` Sukadev Bhattiprolu
     [not found]             ` <20100324194851.GD20031-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2010-03-24 20:53               ` Daniel Lezcano
2010-03-19  6:41   ` [PATCH 3/5][lxc] lxc_checkpoint: " Sukadev Bhattiprolu
2010-03-19  6:41   ` [PATCH 4/5][lxc] Hook up lxc_restart() with app_restart() Sukadev Bhattiprolu
     [not found]     ` <20100319064121.GE25732-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2010-03-22 14:48       ` Daniel Lezcano
2010-03-19  6:41   ` [PATCH 5/5][lxc] Hook up lxc_checkpoint() with app_checkpoint() Sukadev Bhattiprolu
     [not found]     ` <20100319064141.GF25732-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2010-03-22 14:44       ` Daniel Lezcano
     [not found]         ` <4BA78262.6050109-NmTC/0ZBporQT0dZR+AlfA@public.gmane.org>
2010-03-24 19:35           ` Sukadev Bhattiprolu
     [not found]             ` <20100324193537.GB20031-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2010-03-24 20:51               ` Daniel Lezcano
2010-03-19 10:44   ` [RFC][PATCH 0/5][lxc]: Link with USERCR Michel Normand
2010-03-24 19:22     ` Sukadev Bhattiprolu
2010-03-22 14:45   ` Daniel Lezcano
     [not found]     ` <4BA7826D.10706-NmTC/0ZBporQT0dZR+AlfA@public.gmane.org>
2010-03-24 19:27       ` Oren Laadan
2010-03-24 19:47       ` Sukadev Bhattiprolu
     [not found]         ` <20100324194744.GC20031-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2010-03-24 20:52           ` Daniel Lezcano

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.