From: Michael Vrable Date: Sun, 29 Nov 2009 19:47:51 +0000 (-0800) Subject: Some initial work to support delayed flushing of data. X-Git-Url: https://git.vrable.net/?a=commitdiff_plain;h=6443fe537efa35cdad192b2d35ea0398cce56c17;p=bluesky.git Some initial work to support delayed flushing of data. --- diff --git a/bluesky/bluesky.h b/bluesky/bluesky.h index 3bdfd59..7f237d3 100644 --- a/bluesky/bluesky.h +++ b/bluesky/bluesky.h @@ -141,6 +141,11 @@ typedef struct { * committed to stable storage. */ uint64_t change_count, change_commit; + /* Timestamp for controlling when modified data is flushed to stable + * storage. When an inode is first modified from a clean state, this is + * set to the current time. If the inode is clean, it is set to zero. */ + int64_t change_time; + int64_t atime; /* Microseconds since the Unix epoch */ int64_t ctime; int64_t mtime; @@ -210,6 +215,7 @@ void bluesky_directory_dump(BlueSkyInode *dir); void bluesky_block_touch(BlueSkyInode *inode, uint64_t i); void bluesky_block_fetch(BlueSkyFS *fs, BlueSkyBlock *block); void bluesky_block_flush(BlueSkyFS *fs, BlueSkyBlock *block); +void bluesky_file_flush(BlueSkyInode *inode); void bluesky_file_truncate(BlueSkyInode *inode, uint64_t size); void bluesky_file_write(BlueSkyInode *inode, uint64_t offset, const char *data, gint len); diff --git a/bluesky/file.c b/bluesky/file.c index f9f6444..9f4d980 100644 --- a/bluesky/file.c +++ b/bluesky/file.c @@ -215,3 +215,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); + } +} diff --git a/bluesky/inode.c b/bluesky/inode.c index e0d237b..0c745e8 100644 --- a/bluesky/inode.c +++ b/bluesky/inode.c @@ -37,6 +37,9 @@ void bluesky_inode_update_ctime(BlueSkyInode *inode, gboolean update_mtime) inode->ctime = now; if (update_mtime) inode->mtime = now; + + if (inode->change_time == 0) + inode->change_time = now; } /* Unfortunately a glib hash table is only guaranteed to be able to store