[Devel] [PATCH 3/6][lxc][v3] lxc_checkpoint: Add --statefile option
Sukadev Bhattiprolu
sukadev at linux.vnet.ibm.com
Wed Mar 31 00:07:52 PDT 2010
From: Sukadev Bhattiprolu <sukadev at linux.vnet.ibm.com>
Date: Wed, 10 Mar 2010 22:24:17 -0800
Subject: [PATCH 3/6][lxc][v3] lxc_checkpoint: Add --statefile 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 --statefile option to enable
checkpointing and restarting applications using USERCR.
Users should specify either --statefile or --directory option (but not both)
to select the file/directory where the application state will be stored.
Signed-off-by: Sukadev Bhattiprolu <sukadev at linux.vnet.ibm.com>
---
src/lxc/lxc_checkpoint.c | 40 +++++++++++++++++++++++++++++-----------
1 files changed, 29 insertions(+), 11 deletions(-)
diff --git a/src/lxc/lxc_checkpoint.c b/src/lxc/lxc_checkpoint.c
index a8c74a9..5e8506f 100644
--- a/src/lxc/lxc_checkpoint.c
+++ b/src/lxc/lxc_checkpoint.c
@@ -37,12 +37,21 @@
lxc_log_define(lxc_checkpoint_ui, lxc_checkpoint);
+static char *statedir;
+
static int my_checker(const struct lxc_arguments* args)
{
- if (!args->statefile) {
- lxc_error(args, "no statefile specified");
- return -1;
- }
+ int d, f;
+
+ /* make them boolean */
+ d = !!(statedir);
+ f = !!(args->statefile);
+
+ if (!(d ^ f)) {
+ lxc_error(args, "Must specify exactly one of --directory "
+ "and --statefile options");
+ return -1;
+ }
return 0;
}
@@ -52,7 +61,8 @@ static int my_parser(struct lxc_arguments* args, int c, char* arg)
switch (c) {
case 'k': args->flags = LXC_FLAG_HALT; break;
case 'p': args->flags = LXC_FLAG_PAUSE; break;
- case 'd': args->statefile = arg; break;
+ case 'd': statedir = arg; break;
+ case 'S': args->statefile = arg; break;
}
return 0;
}
@@ -61,13 +71,15 @@ static const struct option my_longopts[] = {
{"kill", no_argument, 0, 'k'},
{"pause", no_argument, 0, 'p'},
{"directory", required_argument, 0, 'd'},
+ {"statefile", required_argument, 0, 'S'},
LXC_COMMON_OPTIONS
};
static struct lxc_arguments my_args = {
.progname = "lxc-checkpoint",
.help = "\
---name=NAME --directory STATEFILE\n\
+--name=NAME --directory STATEFILE (deprecated)\n\
+\tlxc_checkpoint --name=NAME --statefile=STATEFILE\n\
\n\
lxc-checkpoint checkpoints in STATEFILE the NAME container\n\
\n\
@@ -75,7 +87,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 (deprecated)\n\
+ -i, --statefile=STATEFILE where to store the checkpoint-image (LIBCR mode)\n",
.options = my_longopts,
.parser = my_parser,
@@ -97,6 +110,7 @@ static int create_statefile(const char *dir)
int main(int argc, char *argv[])
{
int ret;
+ const char *statefile;
ret = lxc_arguments_parse(&my_args, argc, argv);
if (ret)
@@ -107,11 +121,15 @@ int main(int argc, char *argv[])
if (ret)
return ret;
- ret = create_statefile(my_args.statefile);
- if (ret)
- return ret;
+ statefile = my_args.statefile;
+ if (statedir) {
+ statefile = statedir;
+ ret = create_statefile(statefile);
+ if (ret)
+ return ret;
+ }
- ret = lxc_checkpoint(my_args.name, my_args.statefile, my_args.flags);
+ ret = lxc_checkpoint(my_args.name, statefile, my_args.flags);
if (ret)
ERROR("failed to checkpoint '%s'", my_args.name);
else
--
1.6.6.1
_______________________________________________
Containers mailing list
Containers at lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/containers
More information about the Devel
mailing list