[dovecot-cvs] dovecot/src/lib-storage/index/dbox dbox-save.c,
1.10.2.1, 1.10.2.2 dbox-uidlist.c, 1.28.2.3,
1.28.2.4 dbox-uidlist.h, 1.5, 1.5.2.1
cras at dovecot.org
cras at dovecot.org
Thu Jun 8 21:21:14 EEST 2006
Update of /var/lib/cvs/dovecot/src/lib-storage/index/dbox
In directory talvi:/tmp/cvs-serv13735
Modified Files:
Tag: branch_1_0
dbox-save.c dbox-uidlist.c dbox-uidlist.h
Log Message:
If mail's size is known beforehand, select the dbox file so that the saving
won't grow file larger than dbox_rotate_size.
Index: dbox-save.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/index/dbox/dbox-save.c,v
retrieving revision 1.10.2.1
retrieving revision 1.10.2.2
diff -u -d -r1.10.2.1 -r1.10.2.2
--- dbox-save.c 8 Jun 2006 16:35:04 -0000 1.10.2.1
+++ dbox-save.c 8 Jun 2006 18:21:12 -0000 1.10.2.2
@@ -3,6 +3,7 @@
#include "lib.h"
#include "array.h"
#include "ioloop.h"
+#include "istream.h"
#include "hex-dec.h"
#include "write-full.h"
#include "ostream.h"
@@ -106,6 +107,7 @@
struct dbox_mailbox *mbox = (struct dbox_mailbox *)t->ictx.ibox;
struct dbox_save_context *ctx = t->save_ctx;
struct dbox_mail_header hdr;
+ const struct stat *st;
buffer_t *file_keywords = NULL;
enum mail_flags save_flags;
unsigned int i, pos, left;
@@ -137,7 +139,13 @@
}
ctx->input = input;
- if (dbox_uidlist_append_locked(ctx->append_ctx, &ctx->file) < 0) {
+ /* get the size of the mail to be saved, if possible */
+ st = i_stream_stat(input, TRUE);
+ if (st != NULL && st->st_size == -1)
+ st = NULL;
+
+ if (dbox_uidlist_append_locked(ctx->append_ctx, &ctx->file,
+ st != NULL ? st->st_size : 0) < 0) {
ctx->failed = TRUE;
return -1;
}
Index: dbox-uidlist.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/index/dbox/dbox-uidlist.c,v
retrieving revision 1.28.2.3
retrieving revision 1.28.2.4
diff -u -d -r1.28.2.3 -r1.28.2.4
--- dbox-uidlist.c 8 Jun 2006 14:42:19 -0000 1.28.2.3
+++ dbox-uidlist.c 8 Jun 2006 18:21:12 -0000 1.28.2.4
@@ -973,7 +973,8 @@
static int
dbox_file_append_lock(struct dbox_uidlist_append_ctx *ctx, string_t *path,
- uint32_t *file_seq_r, struct dbox_uidlist_entry **entry_r,
+ uoff_t mail_size, uint32_t *file_seq_r,
+ struct dbox_uidlist_entry **entry_r,
struct dotlock **dotlock_r, bool *existing_r)
{
struct dbox_mailbox *mbox = ctx->uidlist->mbox;
@@ -988,7 +989,8 @@
*existing_r = FALSE;
for (; i < count; i++) {
if (DBOX_CAN_APPEND(ctx, entries[i]->create_time,
- entries[i]->file_size) &&
+ entries[i]->file_size +
+ mail_size) &&
!dbox_uidlist_files_lookup(ctx,
entries[i]->file_seq)) {
*existing_r = TRUE;
@@ -1054,7 +1056,7 @@
}
int dbox_uidlist_append_locked(struct dbox_uidlist_append_ctx *ctx,
- struct dbox_file **file_r)
+ struct dbox_file **file_r, uoff_t mail_size)
{
struct dbox_save_file *const *files, *save_file;
struct dbox_uidlist_entry *entry;
@@ -1072,7 +1074,8 @@
files = array_get(&ctx->files, &count);
for (i = 0; i < count; i++) {
if (DBOX_CAN_APPEND(ctx, files[i]->file->create_time,
- files[i]->file->append_offset)) {
+ files[i]->file->append_offset +
+ mail_size)) {
if (dbox_reopen_file(ctx, files[i]) < 0)
return -1;
@@ -1088,7 +1091,7 @@
do {
if (dotlock != NULL)
file_dotlock_delete(&dotlock);
- if (dbox_file_append_lock(ctx, path, &file_seq,
+ if (dbox_file_append_lock(ctx, path, mail_size, &file_seq,
&entry, &dotlock, &existing) < 0)
return -1;
} while ((ret = dbox_file_append(ctx, str_c(path), entry,
Index: dbox-uidlist.h
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/index/dbox/dbox-uidlist.h,v
retrieving revision 1.5
retrieving revision 1.5.2.1
diff -u -d -r1.5 -r1.5.2.1
--- dbox-uidlist.h 31 Mar 2006 21:21:20 -0000 1.5
+++ dbox-uidlist.h 8 Jun 2006 18:21:12 -0000 1.5.2.1
@@ -31,7 +31,7 @@
Returns -1 if failed, 0 if ok. If new file is created, the file's header is
already appended. */
int dbox_uidlist_append_locked(struct dbox_uidlist_append_ctx *ctx,
- struct dbox_file **file_r);
+ struct dbox_file **file_r, uoff_t mail_size);
void dbox_uidlist_append_finish_mail(struct dbox_uidlist_append_ctx *ctx,
struct dbox_file *file);
More information about the dovecot-cvs
mailing list