X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=bluesky%2Fcache.c;h=d1c5c84c6725e5b6ac2a2cc8f323e386c777b336;hb=7daddca3715fee8a3bfff417e769ff08dd7f4cbf;hp=454e06f3e962e9f4a6bfec8d27223aab02c402c8;hpb=2b3dd7b15178288761500a6896376b4d44d3bfae;p=bluesky.git diff --git a/bluesky/cache.c b/bluesky/cache.c index 454e06f..d1c5c84 100644 --- a/bluesky/cache.c +++ b/bluesky/cache.c @@ -107,13 +107,20 @@ 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); /* TODO: Locking? Since we're reading a single variable this is probably * atomic but a lock could be safer. */ + BlueSkyCloudLog *marker = bluesky_log_get_commit_point(fs); int journal_seq_start = fs->log->seq_num; while (1) { @@ -149,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 @@ -177,10 +188,15 @@ static void flushd_cloud(BlueSkyFS *fs) fs->log_state->pending_segments); } + 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. */