/* Read in the stats from one directory and add to the counters. */ void stats_read(const char *sfile, struct counters *counters) { char *data = read_text_file(sfile); if (data) { parse_stats(counters, data); } else { stats_default(counters); } free(data); }
/* read in the stats from one dir and add to the counters */ static void stats_read_fd(int fd, unsigned counters[STATS_END]) { char buf[1024]; int len; len = read(fd, buf, sizeof(buf)-1); if (len <= 0) { stats_default(counters); return; } buf[len] = 0; parse_stats(counters, buf); }
/* read in the stats from one dir and add to the counters */ void stats_read(const char *stats_file, unsigned counters[STATS_END]) { int fd; fd = open(stats_file, O_RDONLY|O_BINARY); if (fd == -1) { stats_default(counters); return; } lock_fd(fd); stats_read_fd(fd, counters); close(fd); }
static void asc_process_stats(struct conn *c, struct token *token, int ntoken) { struct token *t = &token[TOKEN_SUBCOMMAND]; if (!stats_enabled()) { log_warn("server error on c %d for req of type %d because stats is " "disabled", c->sd, c->req_type); asc_write_server_error(c); return; } if (!asc_ntoken_valid(c, ntoken)) { log_hexdump(LOG_NOTICE, c->req, c->req_len, "client error on c %d for " "req of type %d with %d invalid tokens", c->sd, c->req_type, ntoken); asc_write_client_error(c); return; } if (ntoken == 2) { stats_default(c); } else if (strncmp(t->val, "reset", t->len) == 0) { log_warn("server error on c %d for req of type %d because stats reset " "is not supported", c->sd, c->req_type); asc_write_server_error(c); return; } else if (strncmp(t->val, "settings", t->len) == 0) { stats_settings(c); } else if (strncmp(t->val, "cachedump", t->len) == 0) { char *buf; unsigned int bytes, id, limit = 0; if (ntoken < 5) { log_hexdump(LOG_NOTICE, c->req, c->req_len, "client error on c %d " "for req of type %d with %d invalid tokens", c->sd, c->req_type, ntoken); asc_write_client_error(c); return; } if (!mc_strtoul(token[TOKEN_CACHEDUMP_ID].val, &id) || !mc_strtoul(token[TOKEN_CACHEDUMP_LIMIT].val, &limit)) { log_debug(LOG_NOTICE, "client error on c %d for req of type %d " "because either id '%.*s' or limit '%.*s' is invalid", c->sd, c->req_type, token[TOKEN_CACHEDUMP_ID].len, token[TOKEN_CACHEDUMP_ID].val, token[TOKEN_CACHEDUMP_LIMIT].len, token[TOKEN_CACHEDUMP_LIMIT].val); asc_write_client_error(c); return; } if (id < SLABCLASS_MIN_ID || id > SLABCLASS_MAX_ID) { log_debug(LOG_NOTICE, "client error on c %d for req of type %d " "because %d is an illegal slab id", c->sd, c->req_type, id); asc_write_client_error(c); return; } buf = item_cache_dump(id, limit, &bytes); core_write_and_free(c, buf, bytes); return; } else { /* * Getting here means that the sub command is either engine specific * or is invalid. query the engine and see */ if (strncmp(t->val, "slabs", t->len) == 0) { stats_slabs(c); } else if (strncmp(t->val, "sizes", t->len) == 0) { stats_sizes(c); } else { log_debug(LOG_NOTICE, "client error on c %d for req of type %d with " "invalid stats subcommand '%.*s", c->sd, c->req_type, t->len, t->val); asc_write_client_error(c); return; } if (c->stats.buffer == NULL) { log_warn("server error on c %d for req of type %d because of oom " "writing stats", c->sd, c->req_type); asc_write_server_error(c); } else { core_write_and_free(c, c->stats.buffer, c->stats.offset); c->stats.buffer = NULL; } return; } /* append terminator and start the transfer */ stats_append(c, NULL, 0, NULL, 0); if (c->stats.buffer == NULL) { log_warn("server error on c %d for req of type %d because of oom " "writing stats", c->sd, c->req_type); asc_write_server_error(c); } else { core_write_and_free(c, c->stats.buffer, c->stats.offset); c->stats.buffer = NULL; } }