X-Git-Url: https://git.sesse.net/?p=cubemap;a=blobdiff_plain;f=stats.cpp;h=8e4443cf14d4f2ce478c702a1bbb0127fa8f461b;hp=49106eed04fbcf7fffc0e2a8f5c8b6de79e1c081;hb=5cd46e39b4063d94f6dc559ae350beeb8406a8f9;hpb=488f28bf7070f44469a006ed4a9d4c423788d175 diff --git a/stats.cpp b/stats.cpp index 49106ee..8e4443c 100644 --- a/stats.cpp +++ b/stats.cpp @@ -1,4 +1,6 @@ +#include #include +#include #include #include #include @@ -8,6 +10,7 @@ #include #include "client.h" +#include "log.h" #include "serverpool.h" #include "stats.h" @@ -33,14 +36,14 @@ void StatsThread::do_work() char *filename = strdup((stats_file + ".new.XXXXXX").c_str()); fd = mkostemp(filename, O_WRONLY); if (fd == -1) { - perror(filename); + log_perror(filename); free(filename); goto sleep; } fp = fdopen(fd, "w"); if (fp == NULL) { - perror("fdopen"); + log_perror("fdopen"); close(fd); unlink(filename); free(filename); @@ -50,28 +53,49 @@ void StatsThread::do_work() now = time(NULL); client_stats = servers->get_client_stats(); for (size_t i = 0; i < client_stats.size(); ++i) { - fprintf(fp, "%s %s %d %llu\n", + fprintf(fp, "%s %d %d %s %d %llu %llu %llu\n", client_stats[i].remote_addr.c_str(), + client_stats[i].sock, + client_stats[i].fwmark, client_stats[i].stream_id.c_str(), int(now - client_stats[i].connect_time), - (long long unsigned)(client_stats[i].bytes_sent)); + (long long unsigned)(client_stats[i].bytes_sent), + (long long unsigned)(client_stats[i].bytes_lost), + (long long unsigned)(client_stats[i].num_loss_events)); } if (fclose(fp) == EOF) { - perror("fclose"); + log_perror("fclose"); unlink(filename); free(filename); goto sleep; } if (rename(filename, stats_file.c_str()) == -1) { - perror("rename"); + log_perror("rename"); unlink(filename); } + free(filename); sleep: - int left_to_sleep = stats_interval; - do { - left_to_sleep = sleep(left_to_sleep); - } while (left_to_sleep > 0 && !should_stop); + // Wait until the stop_fd pipe is closed, stats_interval timeout, + // or a spurious signal. (The latter will cause us to write stats + // too often, but that's okay.) + pollfd pfd; + pfd.fd = stop_fd_read; + pfd.events = POLLIN | POLLRDHUP; + + int nfds = poll(&pfd, 1, stats_interval * 1000); + if (nfds == 0 || (nfds == -1 && errno == EINTR)) { + continue; + } + if (nfds == 1) { + // Should stop. + break; + } + if (nfds == -1) { + log_perror("poll"); + usleep(100000); + continue; + } } }