changeset 14333:a3b162331cd1

dbox: Avoid unnecessary fstat() call during file creation.
author Timo Sirainen <tss@iki.fi>
date Tue, 13 Mar 2012 17:01:56 +0200
parents 37d6dd0f053b
children 6cb102aa5d63
files src/lib-storage/index/dbox-common/dbox-file.c src/lib-storage/index/dbox-common/dbox-file.h src/lib-storage/index/dbox-multi/mdbox-file.c src/lib-storage/index/dbox-single/sdbox-file.c
diffstat 4 files changed, 4 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/dbox-common/dbox-file.c	Tue Mar 13 16:32:56 2012 +0200
+++ b/src/lib-storage/index/dbox-common/dbox-file.c	Tue Mar 13 17:01:56 2012 +0200
@@ -588,7 +588,7 @@
 		return 0;
 	}
 
-	if (ctx->output->offset == 0) {
+	if (ctx->output->offset == 0 && !file->created) {
 		/* first append to existing file. seek to eof first. */
 		if (fstat(file->fd, &st) < 0) {
 			dbox_file_set_syscall_error(file, "fstat()");
--- a/src/lib-storage/index/dbox-common/dbox-file.h	Tue Mar 13 16:32:56 2012 +0200
+++ b/src/lib-storage/index/dbox-common/dbox-file.h	Tue Mar 13 17:01:56 2012 +0200
@@ -116,6 +116,7 @@
 	ARRAY_DEFINE(metadata, const char *);
 	uoff_t metadata_read_offset;
 
+	unsigned int created:1; /* this file is now being created */
 	unsigned int appending:1;
 	unsigned int deleted:1;
 	unsigned int corrupted:1;
--- a/src/lib-storage/index/dbox-multi/mdbox-file.c	Tue Mar 13 16:32:56 2012 +0200
+++ b/src/lib-storage/index/dbox-multi/mdbox-file.c	Tue Mar 13 17:01:56 2012 +0200
@@ -106,6 +106,7 @@
 	bool create_parents;
 	int ret;
 
+	_file->created = TRUE;
 	create_parents = dbox_file_is_in_alt(_file);
 	_file->fd = _file->storage->v.
 		file_create_fd(_file, _file->cur_path, create_parents);
--- a/src/lib-storage/index/dbox-single/sdbox-file.c	Tue Mar 13 16:32:56 2012 +0200
+++ b/src/lib-storage/index/dbox-single/sdbox-file.c	Tue Mar 13 17:01:56 2012 +0200
@@ -60,6 +60,7 @@
 	struct dbox_file *file;
 
 	file = sdbox_file_init(mbox, 0);
+	file->created = TRUE;
 	file->fd = file->storage->v.
 		file_create_fd(file, file->primary_path, FALSE);
 	return file;