Mercurial > dovecot > core-2.2
annotate src/lib-storage/index/dbox-common/dbox-sync-rebuild.c @ 10844:3bfb1e9f556b HEAD
dbox index rebuild: Fixed setting next-uid and highest-modseq.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 06 Mar 2010 13:11:07 +0200 |
parents | 154f52b7a6fd |
children | cf302ede55bc |
rev | line source |
---|---|
10582
615eef3139c2
Updated copyright notices to include year 2010.
Timo Sirainen <tss@iki.fi>
parents:
9977
diff
changeset
|
1 /* Copyright (c) 2007-2010 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" |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "array.h" |
10828
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
5 #include "mail-index-modseq.h" |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "index-storage.h" |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "dbox-storage.h" |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "dbox-sync-rebuild.h" |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 static void |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 dbox_sync_index_copy_cache(struct dbox_sync_rebuild_context *ctx, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 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
|
13 uint32_t old_seq, uint32_t new_seq) |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 struct mail_index_map *map; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 const void *data; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 uint32_t reset_id; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 bool expunged; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 if (ctx->cache_ext_id == (uint32_t)-1) |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 return; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 mail_index_lookup_ext_full(view, old_seq, ctx->cache_ext_id, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 &map, &data, &expunged); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 if (expunged) |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 return; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 if (!mail_index_ext_get_reset_id(view, map, ctx->cache_ext_id, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 &reset_id) || reset_id == 0) |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 return; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 if (!ctx->cache_used) { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 /* set reset id */ |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 ctx->cache_used = TRUE; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 ctx->cache_reset_id = reset_id; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 mail_index_ext_reset(ctx->trans, ctx->cache_ext_id, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 ctx->cache_reset_id, TRUE); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 if (ctx->cache_reset_id == reset_id) { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 mail_index_update_ext(ctx->trans, new_seq, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 ctx->cache_ext_id, data, NULL); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 static void |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 dbox_sync_index_copy_from_old(struct dbox_sync_rebuild_context *ctx, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 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
|
48 uint32_t old_seq, uint32_t new_seq) |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 struct mail_index *index = mail_index_view_get_index(view); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 const struct mail_index_record *rec; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 ARRAY_TYPE(keyword_indexes) old_keywords; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 struct mail_keywords *kw; |
10828
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
54 uint64_t modseq; |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 /* copy flags */ |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 rec = mail_index_lookup(view, old_seq); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 mail_index_update_flags(ctx->trans, new_seq, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 MODIFY_REPLACE, rec->flags); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 /* copy keywords */ |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 t_array_init(&old_keywords, 32); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 mail_index_lookup_keywords(view, old_seq, &old_keywords); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 kw = mail_index_keywords_create_from_indexes(index, &old_keywords); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 mail_index_update_keywords(ctx->trans, new_seq, MODIFY_REPLACE, kw); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 mail_index_keywords_unref(&kw); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 |
10828
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
68 /* copy modseq */ |
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
69 modseq = mail_index_modseq_lookup(view, old_seq); |
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
70 mail_index_update_modseq(ctx->trans, new_seq, modseq); |
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
71 |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 dbox_sync_index_copy_cache(ctx, view, old_seq, new_seq); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 void dbox_sync_rebuild_index_metadata(struct dbox_sync_rebuild_context *ctx, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 uint32_t new_seq, uint32_t uid) |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 uint32_t old_seq; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 if (mail_index_lookup_seq(ctx->view, uid, &old_seq)) { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 /* the message exists in the old index. |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 copy the metadata from it. */ |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 dbox_sync_index_copy_from_old(ctx, ctx->view, old_seq, new_seq); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 } else if (ctx->backup_view != NULL && |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 mail_index_lookup_seq(ctx->backup_view, uid, &old_seq)) { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 /* copy the metadata from backup index. */ |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 dbox_sync_index_copy_from_old(ctx, ctx->backup_view, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 old_seq, new_seq); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 |
10828
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
92 static void dbox_sync_rebuild_header(struct dbox_sync_rebuild_context *ctx) |
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
93 { |
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
94 const struct mail_index_header *hdr, *backup_hdr; |
10844
3bfb1e9f556b
dbox index rebuild: Fixed setting next-uid and highest-modseq.
Timo Sirainen <tss@iki.fi>
parents:
10828
diff
changeset
|
95 struct mail_index *index = mail_index_view_get_index(ctx->view); |
3bfb1e9f556b
dbox index rebuild: Fixed setting next-uid and highest-modseq.
Timo Sirainen <tss@iki.fi>
parents:
10828
diff
changeset
|
96 struct mail_index_modseq_header modseq_hdr; |
10828
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
97 uint32_t uid_validity, next_uid; |
10844
3bfb1e9f556b
dbox index rebuild: Fixed setting next-uid and highest-modseq.
Timo Sirainen <tss@iki.fi>
parents:
10828
diff
changeset
|
98 uint64_t modseq; |
10828
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
99 |
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
100 hdr = mail_index_get_header(ctx->view); |
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
101 backup_hdr = ctx->backup_view == NULL ? NULL : |
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
102 mail_index_get_header(ctx->backup_view); |
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
103 |
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
104 /* set uidvalidity */ |
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
105 if (hdr->uid_validity != 0) |
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
106 uid_validity = hdr->uid_validity; |
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
107 else if (backup_hdr != NULL && backup_hdr->uid_validity != 0) |
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
108 uid_validity = backup_hdr->uid_validity; |
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
109 else |
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
110 uid_validity = dbox_get_uidvalidity_next(ctx->box->list); |
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
111 mail_index_update_header(ctx->trans, |
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
112 offsetof(struct mail_index_header, uid_validity), |
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
113 &uid_validity, sizeof(uid_validity), TRUE); |
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
114 |
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
115 /* set next-uid */ |
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
116 if (hdr->next_uid != 0) |
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
117 next_uid = hdr->next_uid; |
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
118 else if (backup_hdr != NULL && backup_hdr->next_uid != 0) |
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
119 next_uid = backup_hdr->next_uid; |
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
120 else |
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
121 next_uid = dbox_get_uidvalidity_next(ctx->box->list); |
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
122 mail_index_update_header(ctx->trans, |
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
123 offsetof(struct mail_index_header, next_uid), |
10844
3bfb1e9f556b
dbox index rebuild: Fixed setting next-uid and highest-modseq.
Timo Sirainen <tss@iki.fi>
parents:
10828
diff
changeset
|
124 &next_uid, sizeof(next_uid), FALSE); |
10828
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
125 |
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
126 /* set highest-modseq */ |
10844
3bfb1e9f556b
dbox index rebuild: Fixed setting next-uid and highest-modseq.
Timo Sirainen <tss@iki.fi>
parents:
10828
diff
changeset
|
127 memset(&modseq_hdr, 0, sizeof(modseq_hdr)); |
3bfb1e9f556b
dbox index rebuild: Fixed setting next-uid and highest-modseq.
Timo Sirainen <tss@iki.fi>
parents:
10828
diff
changeset
|
128 modseq_hdr.highest_modseq = mail_index_modseq_get_highest(ctx->view); |
10828
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
129 if (ctx->backup_view != NULL) { |
10844
3bfb1e9f556b
dbox index rebuild: Fixed setting next-uid and highest-modseq.
Timo Sirainen <tss@iki.fi>
parents:
10828
diff
changeset
|
130 modseq = mail_index_modseq_get_highest(ctx->backup_view); |
3bfb1e9f556b
dbox index rebuild: Fixed setting next-uid and highest-modseq.
Timo Sirainen <tss@iki.fi>
parents:
10828
diff
changeset
|
131 if (modseq_hdr.highest_modseq < modseq) |
3bfb1e9f556b
dbox index rebuild: Fixed setting next-uid and highest-modseq.
Timo Sirainen <tss@iki.fi>
parents:
10828
diff
changeset
|
132 modseq_hdr.highest_modseq = modseq; |
10828
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
133 } |
10844
3bfb1e9f556b
dbox index rebuild: Fixed setting next-uid and highest-modseq.
Timo Sirainen <tss@iki.fi>
parents:
10828
diff
changeset
|
134 mail_index_update_header_ext(ctx->trans, index->modseq_ext_id, |
3bfb1e9f556b
dbox index rebuild: Fixed setting next-uid and highest-modseq.
Timo Sirainen <tss@iki.fi>
parents:
10828
diff
changeset
|
135 0, &modseq_hdr, sizeof(modseq_hdr)); |
10828
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
136 } |
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
137 |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 struct dbox_sync_rebuild_context * |
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
|
139 dbox_sync_index_rebuild_init(struct mailbox *box, |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 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
|
141 struct mail_index_transaction *trans) |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 struct dbox_sync_rebuild_context *ctx; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
144 const char *index_dir; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
145 enum mail_index_open_flags open_flags = MAIL_INDEX_OPEN_FLAG_READONLY; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
146 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
147 ctx = i_new(struct dbox_sync_rebuild_context, 1); |
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
|
148 ctx->box = box; |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 ctx->view = view; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 ctx->trans = trans; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 mail_index_reset(ctx->trans); |
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
|
152 index_mailbox_reset_uidvalidity(box); |
10657
e7f066508299
lib-storage: Moved struct mail_index_* from index_mailbox to mailbox.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
153 mail_index_ext_lookup(box->index, "cache", &ctx->cache_ext_id); |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
154 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
155 /* if backup index file exists, try to use it */ |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
156 index_dir = mailbox_list_get_path(box->list, box->name, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
157 MAILBOX_LIST_PATH_TYPE_INDEX); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
158 ctx->backup_index = |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
159 mail_index_alloc(index_dir, DBOX_INDEX_PREFIX".backup"); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
160 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
161 #ifndef MMAP_CONFLICTS_WRITE |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
162 if (box->storage->set->mmap_disable) |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
163 #endif |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
164 open_flags |= MAIL_INDEX_OPEN_FLAG_MMAP_DISABLE; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
165 if (mail_index_open(ctx->backup_index, open_flags, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
166 box->storage->set->parsed_lock_method) <= 0) |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 mail_index_free(&ctx->backup_index); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 else |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
169 ctx->backup_view = mail_index_view_open(ctx->backup_index); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
170 return ctx; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
173 void dbox_sync_index_rebuild_deinit(struct dbox_sync_rebuild_context **_ctx) |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
174 { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 struct dbox_sync_rebuild_context *ctx = *_ctx; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
177 *_ctx = NULL; |
10828
154f52b7a6fd
[m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents:
10677
diff
changeset
|
178 dbox_sync_rebuild_header(ctx); |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 if (ctx->backup_index != NULL) { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
180 mail_index_view_close(&ctx->backup_view); |
10677
93fe3aa23bdb
lib-index: Don't close index files if they're still being used by another mailbox.
Timo Sirainen <tss@iki.fi>
parents:
10660
diff
changeset
|
181 mail_index_close(ctx->backup_index); |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
182 mail_index_free(&ctx->backup_index); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
183 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
184 i_free(ctx); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 } |