X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;ds=sidebyside;f=bluesky%2Ffile.c;h=8e16e9172f509ad11d8f6b63c1e4ef5d480fb2a5;hb=a5b5871865301712bc22ffc3d86a425dc0b45991;hp=f9f6444374fbad11744162c8806aba81ee3418c4;hpb=c6d5eb1086d5da2a2e7548c5ce3b5efa9ba76f0c;p=bluesky.git diff --git a/bluesky/file.c b/bluesky/file.c index f9f6444..8e16e91 100644 --- a/bluesky/file.c +++ b/bluesky/file.c @@ -127,7 +127,7 @@ void bluesky_file_write(BlueSkyInode *inode, uint64_t offset, } bluesky_inode_update_ctime(inode, 1); - bluesky_inode_flush(inode->fs, inode); + //bluesky_inode_flush(inode->fs, inode); } void bluesky_file_read(BlueSkyInode *inode, uint64_t offset, @@ -182,6 +182,11 @@ void bluesky_block_fetch(BlueSkyFS *fs, BlueSkyBlock *block) block->type = BLUESKY_BLOCK_CACHED; } +static void finished(gpointer a, gpointer b) +{ + g_print("Barrier completed!\n"); +} + /* Write the given block to cloud-backed storage and mark it clean. */ void bluesky_block_flush(BlueSkyFS *fs, BlueSkyBlock *block) { @@ -207,6 +212,13 @@ void bluesky_block_flush(BlueSkyFS *fs, BlueSkyBlock *block) g_free(block->ref); block->ref = name; + BlueSkyStoreAsync *barrier = bluesky_store_async_new(fs->store); + barrier->op = STORE_OP_BARRIER; + bluesky_store_add_barrier(barrier, async); + bluesky_store_async_add_notifier(barrier, finished, NULL); + bluesky_store_async_submit(barrier); + bluesky_store_async_unref(barrier); + /* block->type = BLUESKY_BLOCK_CACHED; */ bluesky_string_unref(block->data); block->data = NULL; @@ -215,3 +227,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) +{ + 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); + } +}