diff mbox

[v13.1,26/26] cmdline switches and config vars to control colo-proxy

Message ID 56F8A965.6080905@cn.fujitsu.com (mailing list archive)
State New, archived
Headers show

Commit Message

Changlong Xie March 28, 2016, 3:47 a.m. UTC
From 1bfd14622455635c6cae6130396250996e49facc Mon Sep 17 00:00:00 2001
From: Wen Congyang <wency@cn.fujitsu.com>
Date: Wed, 15 Jul 2015 17:18:56 +0800
Subject: [PATCH v13.1 26/26] cmdline switches and config vars to control 
colo-proxy

Add cmdline switches to 'xl migrate-receive' command to specify
a domain-specific hotplug script to setup COLO proxy.

Add a new config var 'colo.default.agentscript' to xl.conf, that
allows the user to override the default global script used to
setup COLO proxy.

Signed-off-by: Yang Hongyang <hongyang.yang@easystack.cn>
Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>
Signed-off-by: Changlong Xie <xiecl.fnst@cn.fujitsu.com>
---
  docs/man/xl.conf.pod.5           |  6 +++++
  docs/man/xl.pod.1                |  7 ++++--
  tools/libxl/libxl.c              |  6 +++++
  tools/libxl/libxl_colo_restore.c |  5 +++++
  tools/libxl/libxl_create.c       |  9 ++++++--
  tools/libxl/libxl_types.idl      |  1 +
  tools/libxl/xl.c                 |  3 +++
  tools/libxl/xl.h                 |  1 +
  tools/libxl/xl_cmdimpl.c         | 47 
+++++++++++++++++++++++++++++++---------
  9 files changed, 71 insertions(+), 14 deletions(-)

