annotate src/lib-storage/index/dbox-single/sdbox-sync.c @ 22713:cb108f786fb4

Updated copyright notices to include the year 2018.
author Stephan Bosch <stephan.bosch@dovecot.fi>
date Mon, 01 Jan 2018 22:42:08 +0100
parents 76a93ccad769
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
22713
cb108f786fb4 Updated copyright notices to include the year 2018.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 22314
diff changeset
1 /* Copyright (c) 2007-2018 Dovecot authors, see the included COPYING file */
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11820
diff changeset
4 #include "dbox-attachment.h"
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "sdbox-storage.h"
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "sdbox-file.h"
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "sdbox-sync.h"
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #define SDBOX_REBUILD_COUNT 3
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10
11657
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
11 static void
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
12 dbox_sync_file_move_if_needed(struct dbox_file *file,
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
13 enum sdbox_sync_entry_type type)
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 {
14048
fb659472b2a2 sdbox: Fixed moving files from alt storage to primary storage.
Timo Sirainen <tss@iki.fi>
parents: 13807
diff changeset
15 struct stat st;
11657
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
16 bool move_to_alt = type == SDBOX_SYNC_ENTRY_TYPE_MOVE_TO_ALT;
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
17 bool deleted;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18
14048
fb659472b2a2 sdbox: Fixed moving files from alt storage to primary storage.
Timo Sirainen <tss@iki.fi>
parents: 13807
diff changeset
19 if (move_to_alt == dbox_file_is_in_alt(file) &&
fb659472b2a2 sdbox: Fixed moving files from alt storage to primary storage.
Timo Sirainen <tss@iki.fi>
parents: 13807
diff changeset
20 !move_to_alt) {
fb659472b2a2 sdbox: Fixed moving files from alt storage to primary storage.
Timo Sirainen <tss@iki.fi>
parents: 13807
diff changeset
21 /* unopened dbox files default to primary dir.
fb659472b2a2 sdbox: Fixed moving files from alt storage to primary storage.
Timo Sirainen <tss@iki.fi>
parents: 13807
diff changeset
22 stat the file to update its location. */
fb659472b2a2 sdbox: Fixed moving files from alt storage to primary storage.
Timo Sirainen <tss@iki.fi>
parents: 13807
diff changeset
23 (void)dbox_file_stat(file, &st);
fb659472b2a2 sdbox: Fixed moving files from alt storage to primary storage.
Timo Sirainen <tss@iki.fi>
parents: 13807
diff changeset
24
fb659472b2a2 sdbox: Fixed moving files from alt storage to primary storage.
Timo Sirainen <tss@iki.fi>
parents: 13807
diff changeset
25 }
11657
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
26 if (move_to_alt != dbox_file_is_in_alt(file)) {
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
27 /* move the file. if it fails, nothing broke so
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
28 don't worry about it. */
12332
9e400f6963eb dbox: Reverted the "check if altpath is mounted" change for now.
Timo Sirainen <tss@iki.fi>
parents: 12327
diff changeset
29 if (dbox_file_open(file, &deleted) > 0 && !deleted)
11764
8ec35eb6d7b3 dbox: dbox_file_move() was used by only single-dbox, so moved it there.
Timo Sirainen <tss@iki.fi>
parents: 11658
diff changeset
30 (void)sdbox_file_move(file, move_to_alt);
11657
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
31 }
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33
11657
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
34 static void sdbox_sync_file(struct sdbox_sync_context *ctx,
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
35 uint32_t seq, uint32_t uid,
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
36 enum sdbox_sync_entry_type type)
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 {
11657
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
38 struct dbox_file *file;
14200
d9a6b0991f2e sdbox: Altmove flag changes weren't immediately marked as synced.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
39 enum modify_type modify_type;
11657
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
40
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
41 switch (type) {
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
42 case SDBOX_SYNC_ENTRY_TYPE_EXPUNGE:
12943
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
43 if (!mail_index_transaction_is_expunged(ctx->trans, seq)) {
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
44 mail_index_expunge(ctx->trans, seq);
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
45 array_append(&ctx->expunged_uids, &uid, 1);
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
46 }
11657
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
47 break;
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
48 case SDBOX_SYNC_ENTRY_TYPE_MOVE_FROM_ALT:
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
49 case SDBOX_SYNC_ENTRY_TYPE_MOVE_TO_ALT:
14200
d9a6b0991f2e sdbox: Altmove flag changes weren't immediately marked as synced.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
50 /* update flags in the sync transaction, mainly to make
d9a6b0991f2e sdbox: Altmove flag changes weren't immediately marked as synced.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
51 sure that these alt changes get marked as synced
d9a6b0991f2e sdbox: Altmove flag changes weren't immediately marked as synced.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
52 and won't be retried */
d9a6b0991f2e sdbox: Altmove flag changes weren't immediately marked as synced.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
53 modify_type = type == SDBOX_SYNC_ENTRY_TYPE_MOVE_TO_ALT ?
d9a6b0991f2e sdbox: Altmove flag changes weren't immediately marked as synced.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
54 MODIFY_ADD : MODIFY_REMOVE;
d9a6b0991f2e sdbox: Altmove flag changes weren't immediately marked as synced.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
55 mail_index_update_flags(ctx->trans, seq, modify_type,
14202
6056be0a8c58 Compiler warning fix.
Timo Sirainen <tss@iki.fi>
parents: 14200
diff changeset
56 (enum mail_flags)DBOX_INDEX_FLAG_ALT);
12943
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
57 file = sdbox_file_init(ctx->mbox, uid);
11657
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
58 dbox_sync_file_move_if_needed(file, type);
12943
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
59 dbox_file_unref(&file);
11657
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
60 break;
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
61 }
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
62 }
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
63
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
64 static void sdbox_sync_add(struct sdbox_sync_context *ctx,
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
65 const struct mail_index_sync_rec *sync_rec)
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
66 {
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
67 uint32_t uid;
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
68 enum sdbox_sync_entry_type type;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69 uint32_t seq, seq1, seq2;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71 if (sync_rec->type == MAIL_INDEX_SYNC_TYPE_EXPUNGE) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 /* we're interested */
11657
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
73 type = SDBOX_SYNC_ENTRY_TYPE_EXPUNGE;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 } else if (sync_rec->type == MAIL_INDEX_SYNC_TYPE_FLAGS) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 /* we care only about alt flag changes */
11657
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
76 if ((sync_rec->add_flags & DBOX_INDEX_FLAG_ALT) != 0)
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
77 type = SDBOX_SYNC_ENTRY_TYPE_MOVE_TO_ALT;
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
78 else if ((sync_rec->remove_flags & DBOX_INDEX_FLAG_ALT) != 0)
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
79 type = SDBOX_SYNC_ENTRY_TYPE_MOVE_FROM_ALT;
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
80 else
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
81 return;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 } else {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 /* not interested */
11657
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
84 return;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 if (!mail_index_lookup_seq_range(ctx->sync_view,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 sync_rec->uid1, sync_rec->uid2,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 &seq1, &seq2)) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 /* already expunged everything. nothing to do. */
11657
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
91 return;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94 for (seq = seq1; seq <= seq2; seq++) {
11657
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
95 mail_index_lookup_uid(ctx->sync_view, seq, &uid);
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
96 sdbox_sync_file(ctx, seq, uid, type);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
98 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100 static int sdbox_sync_index(struct sdbox_sync_context *ctx)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101 {
10660
56b1d4dd9c7d lib-storage: *_mailboxes don't descend from index_mailbox anymore, it's now a context.
Timo Sirainen <tss@iki.fi>
parents: 10657
diff changeset
102 struct mailbox *box = &ctx->mbox->box;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103 const struct mail_index_header *hdr;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104 struct mail_index_sync_rec sync_rec;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105 uint32_t seq1, seq2;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107 hdr = mail_index_get_header(ctx->sync_view);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
108 if (hdr->uid_validity == 0) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
109 /* newly created index file */
16781
98702a45784c dbox: Fixed "UIDVALIDITY=0" error race condition.
Timo Sirainen <tss@iki.fi>
parents: 16403
diff changeset
110 if (hdr->next_uid == 1) {
98702a45784c dbox: Fixed "UIDVALIDITY=0" error race condition.
Timo Sirainen <tss@iki.fi>
parents: 16403
diff changeset
111 /* could be just a race condition where we opened the
98702a45784c dbox: Fixed "UIDVALIDITY=0" error race condition.
Timo Sirainen <tss@iki.fi>
parents: 16403
diff changeset
112 mailbox between mkdir and index creation. fix this
98702a45784c dbox: Fixed "UIDVALIDITY=0" error race condition.
Timo Sirainen <tss@iki.fi>
parents: 16403
diff changeset
113 silently. */
98702a45784c dbox: Fixed "UIDVALIDITY=0" error race condition.
Timo Sirainen <tss@iki.fi>
parents: 16403
diff changeset
114 if (sdbox_mailbox_create_indexes(box, NULL, ctx->trans) < 0)
98702a45784c dbox: Fixed "UIDVALIDITY=0" error race condition.
Timo Sirainen <tss@iki.fi>
parents: 16403
diff changeset
115 return -1;
98702a45784c dbox: Fixed "UIDVALIDITY=0" error race condition.
Timo Sirainen <tss@iki.fi>
parents: 16403
diff changeset
116 return 1;
98702a45784c dbox: Fixed "UIDVALIDITY=0" error race condition.
Timo Sirainen <tss@iki.fi>
parents: 16403
diff changeset
117 }
12925
654b5a2fc926 sdbox: Added more error message logging.
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
118 mail_storage_set_critical(box->storage,
654b5a2fc926 sdbox: Added more error message logging.
Timo Sirainen <tss@iki.fi>
parents: 12822
diff changeset
119 "sdbox %s: Broken index: missing UIDVALIDITY",
12969
80eef14e9e15 Merged changes from v2.0 tree.
Timo Sirainen <tss@iki.fi>
parents: 12860 12943
diff changeset
120 mailbox_get_path(box));
15650
ba0fae268904 sdbox: Fixed rebuilding index when UIDVALIDITY is missing.
Timo Sirainen <tss@iki.fi>
parents: 15342
diff changeset
121 sdbox_set_mailbox_corrupted(box);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
122 return 0;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
123 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125 /* mark the newly seen messages as recent */
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126 if (mail_index_lookup_seq_range(ctx->sync_view, hdr->first_recent_uid,
11657
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
127 hdr->next_uid, &seq1, &seq2))
18975
f78bd5be4e47 lib-storage: Moved most of the \Recent flag handling code to mailbox-recent-flags.c
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
128 mailbox_recent_flags_set_seqs(box, ctx->sync_view, seq1, seq2);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129
11657
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
130 while (mail_index_sync_next(ctx->index_sync_ctx, &sync_rec))
4e5032891954 single-dbox: Simplified syncing code.
Timo Sirainen <tss@iki.fi>
parents: 11176
diff changeset
131 sdbox_sync_add(ctx, &sync_rec);
12943
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
132 return 1;
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
133 }
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134
12943
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
135 static void dbox_sync_file_expunge(struct sdbox_sync_context *ctx,
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
136 uint32_t uid)
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
137 {
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
138 struct mailbox *box = &ctx->mbox->box;
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
139 struct dbox_file *file;
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
140 struct sdbox_file *sfile;
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
141 int ret;
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
142
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
143 file = sdbox_file_init(ctx->mbox, uid);
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
144 sfile = (struct sdbox_file *)file;
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
145 if (file->storage->attachment_dir != NULL)
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
146 ret = sdbox_file_unlink_with_attachments(sfile);
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
147 else
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
148 ret = dbox_file_unlink(file);
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
149
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
150 /* do sync_notify only when the file was unlinked by us */
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
151 if (ret > 0 && box->v.sync_notify != NULL)
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
152 box->v.sync_notify(box, uid, MAILBOX_SYNC_TYPE_EXPUNGE);
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
153 dbox_file_unref(&file);
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
154 }
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
155
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
156 static void dbox_sync_expunge_files(struct sdbox_sync_context *ctx)
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
157 {
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
158 const uint32_t *uidp;
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
159
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
160 /* NOTE: Index is no longer locked. Multiple processes may be unlinking
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
161 the files at the same time. */
14374
fb70195b5d47 quota: Added a kludge to avoid recalculating quota.
Timo Sirainen <tss@iki.fi>
parents: 14202
diff changeset
162 ctx->mbox->box.tmp_sync_view = ctx->sync_view;
16946
0ed18f77ff08 lib-storage: Moved more of dbox attachments code to generic code.
Timo Sirainen <tss@iki.fi>
parents: 16781
diff changeset
163 array_foreach(&ctx->expunged_uids, uidp) T_BEGIN {
12943
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
164 dbox_sync_file_expunge(ctx, *uidp);
16946
0ed18f77ff08 lib-storage: Moved more of dbox attachments code to generic code.
Timo Sirainen <tss@iki.fi>
parents: 16781
diff changeset
165 } T_END;
12943
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
166 if (ctx->mbox->box.v.sync_notify != NULL)
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
167 ctx->mbox->box.v.sync_notify(&ctx->mbox->box, 0, 0);
14374
fb70195b5d47 quota: Added a kludge to avoid recalculating quota.
Timo Sirainen <tss@iki.fi>
parents: 14202
diff changeset
168 ctx->mbox->box.tmp_sync_view = NULL;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
169 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
170
11024
d16bfa082e88 sdbox: Avoid logging multiple adjacent "Invalid dbox header size" errors.
Timo Sirainen <tss@iki.fi>
parents: 10678
diff changeset
171 static int
d16bfa082e88 sdbox: Avoid logging multiple adjacent "Invalid dbox header size" errors.
Timo Sirainen <tss@iki.fi>
parents: 10678
diff changeset
172 sdbox_refresh_header(struct sdbox_mailbox *mbox, bool retry, bool log_error)
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174 struct mail_index_view *view;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
175 struct sdbox_index_header hdr;
16403
967ef2a7fa6f dbox: Don't cache pop3.uidl|order unless index header indicates there are those.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
176 bool need_resize;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 int ret;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178
10660
56b1d4dd9c7d lib-storage: *_mailboxes don't descend from index_mailbox anymore, it's now a context.
Timo Sirainen <tss@iki.fi>
parents: 10657
diff changeset
179 view = mail_index_view_open(mbox->box.index);
16403
967ef2a7fa6f dbox: Don't cache pop3.uidl|order unless index header indicates there are those.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
180 ret = sdbox_read_header(mbox, &hdr, log_error, &need_resize);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
181 mail_index_view_close(&view);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182
11025
1e118fd825c7 sdbox: Removed unused code.
Timo Sirainen <tss@iki.fi>
parents: 11024
diff changeset
183 if (ret < 0 && retry) {
14688
128c598d2870 Avoid using (void)s by adding ATTR_NOWARN_UNUSED_RESULT attributes and other ways.
Timo Sirainen <tss@iki.fi>
parents: 14375
diff changeset
184 mail_index_refresh(mbox->box.index);
11024
d16bfa082e88 sdbox: Avoid logging multiple adjacent "Invalid dbox header size" errors.
Timo Sirainen <tss@iki.fi>
parents: 10678
diff changeset
185 return sdbox_refresh_header(mbox, FALSE, log_error);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187 return ret;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
189
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
190 int sdbox_sync_begin(struct sdbox_mailbox *mbox, enum sdbox_sync_flags flags,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
191 struct sdbox_sync_context **ctx_r)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
192 {
10660
56b1d4dd9c7d lib-storage: *_mailboxes don't descend from index_mailbox anymore, it's now a context.
Timo Sirainen <tss@iki.fi>
parents: 10657
diff changeset
193 struct mail_storage *storage = mbox->box.storage;
21265
d082c99cbc65 sdbox: Rebuild index after it's been fsck'd
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21083
diff changeset
194 const struct mail_index_header *hdr =
d082c99cbc65 sdbox: Rebuild index after it's been fsck'd
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21083
diff changeset
195 mail_index_get_header(mbox->box.view);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
196 struct sdbox_sync_context *ctx;
10678
9740c4858a57 Mailbox deletion: Fixed race condition where a mailbox couldn't get deleted.
Timo Sirainen <tss@iki.fi>
parents: 10660
diff changeset
197 enum mail_index_sync_flags sync_flags;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198 unsigned int i;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199 int ret;
11658
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11657
diff changeset
200 bool rebuild, force_rebuild;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201
11658
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11657
diff changeset
202 force_rebuild = (flags & SDBOX_SYNC_FLAG_FORCE_REBUILD) != 0;
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11657
diff changeset
203 rebuild = force_rebuild ||
21265
d082c99cbc65 sdbox: Rebuild index after it's been fsck'd
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21083
diff changeset
204 (hdr->flags & MAIL_INDEX_HDR_FLAG_FSCKD) != 0 ||
11658
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11657
diff changeset
205 mbox->corrupted_rebuild_count != 0 ||
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11657
diff changeset
206 sdbox_refresh_header(mbox, TRUE, FALSE) < 0;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208 ctx = i_new(struct sdbox_sync_context, 1);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209 ctx->mbox = mbox;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210 ctx->flags = flags;
12943
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
211 i_array_init(&ctx->expunged_uids, 32);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
212
10678
9740c4858a57 Mailbox deletion: Fixed race condition where a mailbox couldn't get deleted.
Timo Sirainen <tss@iki.fi>
parents: 10660
diff changeset
213 sync_flags = index_storage_get_sync_flags(&mbox->box);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214 if (!rebuild && (flags & SDBOX_SYNC_FLAG_FORCE) == 0)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215 sync_flags |= MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216 if ((flags & SDBOX_SYNC_FLAG_FSYNC) != 0)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
217 sync_flags |= MAIL_INDEX_SYNC_FLAG_FSYNC;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218 /* don't write unnecessary dirty flag updates */
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
219 sync_flags |= MAIL_INDEX_SYNC_FLAG_AVOID_FLAG_UPDATES;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
220
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221 for (i = 0;; i++) {
19168
e29d2f7fe53f lib-storage: Update mailbox vsize header on save/copy/expunge.
Timo Sirainen <tss@iki.fi>
parents: 18975
diff changeset
222 ret = index_storage_expunged_sync_begin(&mbox->box,
e29d2f7fe53f lib-storage: Update mailbox vsize header on save/copy/expunge.
Timo Sirainen <tss@iki.fi>
parents: 18975
diff changeset
223 &ctx->index_sync_ctx, &ctx->sync_view,
e29d2f7fe53f lib-storage: Update mailbox vsize header on save/copy/expunge.
Timo Sirainen <tss@iki.fi>
parents: 18975
diff changeset
224 &ctx->trans, sync_flags);
13807
1e118913348b dbox: If index was fscked, rebuild indexes to make sure no mails got lost.
Timo Sirainen <tss@iki.fi>
parents: 13556
diff changeset
225 if (mail_index_reset_fscked(mbox->box.index))
1e118913348b dbox: If index was fscked, rebuild indexes to make sure no mails got lost.
Timo Sirainen <tss@iki.fi>
parents: 13556
diff changeset
226 sdbox_set_mailbox_corrupted(&mbox->box);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227 if (ret <= 0) {
13556
415aa8e92203 sdbox: Memory leak fix.
Timo Sirainen <tss@iki.fi>
parents: 12969
diff changeset
228 array_free(&ctx->expunged_uids);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229 i_free(ctx);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
230 *ctx_r = NULL;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
231 return ret;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
232 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233
11658
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11657
diff changeset
234 if (rebuild)
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
235 ret = 0;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
236 else {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237 if ((ret = sdbox_sync_index(ctx)) > 0)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
238 break;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241 /* failure. keep the index locked while we're doing a
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242 rebuild. */
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243 if (ret == 0) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
244 if (i >= SDBOX_REBUILD_COUNT) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
245 mail_storage_set_critical(storage,
11820
76ee1fa16012 Renamed "dbox" to "sdbox". Keep also dbox as an alias for it.
Timo Sirainen <tss@iki.fi>
parents: 11764
diff changeset
246 "sdbox %s: Index keeps breaking",
12520
b26d6da05d48 lib-storage: Lazily look up mailbox path and permissions. Added functions to get them.
Timo Sirainen <tss@iki.fi>
parents: 12332
diff changeset
247 mailbox_get_path(&ctx->mbox->box));
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
248 ret = -1;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
249 } else {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
250 /* do a full resync and try again. */
11658
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11657
diff changeset
251 rebuild = FALSE;
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11657
diff changeset
252 ret = sdbox_sync_index_rebuild(mbox,
9d9be6aa3a55 single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents: 11657
diff changeset
253 force_rebuild);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
254 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
255 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
256 mail_index_sync_rollback(&ctx->index_sync_ctx);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
257 if (ret < 0) {
19168
e29d2f7fe53f lib-storage: Update mailbox vsize header on save/copy/expunge.
Timo Sirainen <tss@iki.fi>
parents: 18975
diff changeset
258 index_storage_expunging_deinit(&ctx->mbox->box);
13556
415aa8e92203 sdbox: Memory leak fix.
Timo Sirainen <tss@iki.fi>
parents: 12969
diff changeset
259 array_free(&ctx->expunged_uids);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
260 i_free(ctx);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
261 return -1;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
262 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
263 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
264
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
265 *ctx_r = ctx;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
266 return 0;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
267 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269 int sdbox_sync_finish(struct sdbox_sync_context **_ctx, bool success)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
270 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
271 struct sdbox_sync_context *ctx = *_ctx;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
272 int ret = success ? 0 : -1;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
273
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
274 *_ctx = NULL;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
275
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
276 if (success) {
14374
fb70195b5d47 quota: Added a kludge to avoid recalculating quota.
Timo Sirainen <tss@iki.fi>
parents: 14202
diff changeset
277 mail_index_view_ref(ctx->sync_view);
19168
e29d2f7fe53f lib-storage: Update mailbox vsize header on save/copy/expunge.
Timo Sirainen <tss@iki.fi>
parents: 18975
diff changeset
278
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
279 if (mail_index_sync_commit(&ctx->index_sync_ctx) < 0) {
15342
5479887eb461 lib-storage: Renamed mail_storage_set_index_error() to mailbox_set_index_error()
Timo Sirainen <tss@iki.fi>
parents: 14688
diff changeset
280 mailbox_set_index_error(&ctx->mbox->box);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
281 ret = -1;
12943
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
282 } else {
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
283 dbox_sync_expunge_files(ctx);
14374
fb70195b5d47 quota: Added a kludge to avoid recalculating quota.
Timo Sirainen <tss@iki.fi>
parents: 14202
diff changeset
284 mail_index_view_close(&ctx->sync_view);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
285 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
286 } else {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
287 mail_index_sync_rollback(&ctx->index_sync_ctx);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
288 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
289
19168
e29d2f7fe53f lib-storage: Update mailbox vsize header on save/copy/expunge.
Timo Sirainen <tss@iki.fi>
parents: 18975
diff changeset
290 index_storage_expunging_deinit(&ctx->mbox->box);
12943
edf79127fccd sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents: 12925
diff changeset
291 array_free(&ctx->expunged_uids);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
292 i_free(ctx);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
293 return ret;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
294 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
295
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
296 int sdbox_sync(struct sdbox_mailbox *mbox, enum sdbox_sync_flags flags)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
297 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
298 struct sdbox_sync_context *sync_ctx;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
299
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
300 if (sdbox_sync_begin(mbox, flags, &sync_ctx) < 0)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
301 return -1;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
302
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
303 if (sync_ctx == NULL)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
304 return 0;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
305 return sdbox_sync_finish(&sync_ctx, TRUE);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
306 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
307
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
308 struct mailbox_sync_context *
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
309 sdbox_storage_sync_init(struct mailbox *box, enum mailbox_sync_flags flags)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
310 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
311 struct sdbox_mailbox *mbox = (struct sdbox_mailbox *)box;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
312 enum sdbox_sync_flags sdbox_sync_flags = 0;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
313 int ret = 0;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
314
22314
76a93ccad769 lib-storage: Storage backend sync_init()s no longer need to check if mailbox is open
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
315 if (mail_index_reset_fscked(box->index))
13807
1e118913348b dbox: If index was fscked, rebuild indexes to make sure no mails got lost.
Timo Sirainen <tss@iki.fi>
parents: 13556
diff changeset
316 sdbox_set_mailbox_corrupted(box);
22314
76a93ccad769 lib-storage: Storage backend sync_init()s no longer need to check if mailbox is open
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
317 if (index_mailbox_want_full_sync(&mbox->box, flags) ||
76a93ccad769 lib-storage: Storage backend sync_init()s no longer need to check if mailbox is open
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
318 mbox->corrupted_rebuild_count != 0) {
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
319 if ((flags & MAILBOX_SYNC_FLAG_FORCE_RESYNC) != 0)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
320 sdbox_sync_flags |= SDBOX_SYNC_FLAG_FORCE_REBUILD;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
321 ret = sdbox_sync(mbox, sdbox_sync_flags);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
322 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
323
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
324 return index_mailbox_sync_init(box, flags, ret < 0);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
325 }