* [PATCH] fix migration failure with xl migrate --debug
@ 2014-11-26 20:51 M A Young
2014-11-26 21:17 ` Andrew Cooper
0 siblings, 1 reply; 3+ messages in thread
From: M A Young @ 2014-11-26 20:51 UTC (permalink / raw)
To: xen-devel; +Cc: Wei Liu, Ian Jackson, Ian Campbell, Stefano Stabellini
[-- Attachment #1: Type: TEXT/PLAIN, Size: 388 bytes --]
Migrations with xl migrate --debug will fail because debugging information
from the receiving process is written to the stdout channel. This channel
is also used for status messages so the migration will fail as the sending
process receives an unexpected message. This patch moves the debugging
information to the stderr channel.
Signed-off-by: Michael Young <m.a.young@durham.ac.uk>
[-- Attachment #2: Type: TEXT/PLAIN, Size: 18630 bytes --]
Use stderr for debugging messages for xl migrate --debug as stdout is used
for status messages.
--- xen-4.5.0-rc1/tools/libxl/xl_cmdimpl.c.orig 2014-10-24 15:22:40.000000000 +0100
+++ xen-4.5.0-rc1/tools/libxl/xl_cmdimpl.c 2014-11-25 20:29:06.723856433 +0000
@@ -383,7 +383,7 @@
libxl_domain_config *d_config)
{
if (output_format == OUTPUT_FORMAT_SXP)
- return printf_info_sexp(domid, d_config);
+ return printf_info_sexp(domid, d_config, stderr);
const char *buf;
libxl_yajl_length len = 0;
@@ -404,7 +404,7 @@
if (s != yajl_gen_status_ok)
goto out;
- puts(buf);
+ fputs(buf,stderr);
out:
yajl_gen_free(hand);
@@ -413,7 +413,7 @@
fprintf(stderr,
"unable to format domain config as JSON (YAJL:%d)\n", s);
- if (ferror(stdout) || fflush(stdout)) { perror("stdout"); exit(-1); }
+ if (ferror(stderr) || fflush(stderr)) { perror("stderr"); exit(-1); }
}
static int do_daemonize(char *name)
@@ -2423,7 +2423,7 @@
}
if (!dom_info->quiet)
- printf("Parsing config from %s\n", config_source);
+ fprintf(stderr, "Parsing config from %s\n", config_source);
if (config_in_json) {
libxl_domain_config_from_json(ctx, &d_config,
@@ -3403,7 +3403,7 @@
if (default_output_format == OUTPUT_FORMAT_JSON)
s = printf_info_one_json(hand, info[i].domid, &d_config);
else
- printf_info_sexp(info[i].domid, &d_config);
+ printf_info_sexp(info[i].domid, &d_config, stdout);
libxl_domain_config_dispose(&d_config);
if (s != yajl_gen_status_ok)
goto out;
--- xen-4.5.0-rc1/tools/libxl/xl_sxp.c.orig 2014-10-24 15:22:40.000000000 +0100
+++ xen-4.5.0-rc1/tools/libxl/xl_sxp.c 2014-11-25 20:27:21.911036713 +0000
@@ -30,7 +30,7 @@
/* In general you should not add new output to this function since it
* is intended only for legacy use.
*/
-void printf_info_sexp(int domid, libxl_domain_config *d_config)
+void printf_info_sexp(int domid, libxl_domain_config *d_config, FILE *fh)
{
int i;
libxl_dominfo info;
@@ -38,195 +38,195 @@
libxl_domain_create_info *c_info = &d_config->c_info;
libxl_domain_build_info *b_info = &d_config->b_info;
- printf("(domain\n\t(domid %d)\n", domid);
- printf("\t(create_info)\n");
- printf("\t(hvm %d)\n", c_info->type == LIBXL_DOMAIN_TYPE_HVM);
- printf("\t(hap %s)\n", libxl_defbool_to_string(c_info->hap));
- printf("\t(oos %s)\n", libxl_defbool_to_string(c_info->oos));
- printf("\t(ssidref %d)\n", c_info->ssidref);
- printf("\t(name %s)\n", c_info->name);
+ fprintf(fh, "(domain\n\t(domid %d)\n", domid);
+ fprintf(fh, "\t(create_info)\n");
+ fprintf(fh, "\t(hvm %d)\n", c_info->type == LIBXL_DOMAIN_TYPE_HVM);
+ fprintf(fh, "\t(hap %s)\n", libxl_defbool_to_string(c_info->hap));
+ fprintf(fh, "\t(oos %s)\n", libxl_defbool_to_string(c_info->oos));
+ fprintf(fh, "\t(ssidref %d)\n", c_info->ssidref);
+ fprintf(fh, "\t(name %s)\n", c_info->name);
/* retrieve the UUID from dominfo, since it is probably generated
* during parsing and thus does not match the real one
*/
if (libxl_domain_info(ctx, &info, domid) == 0) {
- printf("\t(uuid " LIBXL_UUID_FMT ")\n", LIBXL_UUID_BYTES(info.uuid));
+ fprintf(fh, "\t(uuid " LIBXL_UUID_FMT ")\n", LIBXL_UUID_BYTES(info.uuid));
} else {
- printf("\t(uuid <unknown>)\n");
+ fprintf(fh, "\t(uuid <unknown>)\n");
}
if (c_info->pool_name)
- printf("\t(cpupool %s)\n", c_info->pool_name);
+ fprintf(fh, "\t(cpupool %s)\n", c_info->pool_name);
if (c_info->xsdata)
- printf("\t(xsdata contains data)\n");
+ fprintf(fh, "\t(xsdata contains data)\n");
else
- printf("\t(xsdata (null))\n");
+ fprintf(fh, "\t(xsdata (null))\n");
if (c_info->platformdata)
- printf("\t(platformdata contains data)\n");
+ fprintf(fh, "\t(platformdata contains data)\n");
else
- printf("\t(platformdata (null))\n");
+ fprintf(fh, "\t(platformdata (null))\n");
- printf("\t(build_info)\n");
- printf("\t(max_vcpus %d)\n", b_info->max_vcpus);
- printf("\t(tsc_mode %s)\n", libxl_tsc_mode_to_string(b_info->tsc_mode));
- printf("\t(max_memkb %"PRId64")\n", b_info->max_memkb);
- printf("\t(target_memkb %"PRId64")\n", b_info->target_memkb);
- printf("\t(nomigrate %s)\n",
+ fprintf(fh, "\t(build_info)\n");
+ fprintf(fh, "\t(max_vcpus %d)\n", b_info->max_vcpus);
+ fprintf(fh, "\t(tsc_mode %s)\n", libxl_tsc_mode_to_string(b_info->tsc_mode));
+ fprintf(fh, "\t(max_memkb %"PRId64")\n", b_info->max_memkb);
+ fprintf(fh, "\t(target_memkb %"PRId64")\n", b_info->target_memkb);
+ fprintf(fh, "\t(nomigrate %s)\n",
libxl_defbool_to_string(b_info->disable_migrate));
if (c_info->type == LIBXL_DOMAIN_TYPE_PV && b_info->u.pv.bootloader) {
- printf("\t(bootloader %s)\n", b_info->u.pv.bootloader);
+ fprintf(fh, "\t(bootloader %s)\n", b_info->u.pv.bootloader);
if (b_info->u.pv.bootloader_args) {
- printf("\t(bootloader_args");
+ fprintf(fh, "\t(bootloader_args");
for (i=0; b_info->u.pv.bootloader_args[i]; i++)
- printf(" %s", b_info->u.pv.bootloader_args[i]);
- printf(")\n");
+ fprintf(fh, " %s", b_info->u.pv.bootloader_args[i]);
+ fprintf(fh, ")\n");
}
}
- printf("\t(image\n");
+ fprintf(fh, "\t(image\n");
switch (c_info->type) {
case LIBXL_DOMAIN_TYPE_HVM:
- printf("\t\t(hvm\n");
- printf("\t\t\t(firmware %s)\n", b_info->u.hvm.firmware);
- printf("\t\t\t(video_memkb %"PRId64")\n", b_info->video_memkb);
- printf("\t\t\t(shadow_memkb %"PRId64")\n", b_info->shadow_memkb);
- printf("\t\t\t(pae %s)\n", libxl_defbool_to_string(b_info->u.hvm.pae));
- printf("\t\t\t(apic %s)\n",
+ fprintf(fh, "\t\t(hvm\n");
+ fprintf(fh, "\t\t\t(firmware %s)\n", b_info->u.hvm.firmware);
+ fprintf(fh, "\t\t\t(video_memkb %"PRId64")\n", b_info->video_memkb);
+ fprintf(fh, "\t\t\t(shadow_memkb %"PRId64")\n", b_info->shadow_memkb);
+ fprintf(fh, "\t\t\t(pae %s)\n", libxl_defbool_to_string(b_info->u.hvm.pae));
+ fprintf(fh, "\t\t\t(apic %s)\n",
libxl_defbool_to_string(b_info->u.hvm.apic));
- printf("\t\t\t(acpi %s)\n",
+ fprintf(fh, "\t\t\t(acpi %s)\n",
libxl_defbool_to_string(b_info->u.hvm.acpi));
- printf("\t\t\t(nx %s)\n", libxl_defbool_to_string(b_info->u.hvm.nx));
- printf("\t\t\t(viridian %s)\n",
+ fprintf(fh, "\t\t\t(nx %s)\n", libxl_defbool_to_string(b_info->u.hvm.nx));
+ fprintf(fh, "\t\t\t(viridian %s)\n",
libxl_defbool_to_string(b_info->u.hvm.viridian));
- printf("\t\t\t(hpet %s)\n",
+ fprintf(fh, "\t\t\t(hpet %s)\n",
libxl_defbool_to_string(b_info->u.hvm.hpet));
- printf("\t\t\t(vpt_align %s)\n",
+ fprintf(fh, "\t\t\t(vpt_align %s)\n",
libxl_defbool_to_string(b_info->u.hvm.vpt_align));
- printf("\t\t\t(timer_mode %s)\n",
+ fprintf(fh, "\t\t\t(timer_mode %s)\n",
libxl_timer_mode_to_string(b_info->u.hvm.timer_mode));
- printf("\t\t\t(nestedhvm %s)\n",
+ fprintf(fh, "\t\t\t(nestedhvm %s)\n",
libxl_defbool_to_string(b_info->u.hvm.nested_hvm));
- printf("\t\t\t(stdvga %s)\n", b_info->u.hvm.vga.kind ==
+ fprintf(fh, "\t\t\t(stdvga %s)\n", b_info->u.hvm.vga.kind ==
LIBXL_VGA_INTERFACE_TYPE_STD ?
"True" : "False");
- printf("\t\t\t(vnc %s)\n",
+ fprintf(fh, "\t\t\t(vnc %s)\n",
libxl_defbool_to_string(b_info->u.hvm.vnc.enable));
- printf("\t\t\t(vnclisten %s)\n", b_info->u.hvm.vnc.listen);
- printf("\t\t\t(vncdisplay %d)\n", b_info->u.hvm.vnc.display);
- printf("\t\t\t(vncunused %s)\n",
+ fprintf(fh, "\t\t\t(vnclisten %s)\n", b_info->u.hvm.vnc.listen);
+ fprintf(fh, "\t\t\t(vncdisplay %d)\n", b_info->u.hvm.vnc.display);
+ fprintf(fh, "\t\t\t(vncunused %s)\n",
libxl_defbool_to_string(b_info->u.hvm.vnc.findunused));
- printf("\t\t\t(keymap %s)\n", b_info->u.hvm.keymap);
- printf("\t\t\t(sdl %s)\n",
+ fprintf(fh, "\t\t\t(keymap %s)\n", b_info->u.hvm.keymap);
+ fprintf(fh, "\t\t\t(sdl %s)\n",
libxl_defbool_to_string(b_info->u.hvm.sdl.enable));
- printf("\t\t\t(opengl %s)\n",
+ fprintf(fh, "\t\t\t(opengl %s)\n",
libxl_defbool_to_string(b_info->u.hvm.sdl.opengl));
- printf("\t\t\t(nographic %s)\n",
+ fprintf(fh, "\t\t\t(nographic %s)\n",
libxl_defbool_to_string(b_info->u.hvm.nographic));
- printf("\t\t\t(spice %s)\n",
+ fprintf(fh, "\t\t\t(spice %s)\n",
libxl_defbool_to_string(b_info->u.hvm.spice.enable));
- printf("\t\t\t(spiceport %d)\n", b_info->u.hvm.spice.port);
- printf("\t\t\t(spicetls_port %d)\n", b_info->u.hvm.spice.tls_port);
- printf("\t\t\t(spicehost %s)\n", b_info->u.hvm.spice.host);
- printf("\t\t\t(spicedisable_ticketing %s)\n",
+ fprintf(fh, "\t\t\t(spiceport %d)\n", b_info->u.hvm.spice.port);
+ fprintf(fh, "\t\t\t(spicetls_port %d)\n", b_info->u.hvm.spice.tls_port);
+ fprintf(fh, "\t\t\t(spicehost %s)\n", b_info->u.hvm.spice.host);
+ fprintf(fh, "\t\t\t(spicedisable_ticketing %s)\n",
libxl_defbool_to_string(b_info->u.hvm.spice.disable_ticketing));
- printf("\t\t\t(spiceagent_mouse %s)\n",
+ fprintf(fh, "\t\t\t(spiceagent_mouse %s)\n",
libxl_defbool_to_string(b_info->u.hvm.spice.agent_mouse));
- printf("\t\t\t(device_model %s)\n", b_info->device_model ? : "default");
- printf("\t\t\t(gfx_passthru %s)\n",
+ fprintf(fh, "\t\t\t(device_model %s)\n", b_info->device_model ? : "default");
+ fprintf(fh, "\t\t\t(gfx_passthru %s)\n",
libxl_defbool_to_string(b_info->u.hvm.gfx_passthru));
- printf("\t\t\t(serial %s)\n", b_info->u.hvm.serial);
- printf("\t\t\t(boot %s)\n", b_info->u.hvm.boot);
- printf("\t\t\t(usb %s)\n", libxl_defbool_to_string(b_info->u.hvm.usb));
- printf("\t\t\t(usbdevice %s)\n", b_info->u.hvm.usbdevice);
- printf("\t\t)\n");
+ fprintf(fh, "\t\t\t(serial %s)\n", b_info->u.hvm.serial);
+ fprintf(fh, "\t\t\t(boot %s)\n", b_info->u.hvm.boot);
+ fprintf(fh, "\t\t\t(usb %s)\n", libxl_defbool_to_string(b_info->u.hvm.usb));
+ fprintf(fh, "\t\t\t(usbdevice %s)\n", b_info->u.hvm.usbdevice);
+ fprintf(fh, "\t\t)\n");
break;
case LIBXL_DOMAIN_TYPE_PV:
- printf("\t\t(linux %d)\n", 0);
- printf("\t\t\t(kernel %s)\n", b_info->kernel);
- printf("\t\t\t(cmdline %s)\n", b_info->cmdline);
- printf("\t\t\t(ramdisk %s)\n", b_info->ramdisk);
- printf("\t\t\t(e820_host %s)\n",
+ fprintf(fh, "\t\t(linux %d)\n", 0);
+ fprintf(fh, "\t\t\t(kernel %s)\n", b_info->kernel);
+ fprintf(fh, "\t\t\t(cmdline %s)\n", b_info->cmdline);
+ fprintf(fh, "\t\t\t(ramdisk %s)\n", b_info->ramdisk);
+ fprintf(fh, "\t\t\t(e820_host %s)\n",
libxl_defbool_to_string(b_info->u.pv.e820_host));
- printf("\t\t)\n");
+ fprintf(fh, "\t\t)\n");
break;
default:
fprintf(stderr, "Unknown domain type %d\n", c_info->type);
exit(1);
}
- printf("\t)\n");
+ fprintf(fh, "\t)\n");
for (i = 0; i < d_config->num_disks; i++) {
- printf("\t(device\n");
- printf("\t\t(tap\n");
- printf("\t\t\t(backend_domid %d)\n", d_config->disks[i].backend_domid);
- printf("\t\t\t(frontend_domid %d)\n", domid);
- printf("\t\t\t(physpath %s)\n", d_config->disks[i].pdev_path);
- printf("\t\t\t(phystype %d)\n", d_config->disks[i].backend);
- printf("\t\t\t(virtpath %s)\n", d_config->disks[i].vdev);
- printf("\t\t\t(unpluggable %d)\n", d_config->disks[i].removable);
- printf("\t\t\t(readwrite %d)\n", d_config->disks[i].readwrite);
- printf("\t\t\t(is_cdrom %d)\n", d_config->disks[i].is_cdrom);
- printf("\t\t)\n");
- printf("\t)\n");
+ fprintf(fh, "\t(device\n");
+ fprintf(fh, "\t\t(tap\n");
+ fprintf(fh, "\t\t\t(backend_domid %d)\n", d_config->disks[i].backend_domid);
+ fprintf(fh, "\t\t\t(frontend_domid %d)\n", domid);
+ fprintf(fh, "\t\t\t(physpath %s)\n", d_config->disks[i].pdev_path);
+ fprintf(fh, "\t\t\t(phystype %d)\n", d_config->disks[i].backend);
+ fprintf(fh, "\t\t\t(virtpath %s)\n", d_config->disks[i].vdev);
+ fprintf(fh, "\t\t\t(unpluggable %d)\n", d_config->disks[i].removable);
+ fprintf(fh, "\t\t\t(readwrite %d)\n", d_config->disks[i].readwrite);
+ fprintf(fh, "\t\t\t(is_cdrom %d)\n", d_config->disks[i].is_cdrom);
+ fprintf(fh, "\t\t)\n");
+ fprintf(fh, "\t)\n");
}
for (i = 0; i < d_config->num_nics; i++) {
- printf("\t(device\n");
- printf("\t\t(vif\n");
+ fprintf(fh, "\t(device\n");
+ fprintf(fh, "\t\t(vif\n");
if (d_config->nics[i].ifname)
- printf("\t\t\t(vifname %s)\n", d_config->nics[i].ifname);
- printf("\t\t\t(backend_domid %d)\n", d_config->nics[i].backend_domid);
- printf("\t\t\t(frontend_domid %d)\n", domid);
- printf("\t\t\t(devid %d)\n", d_config->nics[i].devid);
- printf("\t\t\t(mtu %d)\n", d_config->nics[i].mtu);
- printf("\t\t\t(model %s)\n", d_config->nics[i].model);
- printf("\t\t\t(mac %02x%02x%02x%02x%02x%02x)\n",
+ fprintf(fh, "\t\t\t(vifname %s)\n", d_config->nics[i].ifname);
+ fprintf(fh, "\t\t\t(backend_domid %d)\n", d_config->nics[i].backend_domid);
+ fprintf(fh, "\t\t\t(frontend_domid %d)\n", domid);
+ fprintf(fh, "\t\t\t(devid %d)\n", d_config->nics[i].devid);
+ fprintf(fh, "\t\t\t(mtu %d)\n", d_config->nics[i].mtu);
+ fprintf(fh, "\t\t\t(model %s)\n", d_config->nics[i].model);
+ fprintf(fh, "\t\t\t(mac %02x%02x%02x%02x%02x%02x)\n",
d_config->nics[i].mac[0], d_config->nics[i].mac[1],
d_config->nics[i].mac[2], d_config->nics[i].mac[3],
d_config->nics[i].mac[4], d_config->nics[i].mac[5]);
- printf("\t\t)\n");
- printf("\t)\n");
+ fprintf(fh, "\t\t)\n");
+ fprintf(fh, "\t)\n");
}
for (i = 0; i < d_config->num_pcidevs; i++) {
- printf("\t(device\n");
- printf("\t\t(pci\n");
- printf("\t\t\t(pci dev %04x:%02x:%02x.%01x@%02x)\n",
+ fprintf(fh, "\t(device\n");
+ fprintf(fh, "\t\t(pci\n");
+ fprintf(fh, "\t\t\t(pci dev %04x:%02x:%02x.%01x@%02x)\n",
d_config->pcidevs[i].domain, d_config->pcidevs[i].bus,
d_config->pcidevs[i].dev, d_config->pcidevs[i].func,
d_config->pcidevs[i].vdevfn);
- printf("\t\t\t(opts msitranslate %d power_mgmt %d)\n",
+ fprintf(fh, "\t\t\t(opts msitranslate %d power_mgmt %d)\n",
d_config->pcidevs[i].msitranslate,
d_config->pcidevs[i].power_mgmt);
- printf("\t\t)\n");
- printf("\t)\n");
+ fprintf(fh, "\t\t)\n");
+ fprintf(fh, "\t)\n");
}
for (i = 0; i < d_config->num_vfbs; i++) {
- printf("\t(device\n");
- printf("\t\t(vfb\n");
- printf("\t\t\t(backend_domid %d)\n", d_config->vfbs[i].backend_domid);
- printf("\t\t\t(frontend_domid %d)\n", domid);
- printf("\t\t\t(devid %d)\n", d_config->vfbs[i].devid);
- printf("\t\t\t(vnc %s)\n",
+ fprintf(fh, "\t(device\n");
+ fprintf(fh, "\t\t(vfb\n");
+ fprintf(fh, "\t\t\t(backend_domid %d)\n", d_config->vfbs[i].backend_domid);
+ fprintf(fh, "\t\t\t(frontend_domid %d)\n", domid);
+ fprintf(fh, "\t\t\t(devid %d)\n", d_config->vfbs[i].devid);
+ fprintf(fh, "\t\t\t(vnc %s)\n",
libxl_defbool_to_string(d_config->vfbs[i].vnc.enable));
- printf("\t\t\t(vnclisten %s)\n", d_config->vfbs[i].vnc.listen);
- printf("\t\t\t(vncdisplay %d)\n", d_config->vfbs[i].vnc.display);
- printf("\t\t\t(vncunused %s)\n",
+ fprintf(fh, "\t\t\t(vnclisten %s)\n", d_config->vfbs[i].vnc.listen);
+ fprintf(fh, "\t\t\t(vncdisplay %d)\n", d_config->vfbs[i].vnc.display);
+ fprintf(fh, "\t\t\t(vncunused %s)\n",
libxl_defbool_to_string(d_config->vfbs[i].vnc.findunused));
- printf("\t\t\t(keymap %s)\n", d_config->vfbs[i].keymap);
- printf("\t\t\t(sdl %s)\n",
+ fprintf(fh, "\t\t\t(keymap %s)\n", d_config->vfbs[i].keymap);
+ fprintf(fh, "\t\t\t(sdl %s)\n",
libxl_defbool_to_string(d_config->vfbs[i].sdl.enable));
- printf("\t\t\t(opengl %s)\n",
+ fprintf(fh, "\t\t\t(opengl %s)\n",
libxl_defbool_to_string(d_config->vfbs[i].sdl.opengl));
- printf("\t\t\t(display %s)\n", d_config->vfbs[i].sdl.display);
- printf("\t\t\t(xauthority %s)\n", d_config->vfbs[i].sdl.xauthority);
- printf("\t\t)\n");
- printf("\t)\n");
+ fprintf(fh, "\t\t\t(display %s)\n", d_config->vfbs[i].sdl.display);
+ fprintf(fh, "\t\t\t(xauthority %s)\n", d_config->vfbs[i].sdl.xauthority);
+ fprintf(fh, "\t\t)\n");
+ fprintf(fh, "\t)\n");
}
- printf(")\n");
+ fprintf(fh, ")\n");
}
--- xen-4.5.0-rc1/tools/libxl/xl.h.orig 2014-10-24 15:22:40.000000000 +0100
+++ xen-4.5.0-rc1/tools/libxl/xl.h 2014-11-25 20:56:20.592272939 +0000
@@ -186,7 +186,7 @@
};
extern enum output_format default_output_format;
-extern void printf_info_sexp(int domid, libxl_domain_config *d_config);
+extern void printf_info_sexp(int domid, libxl_domain_config *d_config, FILE *fh);
#define XL_GLOBAL_CONFIG XEN_CONFIG_DIR "/xl.conf"
#define XL_LOCK_FILE XEN_LOCK_DIR "/xl"
[-- Attachment #3: Type: text/plain, Size: 126 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] fix migration failure with xl migrate --debug
2014-11-26 20:51 [PATCH] fix migration failure with xl migrate --debug M A Young
@ 2014-11-26 21:17 ` Andrew Cooper
2014-11-27 23:39 ` M A Young
0 siblings, 1 reply; 3+ messages in thread
From: Andrew Cooper @ 2014-11-26 21:17 UTC (permalink / raw)
To: M A Young, xen-devel
Cc: Ian Jackson, Wei Liu, Ian Campbell, Stefano Stabellini
[-- Attachment #1.1: Type: text/plain, Size: 1888 bytes --]
On 26/11/2014 20:51, M A Young wrote:
> Migrations with xl migrate --debug will fail because debugging
> information from the receiving process is written to the stdout
> channel. This channel is also used for status messages so the
> migration will fail as the sending process receives an unexpected
> message. This patch moves the debugging information to the stderr
> channel.
>
> Signed-off-by: Michael Young <m.a.young@durham.ac.uk>
Ah yes - that will do.
The whole info/error/debug handling here is a mess. Amongst other
issues, it is not possible to distinguish whether libxc logging messages
are coming from the sending or receiving side, without judging the
context from the text itself.
>
> Use stderr for debugging messages for xl migrate --debug as stdout is used
> for status messages.
>
> --- xen-4.5.0-rc1/tools/libxl/xl_cmdimpl.c.orig 2014-10-24 15:22:40.000000000 +0100
> +++ xen-4.5.0-rc1/tools/libxl/xl_cmdimpl.c 2014-11-25 20:29:06.723856433 +0000
> @@ -383,7 +383,7 @@
Sadly, changing printf_info() like this has an unintended knock-on
effect to create_domain() (xl create, migrate-recevive, restore) and xl
config-update. I think you might have to pass FILE pointers all the way
through.
> libxl_domain_config *d_config)
> {
> if (output_format == OUTPUT_FORMAT_SXP)
> - return printf_info_sexp(domid, d_config);
> + return printf_info_sexp(domid, d_config, stderr);
>
> const char *buf;
> libxl_yajl_length len = 0;
> @@ -404,7 +404,7 @@
> if (s != yajl_gen_status_ok)
> goto out;
>
> - puts(buf);
> + fputs(buf,stderr);
puts() and fputs() are not quite synonymous. puts() will
unconditionally add an extra newline to stdout. It is unclear whether
the string from yajl_gen_get_buf() comes with a trailing newline or
not. If the output looks ok, it probably is fine.
~Andrew
[-- Attachment #1.2: Type: text/html, Size: 2956 bytes --]
[-- Attachment #2: Type: text/plain, Size: 126 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] fix migration failure with xl migrate --debug
2014-11-26 21:17 ` Andrew Cooper
@ 2014-11-27 23:39 ` M A Young
0 siblings, 0 replies; 3+ messages in thread
From: M A Young @ 2014-11-27 23:39 UTC (permalink / raw)
To: Andrew Cooper
Cc: Ian Jackson, Stefano Stabellini, Wei Liu, Ian Campbell, xen-devel
[-- Attachment #1: Type: TEXT/PLAIN, Size: 961 bytes --]
On Wed, 26 Nov 2014, Andrew Cooper wrote:
> On 26/11/2014 20:51, M A Young wrote:
>
> --- xen-4.5.0-rc1/tools/libxl/xl_cmdimpl.c.orig 2014-10-24 15:22:40.000000000
> +0100
> +++ xen-4.5.0-rc1/tools/libxl/xl_cmdimpl.c 2014-11-25 20:29:06.723856433 +000
> 0
> @@ -383,7 +383,7 @@
>
>
> Sadly, changing printf_info() like this has an unintended knock-on effect to
> create_domain() (xl create, migrate-recevive, restore) and xl
> config-update. I think you might have to pass FILE pointers all the way
> through.
Yes, I had missed the second use of printf_info() . I will post a revised
patch shortly.
> - puts(buf);
> + fputs(buf,stderr);
>
>
> puts() and fputs() are not quite synonymous. puts() will unconditionally
> add an extra newline to stdout. It is unclear whether the string from
> yajl_gen_get_buf() comes with a trailing newline or not. If the output
> looks ok, it probably is fine.
It looked okay in my testing.
Michael Young
[-- Attachment #2: Type: text/plain, Size: 126 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2014-11-27 23:39 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-11-26 20:51 [PATCH] fix migration failure with xl migrate --debug M A Young
2014-11-26 21:17 ` Andrew Cooper
2014-11-27 23:39 ` M A Young
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.