Do not hold references to all inode data in inode map.
[bluesky.git] / bluesky / cache.c
index c27d39d..3afceca 100644 (file)
@@ -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,6 +189,7 @@ 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);