From: Timo Sirainen Date: Wed, 23 Nov 2016 11:25:54 +0000 (+0200) Subject: sdbox: Don't log an error if stub is added twice X-Git-Tag: 2.3.0.rc1~2541 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=172b6edea36e425b0d0c35a854721ae63f57c289;p=thirdparty%2Fdovecot%2Fcore.git sdbox: Don't log an error if stub is added twice There's no locking for them, so it's fine if two processes add the same mail. The second one could be ignored, but it was a bit easier to just let it rename over the first one. --- diff --git a/src/lib-storage/index/dbox-single/sdbox-file.c b/src/lib-storage/index/dbox-single/sdbox-file.c index 9bd61eb828..02ca612fe5 100644 --- a/src/lib-storage/index/dbox-single/sdbox-file.c +++ b/src/lib-storage/index/dbox-single/sdbox-file.c @@ -147,7 +147,8 @@ static int sdbox_file_rename_attachments(struct sdbox_file *file) return ret; } -int sdbox_file_assign_uid(struct sdbox_file *file, uint32_t uid) +int sdbox_file_assign_uid(struct sdbox_file *file, uint32_t uid, + bool ignore_if_exists) { const char *p, *old_path, *dir, *new_fname, *new_path; struct stat st; @@ -163,7 +164,7 @@ int sdbox_file_assign_uid(struct sdbox_file *file, uint32_t uid) new_fname = t_strdup_printf(SDBOX_MAIL_FILE_FORMAT, uid); new_path = t_strdup_printf("%s/%s", dir, new_fname); - if (stat(new_path, &st) == 0) { + if (!ignore_if_exists && stat(new_path, &st) == 0) { mail_storage_set_critical(&file->file.storage->storage, "sdbox: %s already exists, rebuilding index", new_path); sdbox_set_mailbox_corrupted(&file->mbox->box); diff --git a/src/lib-storage/index/dbox-single/sdbox-file.h b/src/lib-storage/index/dbox-single/sdbox-file.h index 4d26a45066..84b6e53be0 100644 --- a/src/lib-storage/index/dbox-single/sdbox-file.h +++ b/src/lib-storage/index/dbox-single/sdbox-file.h @@ -29,7 +29,8 @@ const char * sdbox_file_attachment_relpath(struct sdbox_file *file, const char *srcpath); /* Assign UID for a newly created file (by renaming it) */ -int sdbox_file_assign_uid(struct sdbox_file *file, uint32_t uid); +int sdbox_file_assign_uid(struct sdbox_file *file, uint32_t uid, + bool ignore_if_exists); int sdbox_file_create_fd(struct dbox_file *file, const char *path, bool parents); diff --git a/src/lib-storage/index/dbox-single/sdbox-save.c b/src/lib-storage/index/dbox-single/sdbox-save.c index 5797365066..93ec908b97 100644 --- a/src/lib-storage/index/dbox-single/sdbox-save.c +++ b/src/lib-storage/index/dbox-single/sdbox-save.c @@ -247,7 +247,7 @@ static int dbox_save_assign_uids(struct sdbox_save_context *ctx, ret = seq_range_array_iter_nth(&iter, n++, &uid); i_assert(ret); - if (sdbox_file_assign_uid(sfile, uid) < 0) + if (sdbox_file_assign_uid(sfile, uid, FALSE) < 0) return -1; if (ctx->ctx.highest_pop3_uidl_seq == i+1) { index_pop3_uidl_set_max_uid(&ctx->mbox->box, @@ -272,7 +272,7 @@ static int dbox_save_assign_stub_uids(struct sdbox_save_context *ctx) ctx->first_saved_seq + i, &uid); i_assert(uid != 0); - if (sdbox_file_assign_uid(sfile, uid) < 0) + if (sdbox_file_assign_uid(sfile, uid, TRUE) < 0) return -1; }