From: Michael Vrable Date: Tue, 7 Sep 2010 20:26:10 +0000 (-0700) Subject: Finish up loading of checkpoints from cloud logs. X-Git-Url: http://git.vrable.net/?p=bluesky.git;a=commitdiff_plain;h=0f7a0642cd1b9d98af851b9cf2ed14c9a83ddfc2 Finish up loading of checkpoints from cloud logs. This is now working, at least with a very minimal test. --- diff --git a/bluesky/cloudlog.c b/bluesky/cloudlog.c index c6c2735..0581bfc 100644 --- a/bluesky/cloudlog.c +++ b/bluesky/cloudlog.c @@ -323,6 +323,8 @@ BlueSkyCloudPointer bluesky_cloudlog_serialize(BlueSkyCloudLog *log, log->inum, 1); entry->id = log->id; entry->location = log->location; + entry->item = log; + bluesky_cloudlog_ref(entry->item); g_mutex_unlock(fs->lock); } diff --git a/bluesky/debug.c b/bluesky/debug.c index 77df845..ee6e0c5 100644 --- a/bluesky/debug.c +++ b/bluesky/debug.c @@ -81,7 +81,9 @@ void inode_map_dump(GSequence *inode_map) !g_sequence_iter_is_end(j); j = g_sequence_iter_next(j)) { InodeMapEntry *entry = (InodeMapEntry *)g_sequence_get(j); - g_print(" Entry %"PRIu64"\n", entry->inum); + char *id = bluesky_cloudlog_id_to_string(entry->id); + g_print(" Entry %"PRIu64" id=%s\n", entry->inum, id); + g_free(id); } } } diff --git a/bluesky/imap.c b/bluesky/imap.c index 0cdf9c5..a3d27ca 100644 --- a/bluesky/imap.c +++ b/bluesky/imap.c @@ -203,7 +203,7 @@ static void bluesky_inode_map_deserialize(BlueSkyFS *fs, BlueSkyCloudLog *imap) entry = bluesky_inode_map_lookup(fs->inode_map, *inum, 1); entry->inum = *inum; entry->item = g_array_index(section->links, - BlueSkyCloudLog *, i); + BlueSkyCloudLog *, j); bluesky_cloudlog_ref(entry->item); entry->id = entry->item->id; entry->location = entry->item->location; @@ -225,6 +225,7 @@ gboolean bluesky_checkpoint_load(BlueSkyFS *fs) g_print("Last cloud log segment: %s\n", last_segment); int seq = atoi(last_segment + 13); + fs->log_state->location.sequence = seq + 1; BlueSkyRCStr *last = bluesky_store_get(fs->store, last_segment); g_free(last_segment); @@ -280,7 +281,7 @@ gboolean bluesky_checkpoint_load(BlueSkyFS *fs) g_mutex_unlock(commit->lock); bluesky_inode_map_deserialize(fs, commit); - bluesky_cloudlog_unref(commit); + //bluesky_cloudlog_unref(commit); return TRUE; } diff --git a/bluesky/inode.c b/bluesky/inode.c index f489eaf..41227fb 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); }