X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=bluesky%2Ffile.c;h=3be40f03e08a4b08d27a1acbd4db00892b450401;hb=8a2ef6b448a40c790e7df154c12b54932f3e62e0;hp=75768d11434dd70617d541eeb27325c1c20c335b;hpb=0325ee9e9afb02b08bdec3497e8cc54cb942989d;p=bluesky.git diff --git a/bluesky/file.c b/bluesky/file.c index 75768d1..3be40f0 100644 --- a/bluesky/file.c +++ b/bluesky/file.c @@ -9,6 +9,7 @@ #include #include #include +#include #include "bluesky-private.h" @@ -55,6 +56,8 @@ void bluesky_file_truncate(BlueSkyInode *inode, uint64_t size) if (size == inode->size) return; + g_print("Truncating file to %"PRIi64" bytes\n", size); + uint64_t blocks = (size + BLUESKY_BLOCK_SIZE - 1) / BLUESKY_BLOCK_SIZE; if (blocks > inode->blocks->len) { @@ -98,6 +101,8 @@ void bluesky_file_truncate(BlueSkyInode *inode, uint64_t size) void bluesky_file_write(BlueSkyInode *inode, uint64_t offset, const char *data, gint len) { + g_print("Write %d bytes at offset %"PRIi64"\n", len, offset); + g_return_if_fail(inode->type == BLUESKY_REGULAR); g_return_if_fail(offset < inode->size); g_return_if_fail(len <= inode->size - offset); @@ -114,7 +119,6 @@ void bluesky_file_write(BlueSkyInode *inode, uint64_t offset, BlueSkyBlock *b = &g_array_index(inode->blocks, BlueSkyBlock, block_num); memcpy(&b->data->data[block_offset], data, bytes); - bluesky_block_flush(inode->fs, b); offset += bytes; data += bytes; @@ -122,12 +126,16 @@ void bluesky_file_write(BlueSkyInode *inode, uint64_t offset, } bluesky_inode_update_ctime(inode, 1); - bluesky_inode_flush(inode->fs, inode); } void bluesky_file_read(BlueSkyInode *inode, uint64_t offset, char *buf, gint len) { + g_print("Read %d bytes at offset %"PRIi64"\n", len, offset); + + if (len == 0 && offset <= inode->size) + return; + g_return_if_fail(inode->type == BLUESKY_REGULAR); g_return_if_fail(offset < inode->size); g_return_if_fail(len <= inode->size - offset); @@ -173,7 +181,8 @@ void bluesky_block_fetch(BlueSkyFS *fs, BlueSkyBlock *block) } /* Write the given block to cloud-backed storage and mark it clean. */ -void bluesky_block_flush(BlueSkyFS *fs, BlueSkyBlock *block) +void bluesky_block_flush(BlueSkyFS *fs, BlueSkyBlock *block, + BlueSkyStoreAsync *barrier) { if (block->type != BLUESKY_BLOCK_DIRTY) return; @@ -184,7 +193,18 @@ void bluesky_block_flush(BlueSkyFS *fs, BlueSkyBlock *block) g_checksum_update(csum, data->data, data->len); gchar *name = g_strdup(g_checksum_get_string(csum)); - bluesky_store_put(fs->store, name, data); + /* Store the file data asynchronously, and don't bother waiting for a + * response. */ + BlueSkyStoreAsync *async = bluesky_store_async_new(fs->store); + async->op = STORE_OP_PUT; + async->key = g_strdup(name); + bluesky_string_ref(data); + async->data = data; + bluesky_store_async_submit(async); + if (barrier != NULL) + bluesky_store_add_barrier(barrier, async); + bluesky_store_async_unref(async); + g_free(block->ref); block->ref = name; @@ -196,3 +216,14 @@ void bluesky_block_flush(BlueSkyFS *fs, BlueSkyBlock *block) g_checksum_free(csum); //bluesky_string_unref(data); } + +/* Flush all blocks in a file to stable storage. */ +void bluesky_file_flush(BlueSkyInode *inode, BlueSkyStoreAsync *barrier) +{ + g_return_if_fail(inode->type == BLUESKY_REGULAR); + + for (int i = 0; i < inode->blocks->len; i++) { + BlueSkyBlock *b = &g_array_index(inode->blocks, BlueSkyBlock, i); + bluesky_block_flush(inode->fs, b, barrier); + } +}