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; }
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; }
/* * 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); }