X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=bluesky%2Fdebug.c;h=5523b1ca4ccbe44f0f180b989512c0dbd812f00c;hb=8ff0fd08d6e1cc97cdb7e94b7cd97dc28c29e674;hp=ee6e0c5947602b64855be9810ee99896bcf31160;hpb=0f7a0642cd1b9d98af851b9cf2ed14c9a83ddfc2;p=bluesky.git diff --git a/bluesky/debug.c b/bluesky/debug.c index ee6e0c5..5523b1c 100644 --- a/bluesky/debug.c +++ b/bluesky/debug.c @@ -3,7 +3,29 @@ * Copyright (C) 2009 The Regents of the University of California * Written by Michael Vrable * - * TODO: Licensing + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. */ #include @@ -81,9 +103,14 @@ void inode_map_dump(GSequence *inode_map) !g_sequence_iter_is_end(j); j = g_sequence_iter_next(j)) { InodeMapEntry *entry = (InodeMapEntry *)g_sequence_get(j); - char *id = bluesky_cloudlog_id_to_string(entry->id); - g_print(" Entry %"PRIu64" id=%s\n", entry->inum, id); - g_free(id); + BlueSkyCloudLog *item = entry->item; + if (item != NULL) { + char *id = bluesky_cloudlog_id_to_string(item->id); + g_print(" Entry %"PRIu64" id=%s\n", entry->inum, id); + g_free(id); + } else { + g_print(" Entry %"PRIu64" not available\n", entry->inum); + } } } } @@ -161,3 +188,48 @@ void bluesky_stats_dump_all() } g_static_mutex_unlock(&stats_lock); } + +static void periodic_stats_dumper(FILE *f) +{ + const int64_t interval = 10 * 1000000000ULL; + bluesky_time_hires timestamp = bluesky_now_hires(); + bluesky_time_hires next_timestamp = timestamp; + + while (TRUE) { + g_static_mutex_lock(&stats_lock); + timestamp = bluesky_now_hires(); + fprintf(f, "********\ntime=%f\n\n", timestamp / 1e9); + for (GList *item = stats_list; item != NULL; item = item->next) { + struct bluesky_stats *stats = (struct bluesky_stats *)item->data; + fprintf(f, "%s: count=%"PRIi64" sum=%"PRIi64"\n", + stats->name, stats->count, stats->sum); + } + g_static_mutex_unlock(&stats_lock); + fflush(f); + + /* Wait until ten seconds from the last timestamp, with a few extra + * checks for sanity (always try to wait some amount of time in the + * range [0, 20] seconds). */ + timestamp = bluesky_now_hires(); + next_timestamp += interval; + if (next_timestamp < timestamp) { + next_timestamp = timestamp; + continue; + } + if (next_timestamp - timestamp > 2 * interval) { + next_timestamp = timestamp + interval; + } + + struct timespec delay; + delay.tv_sec = (next_timestamp - timestamp) / 1000000000; + delay.tv_nsec = (next_timestamp - timestamp) % 1000000000; + nanosleep(&delay, NULL); + } +} + +/* Start a background thread that will periodically dump statistics counters to + * he specified file every ten seconds. */ +void bluesky_stats_run_periodic_dump(FILE *f) +{ + g_thread_create((GThreadFunc)periodic_stats_dumper, f, FALSE, NULL); +}