Mercurial > dovecot > core-2.2
annotate src/lib-storage/index/dbox-single/sdbox-sync.c @ 21083:a849ee55f385
sdbox: Fix crash on mailbox_sync*() when mailbox auto-open fails.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Thu, 10 Nov 2016 18:24:46 +0200 |
parents | 0f22db71df7a |
children | d082c99cbc65 |
rev | line source |
---|---|
19552
0f22db71df7a
global: freshen copyright
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19168
diff
changeset
|
1 /* Copyright (c) 2007-2016 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 | 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 | 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 | 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; |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
194 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
|
195 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
|
196 unsigned int i; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
197 int ret; |
11658
9d9be6aa3a55
single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents:
11657
diff
changeset
|
198 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
|
199 |
11658
9d9be6aa3a55
single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents:
11657
diff
changeset
|
200 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
|
201 rebuild = force_rebuild || |
9d9be6aa3a55
single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents:
11657
diff
changeset
|
202 mbox->corrupted_rebuild_count != 0 || |
9d9be6aa3a55
single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents:
11657
diff
changeset
|
203 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
|
204 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
205 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
|
206 ctx->mbox = mbox; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
207 ctx->flags = flags; |
12943
edf79127fccd
sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents:
12925
diff
changeset
|
208 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
|
209 |
10678
9740c4858a57
Mailbox deletion: Fixed race condition where a mailbox couldn't get deleted.
Timo Sirainen <tss@iki.fi>
parents:
10660
diff
changeset
|
210 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
|
211 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
|
212 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
|
213 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
|
214 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
|
215 /* 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
|
216 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
|
217 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
218 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
|
219 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
|
220 &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
|
221 &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
|
222 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
|
223 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
|
224 if (ret <= 0) { |
13556 | 225 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
|
226 i_free(ctx); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
227 *ctx_r = NULL; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
228 return ret; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
229 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
230 |
11658
9d9be6aa3a55
single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents:
11657
diff
changeset
|
231 if (rebuild) |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
232 ret = 0; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
233 else { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
234 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
|
235 break; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
236 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
237 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
238 /* 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
|
239 rebuild. */ |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
240 if (ret == 0) { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
241 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
|
242 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
|
243 "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
|
244 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
|
245 ret = -1; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
246 } else { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
247 /* do a full resync and try again. */ |
11658
9d9be6aa3a55
single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents:
11657
diff
changeset
|
248 rebuild = FALSE; |
9d9be6aa3a55
single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents:
11657
diff
changeset
|
249 ret = sdbox_sync_index_rebuild(mbox, |
9d9be6aa3a55
single-dbox: Fixed broken mailbox handling.
Timo Sirainen <tss@iki.fi>
parents:
11657
diff
changeset
|
250 force_rebuild); |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
251 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
252 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
253 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
|
254 if (ret < 0) { |
19168
e29d2f7fe53f
lib-storage: Update mailbox vsize header on save/copy/expunge.
Timo Sirainen <tss@iki.fi>
parents:
18975
diff
changeset
|
255 index_storage_expunging_deinit(&ctx->mbox->box); |
13556 | 256 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
|
257 i_free(ctx); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
258 return -1; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
259 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
260 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
261 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
262 *ctx_r = ctx; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
263 return 0; |
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 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
266 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
|
267 { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
268 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
|
269 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
|
270 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
271 *_ctx = NULL; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
272 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
273 if (success) { |
14374
fb70195b5d47
quota: Added a kludge to avoid recalculating quota.
Timo Sirainen <tss@iki.fi>
parents:
14202
diff
changeset
|
274 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
|
275 |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
276 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
|
277 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
|
278 ret = -1; |
12943
edf79127fccd
sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents:
12925
diff
changeset
|
279 } else { |
edf79127fccd
sdbox: Commit expunges to index first before unlinking the files.
Timo Sirainen <tss@iki.fi>
parents:
12925
diff
changeset
|
280 dbox_sync_expunge_files(ctx); |
14374
fb70195b5d47
quota: Added a kludge to avoid recalculating quota.
Timo Sirainen <tss@iki.fi>
parents:
14202
diff
changeset
|
281 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
|
282 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
283 } else { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
284 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
|
285 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
286 |
19168
e29d2f7fe53f
lib-storage: Update mailbox vsize header on save/copy/expunge.
Timo Sirainen <tss@iki.fi>
parents:
18975
diff
changeset
|
287 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
|
288 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
|
289 i_free(ctx); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
290 return ret; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
291 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
292 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
293 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
|
294 { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
295 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
|
296 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
297 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
|
298 return -1; |
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 (sync_ctx == NULL) |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
301 return 0; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
302 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
|
303 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
304 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
305 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
|
306 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
|
307 { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
308 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
|
309 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
|
310 int ret = 0; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
311 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
312 if (!box->opened) { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
313 if (mailbox_open(box) < 0) |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
314 ret = -1; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
315 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
316 |
21083
a849ee55f385
sdbox: Fix crash on mailbox_sync*() when mailbox auto-open fails.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
317 if (ret == 0 && 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
|
318 sdbox_set_mailbox_corrupted(box); |
1e118913348b
dbox: If index was fscked, rebuild indexes to make sure no mails got lost.
Timo Sirainen <tss@iki.fi>
parents:
13556
diff
changeset
|
319 if (ret == 0 && (index_mailbox_want_full_sync(&mbox->box, flags) || |
1e118913348b
dbox: If index was fscked, rebuild indexes to make sure no mails got lost.
Timo Sirainen <tss@iki.fi>
parents:
13556
diff
changeset
|
320 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
|
321 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
|
322 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
|
323 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
|
324 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
325 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
326 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
|
327 } |