X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=bluesky%2Fcache.c;h=c27d39dbdcd8dfc9c73f3ac9c7ac6caa8b5ab931;hb=6955b27db8185d222adb07e57d207f7f421037e6;hp=a9fda5b8a08a48b46c6a3935b9d599e5950e099a;hpb=774148ec71a99b6acf1023fd990ea975a6b92780;p=bluesky.git diff --git a/bluesky/cache.c b/bluesky/cache.c index a9fda5b..c27d39d 100644 --- a/bluesky/cache.c +++ b/bluesky/cache.c @@ -114,6 +114,7 @@ static void flushd_cloud(BlueSkyFS *fs) /* 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) { @@ -132,14 +133,14 @@ static void flushd_cloud(BlueSkyFS *fs) g_mutex_unlock(fs->lock); g_mutex_lock(inode->lock); - flushd_dirty_inode(inode); + g_assert(inode->change_cloud == inode->change_commit); g_mutex_lock(fs->lock); bluesky_list_unlink(&fs->dirty_list, inode->dirty_list); inode->dirty_list = NULL; g_mutex_unlock(fs->lock); BlueSkyCloudLog *log = inode->committed_item; - bluesky_cloudlog_ref(log); + inode->committed_item = NULL; g_mutex_unlock(inode->lock); if (log != NULL) @@ -150,6 +151,11 @@ static void flushd_cloud(BlueSkyFS *fs) g_mutex_lock(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); + g_mutex_unlock(fs->lock); bluesky_cloudlog_flush(fs); @@ -172,6 +178,8 @@ static void flushd_cloud(BlueSkyFS *fs) fs->log_state->pending_segments); } + bluesky_log_write_commit_point(fs, marker); + g_print("All segments have been flushed, journal < %d is clean\n", journal_seq_start);