X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=bluesky%2Finode.c;h=fe68328e510671a53ac99c9b01e70b2849698153;hb=de73632892d6bd009b290426253bdbe41d8844f7;hp=0d40da47dd84ffcc50f5b1ab9f1b564ec82cfd75;hpb=37739cc6f4a38ef6241abfea42693fa046f80d1b;p=bluesky.git diff --git a/bluesky/inode.c b/bluesky/inode.c index 0d40da4..fe68328 100644 --- a/bluesky/inode.c +++ b/bluesky/inode.c @@ -14,6 +14,8 @@ #include "bluesky-private.h" +static void inode_fetch_task(gpointer a, gpointer b); + /* Core filesystem. Different proxies, such as the NFSv3 one, interface to * this, but the core actually tracks the data which is stored. So far we just * implement an in-memory filesystem, but eventually this will be state which @@ -93,15 +95,25 @@ 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, + bluesky_max_threads, + FALSE, NULL); return fs; } -BlueSkyFS *bluesky_init_fs(gchar *name, BlueSkyStore *store) +BlueSkyFS *bluesky_init_fs(gchar *name, BlueSkyStore *store, + const gchar *master_key) { BlueSkyFS *fs = bluesky_new_fs(name); + fs->master_key = g_strdup(master_key); + fs->keys = g_new(BlueSkyCryptKeys, 1); + bluesky_crypt_derive_keys(fs->keys, master_key); fs->store = store; fs->log = bluesky_log_new("journal"); fs->log->fs = fs; @@ -122,6 +134,8 @@ BlueSkyFS *bluesky_init_fs(gchar *name, BlueSkyStore *store) bluesky_inode_do_sync(root); } + bluesky_cleaner_thread_launch(fs); + return fs; } @@ -346,8 +360,12 @@ void bluesky_inode_do_sync(BlueSkyInode *inode) } } -static void complete_inode_fetch(BlueSkyInode *inode) +static void inode_fetch_task(gpointer a, gpointer b) { + BlueSkyInode *inode = (BlueSkyInode *)a; + + bluesky_profile_set((BlueSkyProfile *)inode->private_data); + BlueSkyCloudLog *item = inode->committed_item; inode->committed_item = NULL; g_print("Completing fetch of inode %"PRIu64"...\n", inode->inum); @@ -380,15 +398,19 @@ void bluesky_inode_fetch(BlueSkyFS *fs, uint64_t inum) if (entry == NULL) return; + /* Non-portable behavior: We take the inode lock here, and release it in + * the fetching thread. This works with the default Linux pthreads + * implementation but is not guaranteed. */ + BlueSkyInode *inode = bluesky_new_inode(inum, fs, BLUESKY_PENDING); inode->change_count = 0; bluesky_inode_ref(inode); // Extra ref held by fetching process g_mutex_lock(inode->lock); - bluesky_insert_inode(fs, inode); + inode->committed_item = entry->item; bluesky_cloudlog_ref(entry->item); + bluesky_insert_inode(fs, inode); - /* TODO: Thread pool or other better async method. */ - g_thread_create((GThreadFunc)complete_inode_fetch, - (gpointer)inode, FALSE, NULL); + inode->private_data = bluesky_profile_get(); + g_thread_pool_push(fs->inode_fetch_thread_pool, inode, NULL); }