Update disk cache usage tracking to handle sparse files.
[bluesky.git] / bluesky / debug.c
index 43b29be..7de5095 100644 (file)
@@ -51,10 +51,51 @@ static void cloudlog_dump(gpointer key, gpointer value, gpointer user_data)
             log->location.sequence, log->location.offset);
 }
 
+static void cache_dump(gpointer key, gpointer value, gpointer user_data)
+{
+    BlueSkyCacheFile *cache = (BlueSkyCacheFile *)value;
+
+    int64_t age = bluesky_get_current_time() - cache->atime;
+    g_print("%s addr=%p mapcount=%d refcount=%d atime_age=%f",
+            cache->filename, cache->addr, cache->mapcount, cache->refcount,
+            age / 1e6);
+    if (cache->fetching)
+        g_print(" (fetching)");
+    g_print("\n");
+}
+
+
+void inode_map_dump(GSequence *inode_map)
+{
+    GSequenceIter *i, *j;
+
+    g_print("\nInode map dump:\n");
+    for (i = g_sequence_get_begin_iter(inode_map);
+         !g_sequence_iter_is_end(i); i = g_sequence_iter_next(i))
+    {
+        InodeMapRange *range = (InodeMapRange *)g_sequence_get(i);
+
+        g_print("  Range [%"PRIu64", %"PRIu64"]\n", range->start, range->end);
+
+        for (j = g_sequence_get_begin_iter(range->map_entries);
+             !g_sequence_iter_is_end(j); j = g_sequence_iter_next(j))
+        {
+            InodeMapEntry *entry = (InodeMapEntry *)g_sequence_get(j);
+            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);
+            }
+        }
+    }
+}
 /* Dump a summary of filesystem state as it is cached in memory. */
 void bluesky_debug_dump(BlueSkyFS *fs)
 {
-    g_print("*** DEBUG DUMP FOR FILESYSTEM %s ***\n", fs->name);
+    g_print("\n*** DEBUG DUMP FOR FILESYSTEM %s ***\n", fs->name);
     g_print("Dirty blocks: %d\n", g_atomic_int_get(&fs->cache_dirty));
     g_print("Cached inodes: %u\tNext inode: %"PRIu64"\n",
             g_hash_table_size(fs->inodes), fs->next_inum);
@@ -85,7 +126,14 @@ void bluesky_debug_dump(BlueSkyFS *fs)
 
     g_print("\nLog Objects:\n");
     g_hash_table_foreach(fs->locations, cloudlog_dump, fs);
+
+    g_print("\nJournal/Cache Files:\n");
+    g_hash_table_foreach(fs->log->mmap_cache, cache_dump, fs);
     g_print("\n");
+
+    g_mutex_lock(fs->lock);
+    inode_map_dump(fs->inode_map);
+    g_mutex_unlock(fs->lock);
 }
 
 /* Statistics counters: for operation counts, bytes transferred, etc. */