Fix for S3 list operation.
[bluesky.git] / bluesky / cache.c
index a9fda5b..c27d39d 100644 (file)
@@ -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);