//注意走到这里是通过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;
}
示例#2
0
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;
}
示例#3
0
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;
}