supported\n");
      } else {
@@ -3001,6 +3004,7 @@ start:
          params.checkpointed_stream = dom_info->checkpointed_stream;
          params.stream_version =
              (hdr.mandatory_flags & XL_MANDATORY_FLAG_STREAMv2) ? 2 : 1;
+        params.colo_proxy_script = dom_info->colo_proxy_script;

          ret = libxl_domain_create_restore(ctx, &d_config,
                                            &domid, restore_fd,
@@ -4733,7 +4737,8 @@ static void migrate_domain(uint32_t domid, const 
char *rune, int debug,

  static void migrate_receive(int debug, int daemonize, int monitor,
                              int send_fd, int recv_fd,
-                            libxl_checkpointed_stream checkpointed)
+                            libxl_checkpointed_stream checkpointed,
+                            char *colo_proxy_script)
  {
      uint32_t domid;
      int rc, rc2;
@@ -4762,6 +4767,7 @@ static void migrate_receive(int debug, int 
daemonize, int monitor,
      dom_info.send_back_fd = send_fd;
      dom_info.migration_domname_r = &migration_domname;
      dom_info.checkpointed_stream = checkpointed;
+    dom_info.colo_proxy_script = colo_proxy_script;

      rc = create_domain(&dom_info);
      if (rc < 0) {
@@ -4955,8 +4961,11 @@ int main_migrate_receive(int argc, char **argv)
      int debug = 0, daemonize = 1, monitor = 1;
      libxl_checkpointed_stream checkpointed = 
LIBXL_CHECKPOINTED_STREAM_NONE;
      int opt;
+    char *script = NULL;
      static struct option opts[] = {
          {"colo", 0, 0, 0x100},
+        /* It is a shame that the management code for disk is not here. */
+        {"coloft-script", 1, 0, 0x200},
          COMMON_LONG_OPTS
      };

@@ -4977,6 +4986,9 @@ int main_migrate_receive(int argc, char **argv)
      case 0x100:
          checkpointed = LIBXL_CHECKPOINTED_STREAM_COLO;
          break;
+    case 0x200:
+        script = optarg;
+        break;
      }

      if (argc-optind != 0) {
@@ -4985,7 +4997,7 @@ int main_migrate_receive(int argc, char **argv)
      }
      migrate_receive(debug, daemonize, monitor,
                      STDOUT_FILENO, STDIN_FILENO,
-                    checkpointed);
+                    checkpointed, script);

      return 0;
  }
@@ -8395,8 +8407,10 @@ int main_remus(int argc, char **argv)
          r_info.interval = 200;

      if (libxl_defbool_val(r_info.colo)) {
-        if (r_info.interval || libxl_defbool_val(r_info.blackhole)) {
-            perror("Option -c conflicts with -i or -b");
+        if (r_info.interval || libxl_defbool_val(r_info.blackhole) ||
+            !libxl_defbool_is_default(r_info.netbuf) ||
+            !libxl_defbool_is_default(r_info.diskbuf)) {
+            perror("option -c is conflict with -i, -d, -n or -b");
              exit(-1);
          }

@@ -8407,8 +8421,12 @@ int main_remus(int argc, char **argv)
          }
      }

-    if (!r_info.netbufscript)
-        r_info.netbufscript = default_remus_netbufscript;
+    if (!r_info.netbufscript) {
+        if (libxl_defbool_val(r_info.colo))
+            r_info.netbufscript = default_colo_proxy_script;
+        else
+            r_info.netbufscript = default_remus_netbufscript;
+    }

      if (libxl_defbool_val(r_info.blackhole)) {
          send_fd = open("/dev/null", O_RDWR, 0644);
@@ -8421,10 +8439,19 @@ int main_remus(int argc, char **argv)
          if (!ssh_command[0]) {
              rune = host;
          } else {
-            xasprintf(&rune, "exec %s %s xl migrate-receive %s %s",
-                      ssh_command, host,
-                      libxl_defbool_val(r_info.colo) ? "-c" : "-r",
-                      daemonize ? "" : " -e");
+            if (!libxl_defbool_val(r_info.colo)) {
+                xasprintf(&rune, "exec %s %s xl migrate-receive %s %s",
+                          ssh_command, host,
+                          "-r",
+                          daemonize ? "" : " -e");
+            } else {
+                xasprintf(&rune, "exec %s %s xl migrate-receive %s %s 
%s %s",
+                          ssh_command, host,
+                          "--colo",
+                          r_info.netbufscript ? "--coloft-script" : "",
+                          r_info.netbufscript ? r_info.netbufscript : "",
+                          daemonize ? "" : " -e");
+            }
          }

          save_domain_core_begin(domid, NULL, &config_data, &config_len);

Comments

Ian Jackson March 30, 2016, 2:28 p.m. UTC | #1
Changlong Xie writes ("[PATCH v13.1 26/26] cmdline switches and config vars to control colo-proxy"):
>  From 1bfd14622455635c6cae6130396250996e49facc Mon Sep 17 00:00:00 2001
> From: Wen Congyang <wency@cn.fujitsu.com>
> Date: Wed, 15 Jul 2015 17:18:56 +0800
> Subject: [PATCH v13.1 26/26] cmdline switches and config vars to control 
> colo-proxy
> 
> Add cmdline switches to 'xl migrate-receive' command to specify
> a domain-specific hotplug script to setup COLO proxy.
> 
> Add a new config var 'colo.default.agentscript' to xl.conf, that
> allows the user to override the default global script used to
> setup COLO proxy.

Thanks.

Again, this v13.1 has been mangled somehow.  I think this is probably
fine, but it's hard to tell.

In general, it would have been helpful to know what intentional
changes there were between each v13 and the corresponding v13.1.

Thanks,
Ian.
diff mbox

Patch

diff --git a/docs/man/xl.conf.pod.5 b/docs/man/xl.conf.pod.5
index 8ae19bb..8f7fd28 100644
--- a/docs/man/xl.conf.pod.5
+++ b/docs/man/xl.conf.pod.5
@@ -111,6 +111,12 @@  Configures the default script used by Remus to 
setup network buffering.

  Default: C</etc/xen/scripts/remus-netbuf-setup>

+=item B<colo.default.proxyscript="PATH">
+
+Configures the default script used by COLO to setup colo-proxy.
+
+Default: C</etc/xen/scripts/colo-proxy-setup>
+
  =item B<output_format="json|sxp">

  Configures the default output format used by xl when printing "machine
diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1
index 2664402..9df3302 100644
--- a/docs/man/xl.pod.1
+++ b/docs/man/xl.pod.1
@@ -458,8 +458,6 @@  Remus support in xl is still in experimental 
(proof-of-concept) phase.
  Disk replication support is limited to DRBD disks.

  COLO support in xl is still in experimental (proof-of-concept) phase.
-There is no support for network, so the guest will confuse its network
-peers at the moment.

  =back

@@ -483,6 +481,11 @@  and it's used by secondary.
  =item B<hidden-disk>    :Primary's modified contents will be buffered 
in this
  disk, and it's used by secondary.

+(b) An example for COLO network configuration: vif =[ 
'...,forwarddev=xxx,...']
+
+=item B<forwarddev>     :Forward devices for primary and secondary, 
there are
+directly connected.
+
  Note that the COLO configuration settings should be considered 
unstable. They
  may change incompatibly in future versions of Xen.

diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index 63fbe16..aabf3a7 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -3378,6 +3378,11 @@  void libxl__device_nic_add(libxl__egc *egc, 
uint32_t domid,
          flexarray_append(back, nic->ifname);
      }

+    if (nic->coloft_forwarddev) {
+        flexarray_append(back, "forwarddev");
+        flexarray_append(back, nic->coloft_forwarddev);
+    }
+
      flexarray_append(back, "mac");
      flexarray_append(back,GCSPRINTF(LIBXL_MAC_FMT, 
LIBXL_MAC_BYTES(nic->mac)));
      if (nic->ip) {
@@ -3500,6 +3505,7 @@  static int libxl__device_nic_from_xs_be(libxl__gc *gc,
      nic->ip = READ_BACKEND(NOGC, "ip");
      nic->bridge = READ_BACKEND(NOGC, "bridge");
      nic->script = READ_BACKEND(NOGC, "script");
+    nic->coloft_forwarddev = READ_BACKEND(NOGC, "forwarddev");

      /* vif_ioemu nics use the same xenstore entries as vif interfaces */
      tmp = READ_BACKEND(gc, "type");
diff --git a/tools/libxl/libxl_colo_restore.c 
b/tools/libxl/libxl_colo_restore.c
index c8ad796..3483f39 100644
--- a/tools/libxl/libxl_colo_restore.c
+++ b/tools/libxl/libxl_colo_restore.c
@@ -233,6 +233,11 @@  void libxl__colo_restore_setup(libxl__egc *egc,
      crcs->crs = crs;
      crs->qdisk_setuped = false;
      crs->qdisk_used = false;
+    if (dcs->colo_proxy_script)
+        crs->colo_proxy_script = libxl__strdup(gc, dcs->colo_proxy_script);
+    else
+        crs->colo_proxy_script = GCSPRINTF("%s/colo-proxy-setup",
+                                           libxl__xen_script_dir_path());

      /* setup dsps */
      crcs->dsps.ao = ao;
diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
index e2ec25c..d6028aa 100644
--- a/tools/libxl/libxl_create.c
+++ b/tools/libxl/libxl_create.c
@@ -1690,6 +1690,7 @@  static void domain_create_cb(libxl__egc *egc,
  static int do_domain_create(libxl_ctx *ctx, libxl_domain_config *d_config,
                              uint32_t *domid, int restore_fd, int 
send_back_fd,
                              const libxl_domain_restore_params *params,
+                            const char *colo_proxy_script,
                              const libxl_asyncop_how *ao_how,
                              const libxl_asyncprogress_how 
*aop_console_how)
  {
@@ -1713,6 +1714,7 @@  static int do_domain_create(libxl_ctx *ctx, 
libxl_domain_config *d_config,
      }
      cdcs->dcs.callback = domain_create_cb;
      cdcs->dcs.domid_soft_reset = INVALID_DOMID;
+    cdcs->dcs.colo_proxy_script = colo_proxy_script;
      libxl__ao_progress_gethow(&cdcs->dcs.aop_console_how, 
aop_console_how);
      cdcs->domid_out = domid;

@@ -1900,7 +1902,7 @@  int libxl_domain_create_new(libxl_ctx *ctx, 
libxl_domain_config *d_config,
                              const libxl_asyncprogress_how 
*aop_console_how)
  {
      unset_disk_colo_restore(d_config);
-    return do_domain_create(ctx, d_config, domid, -1, -1, NULL,
+    return do_domain_create(ctx, d_config, domid, -1, -1, NULL, NULL,
                              ao_how, aop_console_how);
  }

@@ -1911,14 +1913,17 @@  int libxl_domain_create_restore(libxl_ctx *ctx, 
libxl_domain_config *d_config,
                                  const libxl_asyncop_how *ao_how,
                                  const libxl_asyncprogress_how 
*aop_console_how)
  {
+    char *colo_proxy_script = NULL;
+
      if (params->checkpointed_stream == LIBXL_CHECKPOINTED_STREAM_COLO) {
+        colo_proxy_script = params->colo_proxy_script;
          set_disk_colo_restore(d_config);
      } else {
          unset_disk_colo_restore(d_config);
      }

      return do_domain_create(ctx, d_config, domid, restore_fd, 
send_back_fd,
-                            params, ao_how, aop_console_how);
+                            params, colo_proxy_script, ao_how, 
aop_console_how);
  }

  int libxl_domain_soft_reset(libxl_ctx *ctx,
diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
index f88fae0..165b788 100644
--- a/tools/libxl/libxl_types.idl
+++ b/tools/libxl/libxl_types.idl
@@ -386,6 +386,7 @@  libxl_domain_create_info = Struct("domain_create_info",[
  libxl_domain_restore_params = Struct("domain_restore_params", [
      ("checkpointed_stream", integer),
      ("stream_version", uint32, {'init_val': '1'}),
+    ("colo_proxy_script", string),
      ])

  libxl_domain_sched_params = Struct("domain_sched_params",[
diff --git a/tools/libxl/xl.c b/tools/libxl/xl.c
index dfae84a..a272258 100644
--- a/tools/libxl/xl.c
+++ b/tools/libxl/xl.c
@@ -45,6 +45,7 @@  char *default_bridge = NULL;
  char *default_gatewaydev = NULL;
  char *default_vifbackend = NULL;
  char *default_remus_netbufscript = NULL;
+char *default_colo_proxy_script = NULL;
  enum output_format default_output_format = OUTPUT_FORMAT_JSON;
  int claim_mode = 1;
  bool progress_use_cr = 0;
@@ -179,6 +180,8 @@  static void parse_global_config(const char *configfile,

      xlu_cfg_replace_string (config, "remus.default.netbufscript",
          &default_remus_netbufscript, 0);
+    xlu_cfg_replace_string (config, "colo.default.proxyscript",
+        &default_colo_proxy_script, 0);

      xlu_cfg_destroy(config);
  }
diff --git a/tools/libxl/xl.h b/tools/libxl/xl.h
index 309627a..e601ca1 100644
--- a/tools/libxl/xl.h
+++ b/tools/libxl/xl.h
@@ -194,6 +194,7 @@  extern char *default_bridge;
  extern char *default_gatewaydev;
  extern char *default_vifbackend;
  extern char *default_remus_netbufscript;
+extern char *default_colo_proxy_script;
  extern char *blkdev_start;

  enum output_format {
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
index 25bd81a..91dcb63 100644
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -158,6 +158,7 @@  struct domain_create {
      const char *config_file;
      char *extra_config; /* extra config string */
      const char *restore_file;
+    char *colo_proxy_script;
      int migrate_fd; /* -1 means none */
      int send_back_fd; /* -1 means none */
      char **migration_domname_r; /* from malloc */
@@ -1053,6 +1054,8 @@  static int parse_nic_config(libxl_device_nic *nic, 
XLU_Config **config, char *to
          replace_string(&nic->model, oparg);
      } else if (MATCH_OPTION("rate", token, oparg)) {
          parse_vif_rate(config, oparg, nic);
+    } else if (MATCH_OPTION("forwarddev", token, oparg)) {
+        replace_string(&nic->coloft_forwarddev, oparg);
      } else if (MATCH_OPTION("accel", token, oparg)) {
          fprintf(stderr, "the accel parameter for vifs is currently not