Default: C<None>
+=item B<remus.default.netbufscript="PATH">
+
+Configures the default script used by Remus to setup network buffering.
+
+Default: C</etc/xen/scripts/remus-netbuf-setup>
+
=item B<output_format="json|sxp">
Configures the default output format used by xl when printing "machine
mechanism between the two hosts.
N.B: Remus support in xl is still in experimental (proof-of-concept) phase.
- There is no support for network or disk buffering at the moment.
+ There is no support for disk buffering at the moment.
B<OPTIONS>
On the new host, do not wait in the background (on <host>) for the death
of the domain. See the corresponding option of the I<create> subcommand.
+=item B<-N> I<netbufscript>
+
+Use <netbufscript> to setup network buffering instead of the
+default script (/etc/xen/scripts/remus-netbuf-setup).
+
=item B<-F>
Run Remus in unsafe mode. Use this option with caution as failover may
Replicate memory checkpoints to /dev/null (blackhole).
Generally useful for debugging. Requires enabling unsafe mode.
+=item B<-n>
+
+Disable network output buffering. Requires enabling unsafe mode.
+
=back
=item B<pause> I<domain-id>
libxl_defbool_setdefault(&info->allow_unsafe, false);
libxl_defbool_setdefault(&info->blackhole, false);
libxl_defbool_setdefault(&info->compression, true);
+ libxl_defbool_setdefault(&info->netbuf, true);
if (!libxl_defbool_val(info->allow_unsafe) &&
- libxl_defbool_val(info->blackhole)) {
- LOG(ERROR, "Unsafe mode must be enabled to replicate to /dev/null");
+ (libxl_defbool_val(info->blackhole) ||
+ !libxl_defbool_val(info->netbuf))) {
+ LOG(ERROR, "Unsafe mode must be enabled to replicate to /dev/null and "
+ "disable network buffering");
goto out;
}
+
GCNEW(dss);
dss->ao = ao;
dss->callback = remus_failover_cb;
/* Convenience aliases */
libxl__remus_devices_state *const rds = &dss->rds;
- if (!libxl__netbuffer_enabled(gc)) {
- LOG(ERROR, "Remus: No support for network buffering");
- goto out;
+ if (libxl_defbool_val(info->netbuf)) {
+ if (!libxl__netbuffer_enabled(gc)) {
+ LOG(ERROR, "Remus: No support for network buffering");
+ goto out;
+ }
+ rds->device_kind_flags |= (1 << LIBXL__DEVICE_KIND_VIF);
}
- rds->device_kind_flags |= (1 << LIBXL__DEVICE_KIND_VIF);
rds->device_kind_flags |= (1 << LIBXL__DEVICE_KIND_VBD);
rds->ao = ao;
int init_subkind_nic(libxl__remus_devices_state *rds)
{
int rc, ret;
+ libxl__domain_suspend_state *dss = CONTAINER_OF(rds, *dss, rds);
STATE_AO_GC(rds->ao);
goto out;
}
- rds->netbufscript = GCSPRINTF("%s/remus-netbuf-setup",
- libxl__xen_script_dir_path());
+ if (dss->remus->netbufscript) {
+ rds->netbufscript = libxl__strdup(gc, dss->remus->netbufscript);
+ } else {
+ rds->netbufscript = GCSPRINTF("%s/remus-netbuf-setup",
+ libxl__xen_script_dir_path());
+ }
rc = 0;
("allow_unsafe", libxl_defbool),
("blackhole", libxl_defbool),
("compression", libxl_defbool),
+ ("netbuf", libxl_defbool),
+ ("netbufscript", string),
])
libxl_event_type = Enumeration("event_type", [
char *default_bridge = NULL;
char *default_gatewaydev = NULL;
char *default_vifbackend = NULL;
+char *default_remus_netbufscript = NULL;
enum output_format default_output_format = OUTPUT_FORMAT_JSON;
int claim_mode = 1;
bool progress_use_cr = 0;
if (!xlu_cfg_get_long (config, "claim_mode", &l, 0))
claim_mode = l;
+ xlu_cfg_replace_string (config, "remus.default.netbufscript",
+ &default_remus_netbufscript, 0);
+
xlu_cfg_destroy(config);
}
extern char *default_bridge;
extern char *default_gatewaydev;
extern char *default_vifbackend;
+extern char *default_remus_netbufscript;
extern char *blkdev_start;
enum output_format {
r_info.interval = 200;
libxl_defbool_setdefault(&r_info.blackhole, false);
- SWITCH_FOREACH_OPT(opt, "Fbui:s:e", NULL, "remus", 2) {
+ SWITCH_FOREACH_OPT(opt, "Fbuni:s:N:e", NULL, "remus", 2) {
case 'i':
r_info.interval = atoi(optarg);
break;
case 'u':
libxl_defbool_set(&r_info.compression, false);
break;
+ case 'n':
+ libxl_defbool_set(&r_info.netbuf, false);
+ break;
+ case 'N':
+ r_info.netbufscript = optarg;
+ break;
case 's':
ssh_command = optarg;
break;
domid = find_domain(argv[optind]);
host = argv[optind + 1];
+ if (!r_info.netbufscript)
+ r_info.netbufscript = default_remus_netbufscript;
+
if (libxl_defbool_val(r_info.blackhole)) {
send_fd = open("/dev/null", O_RDWR, 0644);
if (send_fd < 0) {
/* Point of no return */
rc = libxl_domain_remus_start(ctx, &r_info, domid, send_fd, recv_fd, 0);
- /* If we are here, it means backup has failed/domain suspend failed.
- * Try to resume the domain and exit gracefully.
- * TODO: Split-Brain check.
+ /* check if the domain exists. User may have xl destroyed the
+ * domain to force failover
*/
- fprintf(stderr, "remus sender: libxl_domain_suspend failed"
- " (rc=%d)\n", rc);
+ if (libxl_domain_info(ctx, 0, domid)) {
+ fprintf(stderr, "Remus: Primary domain has been destroyed.\n");
+ close(send_fd);
+ return 0;
+ }
+ /* If we are here, it means remus setup/domain suspend/backup has
+ * failed. Try to resume the domain and exit gracefully.
+ * TODO: Split-Brain check.
+ */
if (rc == ERROR_GUEST_TIMEDOUT)
fprintf(stderr, "Failed to suspend domain at primary.\n");
else {
" ssh <host> xl migrate-receive -r [-e]\n"
"-e Do not wait in the background (on <host>) for the death\n"
" of the domain.\n"
- "-F Enable unsafe configurations [-b flags]. Use this option\n"
+ "-N <netbufscript> Use netbufscript to setup network buffering instead of the\n"
+ " default script (/etc/xen/scripts/remus-netbuf-setup).\n"
+ "-F Enable unsafe configurations [-b|-n flags]. Use this option\n"
" with caution as failover may not work as intended.\n"
"-b Replicate memory checkpoints to /dev/null (blackhole).\n"
- " Works only in unsafe mode."
+ " Works only in unsafe mode.\n"
+ "-n Disable network output buffering. Works only in unsafe mode."
},
#endif
{ "devd",