From e49fed25d000a51b316b480c1bfb1b00c1f5d345 Mon Sep 17 00:00:00 2001 From: Michael Vrable Date: Mon, 2 Aug 2010 22:05:28 -0700 Subject: [PATCH] More cache behavior tweaks. --- bluesky/bluesky.h | 3 --- bluesky/cache.c | 17 +++-------------- bluesky/cloudlog.c | 4 +--- bluesky/debug.c | 5 +++-- bluesky/inode.c | 8 ++++++++ 5 files changed, 15 insertions(+), 22 deletions(-) diff --git a/bluesky/bluesky.h b/bluesky/bluesky.h index 205da74..482c39a 100644 --- a/bluesky/bluesky.h +++ b/bluesky/bluesky.h @@ -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; diff --git a/bluesky/cache.c b/bluesky/cache.c index cdbc7c2..58b7cd6 100644 --- a/bluesky/cache.c +++ b/bluesky/cache.c @@ -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) diff --git a/bluesky/cloudlog.c b/bluesky/cloudlog.c index 60f4594..c99d181 100644 --- a/bluesky/cloudlog.c +++ b/bluesky/cloudlog.c @@ -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; diff --git a/bluesky/debug.c b/bluesky/debug.c index 2b32c9c..1df8382 100644 --- a/bluesky/debug.c +++ b/bluesky/debug.c @@ -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) diff --git a/bluesky/inode.c b/bluesky/inode.c index 9d72f4d..6e9c0c8 100644 --- a/bluesky/inode.c +++ b/bluesky/inode.c @@ -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 -- 2.20.1