Пример #1
0
// 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;
}
Пример #2
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);
        }
    }
}
Пример #3
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;

}