// ckptfile is: ${real-dir}/filename-base. // Need to extract "${real-dir}" and "file-basename" from it int start_crfs_wa(char *sessionid, char *realdir) { char cmd[MAX_CMD_LEN]; memset(crfs_wa_real, 0, MAX_PATH_LEN); memset(crfs_wa_mnt, 0, MAX_PATH_LEN); memset(cmd, 0, MAX_CMD_LEN); strncpy(crfs_wa_real, realdir, MAX_PATH_LEN); snprintf(cmd, MAX_CMD_LEN, "mkdir -p %s", crfs_wa_real); system(cmd); snprintf(crfs_wa_mnt, MAX_PATH_LEN, "/tmp/cr-%s/wa/", sessionid); snprintf(cmd, MAX_CMD_LEN, "mkdir -p %s", crfs_wa_mnt); system(cmd); int pfd[2]; char ch; int argc = 0; char *argv[10]; int fg = 0; crfs_mode = MODE_WRITEAGGRE; mig_role = ROLE_INVAL; argv[0] = "crfs-wa"; argv[1] = crfs_wa_real; argv[2] = crfs_wa_mnt; argv[3] = "-obig_writes"; //NULL; //"-odirect_io"; //"-obig_writes"; argv[4] = NULL; argc = 4; if (fg) { argv[argc] = "-f"; argc++; argv[argc] = NULL; } dbg("real-dir=%s, mnt=%s\n", argv[1], argv[2]); if (pipe(pfd) != 0) { perror("Fail to create pipe...\n"); return -1; } crfs_wa_pid = fork(); if (crfs_wa_pid == 0) // in child proc { clear_sigmask(); // Set prefix for debug output { const int MAX_LENGTH = 256; char hostname[MAX_LENGTH]; gethostname(hostname, MAX_LENGTH); hostname[MAX_LENGTH - 1] = '\0'; char output_prefix[MAX_LENGTH]; snprintf(output_prefix, MAX_LENGTH, "%s:mpispawn_wa_%i", hostname, mt_id); set_output_prefix(output_prefix); } extern void *crfs_main(int pfd, int argc, char **argv); close(pfd[0]); // close the read-end PRINT_DEBUG(DEBUG_Fork_verbose, "start CRFS-wa (pid=%d)\n", getpid()); crfs_main(pfd[1], argc, argv); PRINT_DEBUG(DEBUG_Fork_verbose, "CRFS-wa will exit now...\n"); exit(0); } else if (crfs_wa_pid < 0) // error!! { perror("fail to fork...\n"); return -1; } PRINT_DEBUG(DEBUG_Fork_verbose, "FORK mpispawn_wa (pid=%d)\n", crfs_wa_pid); /// pid>0: in parent proc close(pfd[1]); // close the write-end dbg("parent proc waits...\n\n"); read(pfd[0], &ch, 1); // wait for a sig dbg("***** has got a char == %c\n", ch); close(pfd[0]); if (ch != '0') { stop_crfs_wa(); return -1; } return 0; }
void loop(int port, char *cmd[]) { int sockfd; // socket fd int ready[2]; // ready pipe int rd; // pipe reader fd int wr; // pipe writer fd int pid; // temp child pid; fd_set rset; // fd set for pipe reader char *p; // GRACE_START_TIMEOUT int rt; // start timeout sockfd = createsock(port); setup_signals(); rt = 10; if ((p = getenv(GRACE_START_TIMEOUT)) != NULL) { rt = atoi(p); } timeout.tv_sec = rt; timeout.tv_usec = 0; while(1) { if (pipe(ready) < 0) { SYSERR("pipe"); } rd = ready[0]; wr = ready[1]; pid = fork(); if (pid < 0) { SYSERR("fork"); } if (pid == 0) { close(rd); close(srd); close(swr); // sigmask is preserved for child process, so we need to clear it; clear_sigmask(); setenvs(sockfd, wr); execvp(cmd[0], cmd); SYSERR("execvp"); } // close the write end of the pipe; close(wr); wait_child(pid, rd); close(rd); // successfully started; then kill the old one. if (childpid) { kill(childpid, SIGTERM); } childpid = pid; wait_restart(); if (termniate) { if (childpid) { kill(childpid, SIGTERM); } exit(0); } } }
/// src_tgt:: 0=at src, 1=srv tgt int start_crfs_mig(char *sessionid, int src_tgt) { char cmd[MAX_CMD_LEN]; if (src_tgt != 1 && src_tgt != 2) { err("Incorrect param: src_tgt=%d\n", src_tgt); return -1; } //realdir = ckptfile; memset(crfs_mig_real, 0, MAX_PATH_LEN); memset(crfs_mig_mnt, 0, MAX_PATH_LEN); memset(cmd, 0, MAX_CMD_LEN); snprintf(crfs_mig_real, MAX_PATH_LEN, "/tmp/cr-%s/", sessionid); snprintf(cmd, MAX_CMD_LEN, "mkdir -p %s", crfs_mig_real); system(cmd); snprintf(crfs_mig_mnt, MAX_PATH_LEN, "/tmp/cr-%s/mig/", sessionid); snprintf(cmd, MAX_CMD_LEN, "mkdir -p %s", crfs_mig_mnt); system(cmd); int pfd[2]; char ch; int argc = 0; char *argv[10]; // //{ "crfs-wa", "/tmp/ckpt", "/tmp/mnt", "-f", "-odirect_io", NULL }; if (src_tgt == 1) // I'm mig-source { crfs_mode = MODE_WRITEAGGRE; mig_role = ROLE_MIG_SRC; } else if (src_tgt == 2) // at target side { crfs_mode = MODE_MIG; mig_role = ROLE_MIG_TGT; } int fg = 0; argv[0] = "crfs-mig"; argv[1] = crfs_mig_real; argv[2] = crfs_mig_mnt; argv[3] = "-osync_read"; argv[4] = "-obig_writes"; //NULL; //"-odirect_io"; //"-obig_writes"; argv[5] = NULL; argc = 5; if (fg) { argv[argc++] = "-f"; argv[argc] = NULL; } if (pipe(pfd) != 0) { perror("Fail to create pipe...\n"); return -1; } crfs_mig_pid = fork(); if (crfs_mig_pid == 0) // in child proc { clear_sigmask(); // Set prefix for debug output { const int MAX_LENGTH = 256; char hostname[MAX_LENGTH]; gethostname(hostname, MAX_LENGTH); hostname[MAX_LENGTH - 1] = '\0'; char output_prefix[MAX_LENGTH]; snprintf(output_prefix, MAX_LENGTH, "%s:mpispawn_mig_%i", hostname, mt_id); set_output_prefix(output_prefix); } extern void *crfs_main(int pfd, int argc, char **argv); close(pfd[0]); // close the read-end PRINT_DEBUG(DEBUG_Fork_verbose, "start CRFS-mig (pid=%d)\n", getpid()); crfs_main(pfd[1], argc, argv); PRINT_DEBUG(DEBUG_Fork_verbose, "CRFS-mig will exit now...\n"); exit(0); } else if (crfs_mig_pid < 0) // error!! { perror("fail to fork...\n"); return -1; } PRINT_DEBUG(DEBUG_Fork_verbose, "FORK mpispawn_mig (pid=%d)\n", crfs_mig_pid); /// pid>0: in parent proc close(pfd[1]); // close the write-end dbg("parent proc waits...\n\n"); read(pfd[0], &ch, 1); // wait for a sig dbg("has got a char: %c\n", ch); close(pfd[0]); if (ch != '0') { stop_crfs_mig(); return -1; } return 0; }