X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=bluesky%2Finode.c;h=e11bfeb3c0a8b898387f295ffdb4e146b9db93b4;hb=6955b27db8185d222adb07e57d207f7f421037e6;hp=f489eaf64d14ce06e7fc5daac2e5413f0e9d7967;hpb=56b93c6854c139faa9de04f6907eb586acd3e6ec;p=bluesky.git diff --git a/bluesky/inode.c b/bluesky/inode.c index f489eaf..e11bfeb 100644 --- a/bluesky/inode.c +++ b/bluesky/inode.c @@ -99,25 +99,26 @@ BlueSkyFS *bluesky_new_fs(gchar *name) BlueSkyFS *bluesky_init_fs(gchar *name, BlueSkyStore *store) { - g_print("Initializing filesystem\n"); BlueSkyFS *fs = bluesky_new_fs(name); fs->store = store; fs->log = bluesky_log_new("journal"); fs->log->fs = fs; - bluesky_checkpoint_load(fs); - exit(0); - - BlueSkyInode *root = bluesky_new_inode(BLUESKY_ROOT_INUM, fs, - BLUESKY_DIRECTORY); - root->nlink = 1; - root->mode = 0755; - bluesky_insert_inode(fs, root); - bluesky_inode_update_ctime(root, TRUE); - - bluesky_replay(fs); - - bluesky_inode_do_sync(root); + if (bluesky_checkpoint_load(fs)) { + g_print("Filesystem checkpoint loaded, starting journal replay...\n"); + bluesky_replay(fs); + g_print("Journal replay complete, filesystem ready.\n"); + } else { + /* Initialize a fresh filesystem */ + g_print("Initializing new filesystem...\n"); + BlueSkyInode *root = bluesky_new_inode(BLUESKY_ROOT_INUM, fs, + BLUESKY_DIRECTORY); + root->nlink = 1; + root->mode = 0755; + bluesky_insert_inode(fs, root); + bluesky_inode_update_ctime(root, TRUE); + bluesky_inode_do_sync(root); + } return fs; } @@ -343,26 +344,17 @@ void bluesky_inode_do_sync(BlueSkyInode *inode) } } -static void complete_inode_fetch(BlueSkyStoreAsync *async, BlueSkyInode *inode) +static void complete_inode_fetch(BlueSkyInode *inode) { - if (bluesky_verbose) { - g_log("bluesky/inode", G_LOG_LEVEL_DEBUG, - "Completing fetch of inode %"PRIu64"...", inode->inum); - } + BlueSkyCloudLog *item = inode->committed_item; + inode->committed_item = NULL; + g_print("Completing fetch of inode %"PRIu64"...", inode->inum); - if (async->result != 0 || FALSE) - { - if (bluesky_verbose) { - g_log("bluesky/inode", G_LOG_LEVEL_DEBUG, - " failed to load inode, cleaning up"); - } - g_mutex_lock(inode->fs->lock); - g_hash_table_remove(inode->fs->inodes, &inode->inum); - bluesky_list_unlink(&inode->fs->accessed_list, inode->accessed_list); - inode->accessed_list = NULL; - g_mutex_unlock(inode->fs->lock); - bluesky_inode_unref(inode); - } + g_mutex_lock(item->lock); + bluesky_cloudlog_fetch(item); + if (!bluesky_deserialize_inode(inode, item)) + g_print("Error deserializing inode %"PRIu64"\n", inode->inum); + g_mutex_unlock(item->lock); inode->access_time = bluesky_get_current_time(); g_mutex_lock(inode->fs->lock); @@ -371,6 +363,7 @@ static void complete_inode_fetch(BlueSkyStoreAsync *async, BlueSkyInode *inode) g_mutex_unlock(inode->fs->lock); g_mutex_unlock(inode->lock); + bluesky_cloudlog_unref(item); bluesky_inode_unref(inode); } @@ -381,25 +374,19 @@ static void complete_inode_fetch(BlueSkyStoreAsync *async, BlueSkyInode *inode) * fs lock must be held. */ void bluesky_inode_fetch(BlueSkyFS *fs, uint64_t inum) { - char key[64]; - sprintf(key, "inode-%016"PRIx64, inum); + InodeMapEntry *entry = bluesky_inode_map_lookup(fs->inode_map, inum, 0); + if (entry == NULL) + return; 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); - BlueSkyStoreAsync *async = bluesky_store_async_new(fs->store); - async->op = STORE_OP_GET; - async->key = g_strdup(key); - - bluesky_store_async_add_notifier(async, (GFunc)complete_inode_fetch, inode); - bluesky_store_async_submit(async); - - if (bluesky_options.sync_inode_fetches) { - bluesky_store_async_wait(async); - } - - bluesky_store_async_unref(async); + /* TODO: Thread pool or other better async method. */ + g_thread_create((GThreadFunc)complete_inode_fetch, + (gpointer)inode, FALSE, NULL); }