X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=bluesky%2Fcache.c;h=d1c5c84c6725e5b6ac2a2cc8f323e386c777b336;hb=7daddca3715fee8a3bfff417e769ff08dd7f4cbf;hp=c27d39dbdcd8dfc9c73f3ac9c7ac6caa8b5ab931;hpb=0a021d1c28cff9cbaa4c127a837816f96dd37a27;p=bluesky.git diff --git a/bluesky/cache.c b/bluesky/cache.c index c27d39d..d1c5c84 100644 --- a/bluesky/cache.c +++ b/bluesky/cache.c @@ -107,7 +107,13 @@ static void flushd_dirty(BlueSkyFS *fs) * cloud. When the write completes, we will allow old journal segments (those * that were fully written _before_ the snapshot process started) to be garbage * collected. Newer journal segments can't be collected yet since they may - * still contain data which has not been written persistently to the cloud. */ + * still contain data which has not been written persistently to the cloud. + * + * Note that some of this code relies on the fact that only this thread of + * control (running flushd_cloud) is manipulating the inode map, and so + * concurrent updates to the inode map are prevented even without the + * filesystem lock held. Take great care if allowing multi-threaded access to + * the inode map... */ static void flushd_cloud(BlueSkyFS *fs) { g_mutex_lock(fs->lock); @@ -150,13 +156,17 @@ static void flushd_cloud(BlueSkyFS *fs) g_mutex_lock(fs->lock); } + g_mutex_unlock(fs->lock); /* Write out any updated inode map entries, so that all inodes just written * can be located, and then a final commit record. */ BlueSkyCloudLog *commit_record = bluesky_inode_map_serialize(fs); - bluesky_cloudlog_serialize(commit_record, fs); + if (commit_record != NULL) { + bluesky_cloudlog_serialize(commit_record, fs); + } else { + g_print("No need for a checkpoint record...\n"); + } - g_mutex_unlock(fs->lock); bluesky_cloudlog_flush(fs); /* Wait until all segments have been written to the cloud, so that it @@ -179,11 +189,14 @@ static void flushd_cloud(BlueSkyFS *fs) } bluesky_log_write_commit_point(fs, marker); + bluesky_cloudlog_unref(commit_record); g_print("All segments have been flushed, journal < %d is clean\n", journal_seq_start); fs->log->journal_watermark = journal_seq_start; + + bluesky_inode_map_minimize(fs); } /* Drop cached data for a given inode, if it is clean. inode must be locked. */