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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }