X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=inode.c;h=df3883b180161d4bf1ea450af8a1733e5f095885;hb=823820015089dd6185fd2f2b192576b5b7b2eaab;hp=162e154cf21f3750acbf7904bfa2997a8d21e727;hpb=e91edf226b1f7e9b226f34f2fd4b46c7ab8e15f0;p=bluesky.git diff --git a/inode.c b/inode.c index 162e154..df3883b 100644 --- a/inode.c +++ b/inode.c @@ -114,6 +114,7 @@ BlueSkyFS *bluesky_new_fs(gchar *name) fs->inodes = g_hash_table_new(bluesky_fs_key_hash_func, bluesky_fs_key_equal_func); fs->next_inum = BLUESKY_ROOT_INUM + 1; + fs->store = s3store_new(); return fs; } @@ -132,12 +133,14 @@ uint64_t bluesky_fs_alloc_inode(BlueSkyFS *fs) return inum; } -BlueSkyInode *bluesky_new_inode(uint64_t inum, BlueSkyFileType type) +BlueSkyInode *bluesky_new_inode(uint64_t inum, BlueSkyFS *fs, + BlueSkyFileType type) { BlueSkyInode *i = g_new0(BlueSkyInode, 1); i->lock = g_mutex_new(); i->type = type; + i->fs = fs; i->inum = inum; switch (type) { @@ -268,7 +271,7 @@ void bluesky_file_write(BlueSkyInode *inode, uint64_t offset, BlueSkyBlock *b = &g_array_index(inode->blocks, BlueSkyBlock, block_num); memcpy(&b->data[block_offset], data, bytes); - bluesky_block_flush(b); + bluesky_block_flush(inode->fs, b); offset += bytes; data += bytes; @@ -297,9 +300,8 @@ void bluesky_file_read(BlueSkyInode *inode, uint64_t offset, memset(buf, 0, bytes); break; case BLUESKY_BLOCK_REF: - /* TODO: Pull in data first */ - memset(buf, 0, bytes); - break; + bluesky_block_fetch(inode->fs, b); + /* Fall through */ case BLUESKY_BLOCK_CACHED: case BLUESKY_BLOCK_DIRTY: memcpy(buf, &b->data[block_offset], bytes); @@ -312,8 +314,24 @@ void bluesky_file_read(BlueSkyInode *inode, uint64_t offset, } } +/* Read the given block from cloud-backed storage if the data is not already + * cached. */ +void bluesky_block_fetch(BlueSkyFS *fs, BlueSkyBlock *block) +{ + if (block->type != BLUESKY_BLOCK_REF) + return; + + g_print("Fetching block from %s\n", block->ref); + BlueSkyRCStr *string = s3store_get(fs->store, block->ref); + + g_free(block->data); + block->data = g_memdup(string->data, BLUESKY_BLOCK_SIZE); + block->type = BLUESKY_BLOCK_CACHED; + bluesky_string_unref(string); +} + /* Write the given block to cloud-backed storage and mark it clean. */ -void bluesky_block_flush(BlueSkyBlock *block) +void bluesky_block_flush(BlueSkyFS *fs, BlueSkyBlock *block) { if (block->type != BLUESKY_BLOCK_DIRTY) return; @@ -327,10 +345,14 @@ void bluesky_block_flush(BlueSkyBlock *block) const gchar *name = g_checksum_get_string(csum); g_print("Flushing block as %s\n", name); - //memstore_put(store, name, data); + s3store_put(fs->store, name, data); g_free(block->ref); block->ref = g_strdup(name); - block->type = BLUESKY_BLOCK_CACHED; + + /* block->type = BLUESKY_BLOCK_CACHED; */ + g_free(block->data); + block->data = NULL; + block->type = BLUESKY_BLOCK_REF; g_checksum_free(csum); bluesky_string_unref(data);