//注意走到这里是通过epoll触发走到这里面的 可以通过客户端telnet 127.0.0.1 22222来获取 static rstatus_t stats_send_rsp(struct stats *st) { rstatus_t status; ssize_t n; int sd; status = stats_make_rsp(st); if (status != NC_OK) { return status; } sd = accept(st->sd, NULL, NULL); if (sd < 0) { log_error("accept on m %d failed: %s", st->sd, strerror(errno)); return NC_ERROR; } log_debug(LOG_VERB, "send stats on sd %d %d bytes", sd, st->buf.len); n = nc_sendn(sd, st->buf.data, st->buf.len); if (n < 0) { log_error("send stats on sd %d failed: %s", sd, strerror(errno)); close(sd); return NC_ERROR; } close(sd); return NC_OK; }
static rstatus_t stats_send_rsp(struct stats *st) { rstatus_t status; int sd; //TODO: move this to an appropriate place that need it. status = stats_make_rsp(st); if (status != DN_OK) { return status; } sd = accept(st->sd, NULL, NULL); if (sd < 0) { log_error("accept on m %d failed: %s", st->sd, strerror(errno)); return DN_ERROR; } struct stats_cmd st_cmd; parse_request(sd, &st_cmd); stats_cmd_t cmd = st_cmd.cmd; log_debug(LOG_VERB, "cmd %d", cmd); if (cmd == CMD_INFO) { log_debug(LOG_VERB, "send stats on sd %d %d bytes", sd, st->buf.len); return stats_http_rsp(sd, st->buf.data, st->buf.len); } else if (cmd == CMD_NORMAL) { st->ctx->dyn_state = NORMAL; return stats_http_rsp(sd, ok.data, ok.len); } else if (cmd == CMD_STANDBY) { st->ctx->dyn_state = STANDBY; return stats_http_rsp(sd, ok.data, ok.len); } else if (cmd == CMD_WRITES_ONLY) { st->ctx->dyn_state = WRITES_ONLY; return stats_http_rsp(sd, ok.data, ok.len); } else if (cmd == CMD_RESUMING) { st->ctx->dyn_state = RESUMING; return stats_http_rsp(sd, ok.data, ok.len); } else if (cmd == CMD_PEER_DOWN || cmd == CMD_PEER_UP || cmd == CMD_PEER_RESET) { log_debug(LOG_VERB, "st_cmd.req_data '%.*s' ", st_cmd.req_data); struct server_pool *sp = array_get(&st->ctx->pool, 0); int i, len; //I think it is ok to keep this simple without a synchronization for (i = 0, len = array_n(&sp->peers); i < len; i++) { struct server *peer = array_get(&sp->peers, i); log_debug(LOG_VERB, "peer '%.*s' ", peer->name); if (string_compare(&st_cmd.req_data, &all) == 0) { log_debug(LOG_VERB, "\t\tSetting peer '%.*s' to state %d due to RESET/ALL command", st_cmd.req_data, cmd); peer->state = RESET; } else if (string_compare(&peer->name, &st_cmd.req_data) == 0) { log_debug(LOG_VERB, "\t\tSetting peer '%.*s' to state %d due to RESET command", st_cmd.req_data, cmd); switch (cmd) { case CMD_PEER_UP: peer->state = NORMAL; break; case CMD_PEER_RESET: peer->state = RESET; break; case CMD_PEER_DOWN: peer->state = DOWN; break; default: peer->state = NORMAL; } break; } } string_deinit(&st_cmd.req_data); } else { log_debug(LOG_VERB, "Unsupported cmd"); } stats_http_rsp(sd, ok.data, ok.len); close(sd); return DN_OK; }
static rstatus_t stats_send_rsp(struct stats *st) { rstatus_t status; ssize_t n; //int sd; //int fd; status = stats_make_rsp(st); if (status != NC_OK) { return status; } /* sd = accept(st->sd, NULL, NULL); if (sd < 0) { log_error("accept on m %d failed: %s", st->sd, strerror(errno)); return NC_ERROR; } log_debug(LOG_VERB, "send stats on sd %d %d bytes", sd, st->buf.len); n = nc_sendn(sd, st->buf.data, st->buf.len); if (n < 0) { log_error("send stats on sd %d failed: %s", sd, strerror(errno)); close(sd); return NC_ERROR; } close(sd); */ nc_channel_msg_t message; memset(&message, 0, sizeof(nc_channel_msg_t)); message.command = NC_CMD_GET_STATS; message.len = st->buf.len; nc_write_channel(nc_worker_channel, &message, sizeof(nc_channel_msg_t)); n = nc_sendn(nc_worker_channel, st->buf.data, st->buf.len); if (n < 0) { log_error("nc_sendn %d failed: %s", nc_worker_channel, strerror(errno)); return NC_ERROR; } stats_swap(st); /* int fd = get_logger_fd(); if (fd < 0) { return; } n = nc_write(fd, st->buf.data, st->buf.len); if (n < 0) { log_error("nc_write %d failed: %s", fd, strerror(errno)); return NC_ERROR; } */ return NC_OK; }