annotate src/lib-storage/index/dbox-common/dbox-sync-rebuild.c @ 14037:aed3379df476

lib-storage: mailbox_list_mkdir_root() API changed. Use it now for creating mail root dir. It was supposed to be used for it previously, but wasn't..
author Timo Sirainen <tss@iki.fi>
date Wed, 01 Feb 2012 20:10:42 +0200
parents c4bac1e48611
children d8d214cc1936
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12782
447bce266022 Updated copyright notices to include year 2011.
Timo Sirainen <tss@iki.fi>
parents: 12740
diff changeset
1 /* Copyright (c) 2007-2011 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"
12740
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
6 #include "mailbox-list-private.h"
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #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
8 #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
9 #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
10
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 static void
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 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
13 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
14 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
15 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 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
17 const void *data;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 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
19 bool expunged;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 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
22 return;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 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
25 &map, &data, &expunged);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 if (expunged)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 return;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 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
30 &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
31 return;
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 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
34 /* set reset id */
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 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
36 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
37 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
38 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
39 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 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
41 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
42 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
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
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 static void
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 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
48 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
49 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
50 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 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
52 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
53 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
54 struct mail_keywords *kw;
10828
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
55 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
56
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 /* copy flags */
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 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
59 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
60 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
61
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 /* copy keywords */
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 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
64 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
65 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
66 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
67 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
68
10828
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
69 /* copy modseq */
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
70 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
71 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
72
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 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
74 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 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
77 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
78 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 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
80
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 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
82 /* 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
83 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
84 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
85 } 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
86 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
87 /* 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
88 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
89 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
90 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92
10828
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
93 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
94 {
11026
cf302ede55bc dbox: When rebuilding index, don't try to shrink next_uid.
Timo Sirainen <tss@iki.fi>
parents: 10844
diff changeset
95 const struct mail_index_header *hdr, *backup_hdr, *trans_hdr;
10844
3bfb1e9f556b dbox index rebuild: Fixed setting next-uid and highest-modseq.
Timo Sirainen <tss@iki.fi>
parents: 10828
diff changeset
96 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
97 struct mail_index_modseq_header modseq_hdr;
11026
cf302ede55bc dbox: When rebuilding index, don't try to shrink next_uid.
Timo Sirainen <tss@iki.fi>
parents: 10844
diff changeset
98 struct mail_index_view *trans_view;
10828
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
99 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
100 uint64_t modseq;
10828
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
101
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
102 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
103 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
104 mail_index_get_header(ctx->backup_view);
11026
cf302ede55bc dbox: When rebuilding index, don't try to shrink next_uid.
Timo Sirainen <tss@iki.fi>
parents: 10844
diff changeset
105 trans_view = mail_index_transaction_open_updated_view(ctx->trans);
cf302ede55bc dbox: When rebuilding index, don't try to shrink next_uid.
Timo Sirainen <tss@iki.fi>
parents: 10844
diff changeset
106 trans_hdr = mail_index_get_header(trans_view);
10828
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
107
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
108 /* set uidvalidity */
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
109 if (hdr->uid_validity != 0)
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
110 uid_validity = hdr->uid_validity;
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
111 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
112 uid_validity = backup_hdr->uid_validity;
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
113 else
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
114 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
115 mail_index_update_header(ctx->trans,
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
116 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
117 &uid_validity, sizeof(uid_validity), TRUE);
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
118
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
119 /* set next-uid */
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
120 if (hdr->next_uid != 0)
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
121 next_uid = hdr->next_uid;
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
122 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
123 next_uid = backup_hdr->next_uid;
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
124 else
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
125 next_uid = dbox_get_uidvalidity_next(ctx->box->list);
11026
cf302ede55bc dbox: When rebuilding index, don't try to shrink next_uid.
Timo Sirainen <tss@iki.fi>
parents: 10844
diff changeset
126 if (next_uid > trans_hdr->next_uid) {
cf302ede55bc dbox: When rebuilding index, don't try to shrink next_uid.
Timo Sirainen <tss@iki.fi>
parents: 10844
diff changeset
127 mail_index_update_header(ctx->trans,
cf302ede55bc dbox: When rebuilding index, don't try to shrink next_uid.
Timo Sirainen <tss@iki.fi>
parents: 10844
diff changeset
128 offsetof(struct mail_index_header, next_uid),
cf302ede55bc dbox: When rebuilding index, don't try to shrink next_uid.
Timo Sirainen <tss@iki.fi>
parents: 10844
diff changeset
129 &next_uid, sizeof(next_uid), FALSE);
cf302ede55bc dbox: When rebuilding index, don't try to shrink next_uid.
Timo Sirainen <tss@iki.fi>
parents: 10844
diff changeset
130 }
10828
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
131
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
132 /* set highest-modseq */
10844
3bfb1e9f556b dbox index rebuild: Fixed setting next-uid and highest-modseq.
Timo Sirainen <tss@iki.fi>
parents: 10828
diff changeset
133 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
134 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
135 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
136 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
137 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
138 modseq_hdr.highest_modseq = modseq;
10828
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
139 }
10844
3bfb1e9f556b dbox index rebuild: Fixed setting next-uid and highest-modseq.
Timo Sirainen <tss@iki.fi>
parents: 10828
diff changeset
140 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
141 0, &modseq_hdr, sizeof(modseq_hdr));
11026
cf302ede55bc dbox: When rebuilding index, don't try to shrink next_uid.
Timo Sirainen <tss@iki.fi>
parents: 10844
diff changeset
142 mail_index_view_close(&trans_view);
10828
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
143 }
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
144
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 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
146 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
147 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
148 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
149 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
150 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
151 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
152 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
153
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154 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
155 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
156 ctx->view = view;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157 ctx->trans = trans;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158 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
159 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
160 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
161
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162 /* 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
163 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
164 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
165 ctx->backup_index =
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166 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
167
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168 #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
169 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
170 #endif
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
171 open_flags |= MAIL_INDEX_OPEN_FLAG_MMAP_DISABLE;
11623
c3ee4421e86a Added mail_max_lock_timeout setting.
Timo Sirainen <tss@iki.fi>
parents: 11026
diff changeset
172 mail_index_set_lock_method(ctx->backup_index,
c3ee4421e86a Added mail_max_lock_timeout setting.
Timo Sirainen <tss@iki.fi>
parents: 11026
diff changeset
173 box->storage->set->parsed_lock_method, -1U);
c3ee4421e86a Added mail_max_lock_timeout setting.
Timo Sirainen <tss@iki.fi>
parents: 11026
diff changeset
174 if (mail_index_open(ctx->backup_index, open_flags) <= 0)
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
175 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
176 else
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 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
178 return ctx;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
179 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
181 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
182 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183 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
184
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
185 *_ctx = NULL;
10828
154f52b7a6fd [m]dbox: Fixes to rebuilding a broken index.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
186 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
187 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
188 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
189 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
190 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
191 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
192 i_free(ctx);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193 }
12740
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
194
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
195 int dbox_sync_rebuild_verify_alt_storage(struct mailbox_list *list)
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
196 {
14037
aed3379df476 lib-storage: mailbox_list_mkdir_root() API changed. Use it now for creating mail root dir.
Timo Sirainen <tss@iki.fi>
parents: 13091
diff changeset
197 const char *alt_path, *error;
12740
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
198 struct stat st;
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
199
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
200 alt_path = mailbox_list_get_path(list, NULL,
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
201 MAILBOX_LIST_PATH_TYPE_ALT_DIR);
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
202 if (alt_path == NULL)
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
203 return 0;
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
204
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
205 /* make sure alt storage is mounted. if it's not, abort the rebuild. */
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
206 if (stat(alt_path, &st) == 0)
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
207 return 0;
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
208 if (errno != ENOENT) {
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
209 i_error("stat(%s) failed: %m", alt_path);
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
210 return -1;
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
211 }
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
212
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
213 /* try to create the alt directory. if it fails, it means alt
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
214 storage isn't mounted. */
13091
c4bac1e48611 lib-storage: mkdir APIs changed.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
215 if (mailbox_list_mkdir_root(list, alt_path,
14037
aed3379df476 lib-storage: mailbox_list_mkdir_root() API changed. Use it now for creating mail root dir.
Timo Sirainen <tss@iki.fi>
parents: 13091
diff changeset
216 MAILBOX_LIST_PATH_TYPE_ALT_DIR,
aed3379df476 lib-storage: mailbox_list_mkdir_root() API changed. Use it now for creating mail root dir.
Timo Sirainen <tss@iki.fi>
parents: 13091
diff changeset
217 &error) < 0) {
aed3379df476 lib-storage: mailbox_list_mkdir_root() API changed. Use it now for creating mail root dir.
Timo Sirainen <tss@iki.fi>
parents: 13091
diff changeset
218 i_error("Couldn't create dbox alt root dir %s: %s",
aed3379df476 lib-storage: mailbox_list_mkdir_root() API changed. Use it now for creating mail root dir.
Timo Sirainen <tss@iki.fi>
parents: 13091
diff changeset
219 alt_path, error);
12740
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
220 return -1;
14037
aed3379df476 lib-storage: mailbox_list_mkdir_root() API changed. Use it now for creating mail root dir.
Timo Sirainen <tss@iki.fi>
parents: 13091
diff changeset
221 }
12740
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
222 return 0;
159605040ec0 dbox index rebuild: If alt dir isn't mounted (can't be mkdir()ed), abort rebuild.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
223 }