Cleaner fix part 1
[bluesky.git] / bluesky / inode.c
index dd20cc9..42ae708 100644 (file)
@@ -96,6 +96,8 @@ BlueSkyFS *bluesky_new_fs(gchar *name)
     fs->log_state = g_new0(BlueSkyCloudLogState, 1);
     fs->log_state->data = g_string_new("");
     fs->log_state->latest_cleaner_seq_seen = -1;
+    fs->log_state->uploads_pending_lock = g_mutex_new();
+    fs->log_state->uploads_pending_cond = g_cond_new();
 
     bluesky_cloudlog_threads_init(fs);
     fs->inode_fetch_thread_pool = g_thread_pool_new(inode_fetch_task, NULL,
@@ -132,7 +134,7 @@ BlueSkyFS *bluesky_init_fs(gchar *name, BlueSkyStore *store,
         bluesky_inode_do_sync(root);
     }
 
-    bluesky_cleaner_merge(fs);
+    bluesky_cleaner_thread_launch(fs);
 
     return fs;
 }
@@ -268,6 +270,30 @@ BlueSkyInode *bluesky_new_inode(uint64_t inum, BlueSkyFS *fs,
     return i;
 }
 
+/* Issue a prefetch hint for an inode.  This signals that the inode may be
+ * needed soon.  Does not return any useful data. */
+void bluesky_inode_prefetch(BlueSkyFS *fs, uint64_t inum)
+{
+    BlueSkyInode *inode = NULL;
+
+    g_mutex_lock(fs->lock);
+    inode = (BlueSkyInode *)g_hash_table_lookup(fs->inodes, &inum);
+
+    if (inode != NULL) {
+        /* Inode is already available, no need for any prefetching... */
+        g_mutex_unlock(fs->lock);
+        return;
+    }
+
+    InodeMapEntry *entry = bluesky_inode_map_lookup(fs->inode_map, inum, 0);
+    if (entry != NULL) {
+        bluesky_cloudlog_prefetch(entry->item);
+    }
+
+    g_mutex_unlock(fs->lock);
+    return;
+}
+
 /* Retrieve an inode from the filesystem.  Eventually this will be a cache and
  * so we might need to go fetch the inode from elsewhere; for now all
  * filesystem state is stored here.  inode is returned with a reference held