More cache behavior tweaks.
authorMichael Vrable <mvrable@cs.ucsd.edu>
Tue, 3 Aug 2010 05:05:28 +0000 (22:05 -0700)
committerMichael Vrable <mvrable@cs.ucsd.edu>
Tue, 3 Aug 2010 05:05:28 +0000 (22:05 -0700)
bluesky/bluesky.h
bluesky/cache.c
bluesky/cloudlog.c
bluesky/debug.c
bluesky/inode.c

index 205da74..482c39a 100644 (file)
@@ -230,9 +230,6 @@ typedef struct {
     /* Last access time to this inode, for controlling cache evictions. */
     int64_t access_time;
 
-    /* Additional state for tracking cache writeback status. */
-    uint64_t change_pending;    /* change_count version currently being committed to storage */
-
     /* Version of the object last serialized and committed to storage. */
     BlueSkyCloudLog *committed_item;
 
index cdbc7c2..58b7cd6 100644 (file)
@@ -62,23 +62,10 @@ static void flushd_dirty_inode(BlueSkyInode *inode)
     if (inode->change_count == inode->change_commit)
         return;
 
-    /* Inode writeback is in progress; put back on the dirty list. */
-    if (inode->change_pending) {
-        /* Waiting for an earlier writeback to finish, so don't start a new
-         * writeback yet. */
-        g_mutex_lock(fs->lock);
-        inode->change_time = bluesky_get_current_time();
-        bluesky_list_unlink(&fs->dirty_list, inode->dirty_list);
-        inode->dirty_list = bluesky_list_prepend(&fs->dirty_list, inode);
-        g_mutex_unlock(fs->lock);
-        return;
-    }
-
     if (bluesky_verbose) {
         g_log("bluesky/flushd", G_LOG_LEVEL_DEBUG,
             "Starting flush of inode %"PRIu64, inode->inum);
     }
-    inode->change_pending = inode->change_count;
 
     bluesky_inode_start_sync(inode);
 }
@@ -133,7 +120,7 @@ static void drop_caches(BlueSkyInode *inode)
         bluesky_file_drop_cached(inode);
 }
 
-/* Drop clean data fromt the cache if needed due to memory pressure. */
+/* Drop clean data from the cache if needed due to memory pressure. */
 static void flushd_clean(BlueSkyFS *fs)
 {
     g_mutex_lock(fs->lock);
@@ -143,8 +130,10 @@ static void flushd_clean(BlueSkyFS *fs)
         inode_count = 1;
 
     while (inode_count-- > 0) {
+#if 0
         if (g_atomic_int_get(&fs->cache_total) < bluesky_watermark_medium_total)
             break;
+#endif
 
         BlueSkyInode *inode;
         if (fs->accessed_list.prev == NULL)
index 60f4594..c99d181 100644 (file)
@@ -206,8 +206,6 @@ static void find_inodes(gpointer key, gpointer value, gpointer user_data)
 
 void bluesky_cloudlog_write_log(BlueSkyFS *fs)
 {
-    g_print("Starting cloudlog write...\n");
-
     BlueSkyCloudLogState *state = fs->log_state;
     if (state->data == NULL)
         state->data = g_string_new("");
@@ -224,7 +222,7 @@ void bluesky_cloudlog_write_log(BlueSkyFS *fs)
     }
 
     if (state->data->len > 0) {
-        g_print("Serialized %zd bytes of data\n", state->data->len);
+        g_print("Serialized %zd bytes of data to cloud\n", state->data->len);
 
         BlueSkyStoreAsync *async = bluesky_store_async_new(fs->store);
         async->op = STORE_OP_PUT;
index 2b32c9c..1df8382 100644 (file)
@@ -31,8 +31,9 @@ static void inode_dump(gpointer key, gpointer value, gpointer user_data)
             locked ? 'T' : 'F', inode->refcount);
 
     g_print("    Type: %d   Mode: %o\n", inode->type, inode->mode);
-    g_print("    change_count = %"PRIu64", change_commit = %"PRIu64"\n",
-            inode->change_count, inode->change_commit);
+    g_print("    change_count = %"PRIu64", change_commit = %"PRIu64", "
+            "change_cloud = %"PRIu64"\n",
+            inode->change_count, inode->change_commit, inode->change_cloud);
 }
 
 static void cloudlog_dump(gpointer key, gpointer value, gpointer user_data)
index 9d72f4d..6e9c0c8 100644 (file)
@@ -332,6 +332,14 @@ void bluesky_inode_start_sync(BlueSkyInode *inode)
 
     /* Wait for all log items to be committed to disk. */
     bluesky_log_finish_all(log_items);
+
+    /* Mark the inode as clean */
+    inode->change_commit = inode->change_count;
+    inode->change_time = 0;
+    g_mutex_lock(inode->fs->lock);
+    bluesky_list_unlink(&inode->fs->dirty_list, inode->dirty_list);
+    inode->dirty_list = NULL;
+    g_mutex_unlock(inode->fs->lock);
 }
 
 /* Write back an inode and all associated data and wait for completion.  Inode