changeset 18319:fa42da3cc614

lib-fs: Optimized fs_stat() for fs-metawrap after writing a file.
author Timo Sirainen <tss@iki.fi>
date Mon, 09 Mar 2015 21:27:51 +0200
parents 4a80d3bbf14d
children 13021170e269
files src/lib-fs/fs-metawrap.c
diffstat 1 files changed, 12 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-fs/fs-metawrap.c	Mon Mar 09 20:33:13 2015 +0200
+++ b/src/lib-fs/fs-metawrap.c	Mon Mar 09 21:27:51 2015 +0200
@@ -354,6 +354,8 @@
 	input2 = i_stream_create_concat(inputs);
 	i_stream_unref(&inputs[0]);
 	i_stream_unref(&inputs[1]);
+
+	file->metadata_write_size = str_len(file->metadata_header);
 	return input2;
 }
 
@@ -450,6 +452,16 @@
 
 	if (!file->fs->wrap_metadata)
 		return fs_stat(file->super, st_r);
+
+	if (file->metadata_write_size != 0) {
+		/* fs_stat() after a write. we can do this quickly. */
+		if (fs_stat(file->super, st_r) < 0)
+			return -1;
+		i_assert((uoff_t)st_r->st_size > file->metadata_write_size);
+		st_r->st_size -= file->metadata_write_size;
+		return 0;
+	}
+
 	input = fs_read_stream(_file, IO_BLOCK_SIZE);
 	if ((ret = i_stream_get_size(input, TRUE, &input_size)) < 0) {
 		fs_set_error(_file->fs, "i_stream_get_size(%s) failed: %m",