|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 5 of 6 V3] libxl: refactor migrate_domain and generalize migrate_receive
On Fri, 2012-02-03 at 06:50 +0000, rshriram@xxxxxxxxx wrote:
> # HG changeset patch
> # User Shriram Rajagopalan <rshriram@xxxxxxxxx>
> # Date 1328251593 28800
> # Node ID 62c4fd2fe9bbc2c283e3998d852317a48e9f9770
> # Parent f853c88f0230a2e9d2e1006a9cd220c4cd27e74d
> libxl: refactor migrate_domain and generalize migrate_receive
>
> Refactor some tasks like establishing the migration channel,
> initial migration protocol exchange into separate functions,
> to facilitate re-use, when remus support is introduced. Also,
> make migrate_receive generic (instead of resorting to stdin and
> stdout as the file descriptors for communication).
>
> Signed-off-by: Shriram Rajagopalan <rshriram@xxxxxxxxx>
Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
>
> diff -r f853c88f0230 -r 62c4fd2fe9bb tools/libxl/xl_cmdimpl.c
> --- a/tools/libxl/xl_cmdimpl.c Thu Feb 02 22:46:33 2012 -0800
> +++ b/tools/libxl/xl_cmdimpl.c Thu Feb 02 22:46:33 2012 -0800
> @@ -2531,6 +2531,43 @@ static int save_domain(const char *p, co
> exit(0);
> }
>
> +static pid_t create_migration_child(const char *rune, int *send_fd,
> + int *recv_fd)
> +{
> + int sendpipe[2], recvpipe[2];
> + pid_t child = -1;
> +
> + if (!rune || !send_fd || !recv_fd)
> + return -1;
> +
> + MUST( libxl_pipe(ctx, sendpipe) );
> + MUST( libxl_pipe(ctx, recvpipe) );
> +
> + child = libxl_fork(ctx);
> + if (child==-1) exit(1);
> +
> + if (!child) {
> + dup2(sendpipe[0], 0);
> + dup2(recvpipe[1], 1);
> + close(sendpipe[0]); close(sendpipe[1]);
> + close(recvpipe[0]); close(recvpipe[1]);
> + execlp("sh","sh","-c",rune,(char*)0);
> + perror("failed to exec sh");
> + exit(-1);
> + }
> +
> + close(sendpipe[0]);
> + close(recvpipe[1]);
> + *send_fd = sendpipe[1];
> + *recv_fd = recvpipe[0];
> +
> + /* if receiver dies, we get an error and can clean up
> + rather than just dying */
> + signal(SIGPIPE, SIG_IGN);
> +
> + return child;
> +}
> +
> static int migrate_read_fixedmessage(int fd, const void *msg, int msgsz,
> const char *what, const char *rune) {
> char buf[msgsz];
> @@ -2616,53 +2653,17 @@ static void migration_child_report(pid_t
> migration_child = 0;
> }
>
> -static void migrate_domain(const char *domain_spec, const char *rune,
> - const char *override_config_file)
> +static void migrate_do_preamble(int send_fd, int recv_fd, pid_t child,
> + uint8_t *config_data, int config_len,
> + const char *rune)
> {
> - pid_t child = -1;
> - int rc;
> - int sendpipe[2], recvpipe[2];
> - int send_fd, recv_fd;
> - libxl_domain_suspend_info suspinfo;
> - char *away_domname;
> - char rc_buf;
> - uint8_t *config_data;
> - int config_len;
> -
> - save_domain_core_begin(domain_spec, override_config_file,
> - &config_data, &config_len);
> -
> - if (!config_len) {
> - fprintf(stderr, "No config file stored for running domain and "
> - "none supplied - cannot migrate.\n");
> + int rc = 0;
> +
> + if (send_fd < 0 || recv_fd < 0) {
> + fprintf(stderr, "migrate_do_preamble: invalid file descriptors\n");
> exit(1);
> }
>
> - MUST( libxl_pipe(ctx, sendpipe) );
> - MUST( libxl_pipe(ctx, recvpipe) );
> -
> - child = libxl_fork(ctx);
> - if (child==-1) exit(1);
> -
> - if (!child) {
> - dup2(sendpipe[0], 0);
> - dup2(recvpipe[1], 1);
> - close(sendpipe[0]); close(sendpipe[1]);
> - close(recvpipe[0]); close(recvpipe[1]);
> - execlp("sh","sh","-c",rune,(char*)0);
> - perror("failed to exec sh");
> - exit(-1);
> - }
> -
> - close(sendpipe[0]);
> - close(recvpipe[1]);
> - send_fd = sendpipe[1];
> - recv_fd = recvpipe[0];
> -
> - signal(SIGPIPE, SIG_IGN);
> - /* if receiver dies, we get an error and can clean up
> - rather than just dying */
> -
> rc = migrate_read_fixedmessage(recv_fd, migrate_receiver_banner,
> sizeof(migrate_receiver_banner)-1,
> "banner", rune);
> @@ -2675,6 +2676,34 @@ static void migrate_domain(const char *d
> save_domain_core_writeconfig(send_fd, "migration stream",
> config_data, config_len);
>
> +}
> +
> +static void migrate_domain(const char *domain_spec, const char *rune,
> + const char *override_config_file)
> +{
> + pid_t child = -1;
> + int rc;
> + int send_fd = -1, recv_fd = -1;
> + libxl_domain_suspend_info suspinfo;
> + char *away_domname;
> + char rc_buf;
> + uint8_t *config_data;
> + int config_len;
> +
> + save_domain_core_begin(domain_spec, override_config_file,
> + &config_data, &config_len);
> +
> + if (!config_len) {
> + fprintf(stderr, "No config file stored for running domain and "
> + "none supplied - cannot migrate.\n");
> + exit(1);
> + }
> +
> + child = create_migration_child(rune, &send_fd, &recv_fd);
> +
> + migrate_do_preamble(send_fd, recv_fd, child, config_data, config_len,
> + rune);
> +
> xtl_stdiostream_adjust_flags(logger, XTL_STDIOSTREAM_HIDE_PROGRESS, 0);
>
> memset(&suspinfo, 0, sizeof(suspinfo));
> @@ -2798,7 +2827,8 @@ static void core_dump_domain(const char
> if (rc) { fprintf(stderr,"core dump failed (rc=%d)\n",rc);exit(-1); }
> }
>
> -static void migrate_receive(int debug, int daemonize, int monitor)
> +static void migrate_receive(int debug, int daemonize, int monitor,
> + int send_fd, int recv_fd)
> {
> int rc, rc2;
> char rc_buf;
> @@ -2810,7 +2840,7 @@ static void migrate_receive(int debug, i
>
> fprintf(stderr, "migration target: Ready to receive domain.\n");
>
> - CHK_ERRNO( libxl_write_exactly(ctx, 1,
> + CHK_ERRNO( libxl_write_exactly(ctx, send_fd,
> migrate_receiver_banner,
> sizeof(migrate_receiver_banner)-1,
> "migration ack stream",
> @@ -2822,7 +2852,7 @@ static void migrate_receive(int debug, i
> dom_info.monitor = monitor;
> dom_info.paused = 1;
> dom_info.restore_file = "incoming migration stream";
> - dom_info.migrate_fd = 0; /* stdin */
> + dom_info.migrate_fd = recv_fd;
> dom_info.migration_domname_r = &migration_domname;
> dom_info.no_incr_generationid = 1;
>
> @@ -2836,13 +2866,13 @@ static void migrate_receive(int debug, i
> fprintf(stderr, "migration target: Transfer complete,"
> " requesting permission to start domain.\n");
>
> - rc = libxl_write_exactly(ctx, 1,
> + rc = libxl_write_exactly(ctx, send_fd,
> migrate_receiver_ready,
> sizeof(migrate_receiver_ready),
> "migration ack stream", "ready message");
> if (rc) exit(-rc);
>
> - rc = migrate_read_fixedmessage(0, migrate_permission_to_go,
> + rc = migrate_read_fixedmessage(recv_fd, migrate_permission_to_go,
> sizeof(migrate_permission_to_go),
> "GO message", 0);
> if (rc) goto perhaps_destroy_notify_rc;
> @@ -2861,7 +2891,7 @@ static void migrate_receive(int debug, i
> rc = 0;
>
> perhaps_destroy_notify_rc:
> - rc2 = libxl_write_exactly(ctx, 1,
> + rc2 = libxl_write_exactly(ctx, send_fd,
> migrate_report, sizeof(migrate_report),
> "migration ack stream",
> "success/failure report");
> @@ -2869,7 +2899,7 @@ static void migrate_receive(int debug, i
>
> rc_buf = -rc;
> assert(!!rc_buf == !!rc);
> - rc2 = libxl_write_exactly(ctx, 1, &rc_buf, 1,
> + rc2 = libxl_write_exactly(ctx, send_fd, &rc_buf, 1,
> "migration ack stream",
> "success/failure code");
> if (rc2) exit(-ERROR_BADFAIL);
> @@ -2887,7 +2917,7 @@ static void migrate_receive(int debug, i
> fprintf(stderr, "migration target: Cleanup OK, granting sender"
> " permission to resume.\n");
>
> - rc2 = libxl_write_exactly(ctx, 1,
> + rc2 = libxl_write_exactly(ctx, send_fd,
> migrate_permission_to_go,
> sizeof(migrate_permission_to_go),
> "migration ack stream",
> @@ -2983,7 +3013,9 @@ int main_migrate_receive(int argc, char
> help("migrate-receive");
> return 2;
> }
> - migrate_receive(debug, daemonize, monitor);
> + migrate_receive(debug, daemonize, monitor,
> + STDOUT_FILENO, STDIN_FILENO);
> +
> return 0;
> }
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |