Ejemplo n.º 1
0
static int rs_free_test_test(rs_slave_info_t *si, void *obj)
{
    rs_mysql_test_t *test;

    test = (rs_mysql_test_t *) obj;

    if(test->col.data != NULL) {
        rs_pfree(si->dpool, test->col.data, test->col.id);
    }

    return RS_OK;
}
Ejemplo n.º 2
0
int rs_binlog_create_data(rs_reqdump_data_t *rd) 
{
    int                     r, len;
    char                    istr[UINT32_LEN + 1], *p;
    rs_binlog_info_t        *bi;
    rs_ringbuf_data_t       *rbd;

    bi = &(rd->binlog_info);
    p = NULL;

    if(bi->mev == 0) {
        if(bi->skip_n++ % RS_SKIP_DATA_FLUSH_NUM != 0) {
            bi->skip_n = 1;
            return RS_OK;
        }
    }

    for( ;; ) {

        r = rs_ringbuf_set(rd->ringbuf, &rbd);

        if(r == RS_FULL) {
            sleep(RS_RINGBUF_FSSEC);
            continue;
        } else if(r == RS_ERR) {
            return RS_ERR;
        }

        /* free memory */
        if(rbd->data != NULL) {
            rs_pfree(rd->pool, rbd->data, rbd->id); 
            rs_ringbuf_data_t_init(rbd);
        }

        /* rs_uint32_to_str(rd->dump_pos, istr); */
        len = snprintf(istr, UINT32_LEN + 1, "%u", rd->dump_pos);
        len += rs_strlen(rd->dump_file) + 1 + 1 + 1; 

        if(bi->mev == 0) {

            rbd->len = len;
            rbd->id = rs_palloc_id(rd->pool, len);
            rbd->data = rs_palloc(rd->pool, len, rbd->id);

            if(rbd->data == NULL) {
                return RS_ERR;
            }

            len = snprintf(rbd->data, rbd->len, "%s,%s\n%c", rd->dump_file, 
                    istr, bi->mev);

            if(len < 0) {
                rs_log_error(RS_LOG_ERR, rs_errno, "snprintf() failed");
                return RS_ERR;
            }
        } else {

            if(bi->log_format == RS_BINLOG_FORMAT_ROW_BASED) {

                /* RBR */
                len += bi->el - RS_BINLOG_EVENT_HEADER_LEN 
                    + rs_strlen(bi->tb) + 3 + rs_strlen(bi->db) + 4 + 
                    bi->cn + 4 + bi->ml;

                rbd->len = len;
                rbd->id = rs_palloc_id(rd->pool, len);
                rbd->data = rs_palloc(rd->pool, len, rbd->id);

                if(rbd->data == NULL) {
                    return RS_ERR;
                }

                len = snprintf(rbd->data, rbd->len, 
                        "%s,%u\n%c,%s.%s%c", 
                        rd->dump_file, rd->dump_pos, bi->mev, bi->db, 
                        bi->tb, 0);

                if(len < 0) {
                    rs_log_error(RS_LOG_ERR, rs_errno, "snprintf() failed");
                    return RS_ERR;
                }

                p = (char *) rbd->data + len;
                p = rs_cpymem(p, &(bi->cn), 4);
                p = rs_cpymem(p, bi->ct, bi->cn);
                p = rs_cpymem(p, &(bi->ml), 4);
                p = rs_cpymem(p, bi->cm, bi->ml);

                rs_memcpy(p, bi->data, rbd->len - len - 8 - bi->cn - 
                        bi->ml);
            }
        }

        rs_ringbuf_set_advance(rd->ringbuf);
        break;

    } // EXIT RING BUFFER 

    bi->flush = 0;
    bi->mev = 0;
    bi->sent = 1;

    return RS_OK;
}
Ejemplo n.º 3
0
/*
 *   rs_register_slave
 *   @s struct rs_slave_info_t
 *
 *   Connect to master, register a slave
 *
 *   No return value
 */
void *rs_start_io_thread(void *data)
{
    int                     r;
    int32_t                 pack_len;
    struct                  sockaddr_in svr_addr;
    rs_slave_info_t         *si;
    rs_ringbuf_data_t       *rbd;

    rs_memzero(&svr_addr, sizeof(svr_addr));
    si = (rs_slave_info_t *) data;

    /* push cleanup handle */
    pthread_cleanup_push(rs_free_io_thread, si);

    /* connect to master */
    svr_addr.sin_family = AF_INET;
    svr_addr.sin_port = htons(si->listen_port);

    if (inet_pton(AF_INET, si->listen_addr, &(svr_addr.sin_addr)) != 1) {
        rs_log_error(RS_LOG_ERR, rs_errno, "inet_pton(\"%s\") failed",
                     si->listen_addr);
        goto free;
    }

    for( ;; ) {

        si->svr_fd = socket(AF_INET, SOCK_STREAM, 0);

        if(si->svr_fd == -1) {
            rs_log_error(RS_LOG_ERR, rs_errno, "socket() failed");
            goto free;
        }

        if(connect(si->svr_fd, (const struct sockaddr *) &svr_addr,
                   sizeof(svr_addr)) == -1)
        {
            goto retry;
        }

        if(rs_send_dumpcmd(si) != RS_OK) {
            goto retry;
        }

        /* add to ring buffer */
        for( ;; ) {

            r = rs_ringbuf_set(si->ringbuf, &rbd);

            if(r == RS_FULL) {
                sleep(RS_RING_BUFFER_FULL_SLEEP_SEC);
                continue;
            }

            /* free slab chunk */
            if(rbd->data != NULL) {
                rs_pfree(si->pool, rbd->data, rbd->id);
            }


            if(rs_recv_tmpbuf(si->recv_buf, si->svr_fd, &pack_len, 4) != RS_OK)
            {
                goto retry;
            }

            /* alloc memory */
            rbd->len = pack_len;
            rbd->id = rs_palloc_id(si->pool, pack_len);
            rbd->data = rs_palloc(si->pool, pack_len, rbd->id);

            if(rbd->data == NULL) {
                goto free;
            }

            if(rs_recv_tmpbuf(si->recv_buf, si->svr_fd, rbd->data, rbd->len)
                    != RS_OK)
            {
                goto retry;
            }

            rs_ringbuf_set_advance(si->ringbuf);
        }

retry:
        /* close svr_fd retry connect */
        if(close(si->svr_fd) != 0) {
            rs_log_error(RS_LOG_ERR, 0, "close failed()");
        }
        si->svr_fd = -1;
        rs_log_error(RS_LOG_ERR, 0, "retry connect to master");
        sleep(RS_RETRY_CONNECT_SLEEP_SEC);
    }

free:
    ;

    pthread_cleanup_pop(1);
    pthread_exit(NULL);
}