annotate src/lib-storage/index/dbox-multi/mdbox-storage.h @ 12586:a2780b694b2d

lib-storage: mailbox_alloc() now takes a virtual mailbox name and other related API changes. All storage_name <-> vname conversions now go through the same two mailbox_list methods. This has many benefits, such as: * listescape plugin is now much simpler and bugfree * allows changing lib-storage API to use UTF-8 mailbox names in future * allows creation of "mailbox aliases" plugin
author Timo Sirainen <tss@iki.fi>
date Thu, 20 Jan 2011 20:59:07 +0200
parents b884441a713f
children 957060ca5b69
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1 #ifndef MDBOX_STORAGE_H
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2 #define MDBOX_STORAGE_H
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #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
5 #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
6 #include "mdbox-settings.h"
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #define MDBOX_STORAGE_NAME "mdbox"
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #define MDBOX_GLOBAL_INDEX_PREFIX "dovecot.map.index"
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #define MDBOX_GLOBAL_DIR_NAME "storage"
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 #define MDBOX_MAIL_FILE_PREFIX "m."
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #define MDBOX_MAIL_FILE_FORMAT MDBOX_MAIL_FILE_PREFIX"%u"
10868
863eafcf8428 mdbox: Removed mdbox_max_open_files setting.
Timo Sirainen <tss@iki.fi>
parents: 10690
diff changeset
13 #define MDBOX_MAX_OPEN_UNUSED_FILES 2
863eafcf8428 mdbox: Removed mdbox_max_open_files setting.
Timo Sirainen <tss@iki.fi>
parents: 10690
diff changeset
14 #define MDBOX_CLOSE_UNUSED_FILES_TIMEOUT_SECS 30
9977
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 #define MDBOX_INDEX_HEADER_MIN_SIZE (sizeof(uint32_t))
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 struct mdbox_index_header {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 uint32_t map_uid_validity;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 uint8_t mailbox_guid[MAIL_GUID_128_SIZE];
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
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 struct mdbox_storage {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 struct dbox_storage storage;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 const struct mdbox_settings *set;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 /* paths for storage directories */
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 const char *storage_dir, *alt_storage_dir;
11218
ac62dbb6a355 mdbox: Renamed dbox_map* to mdbox_map*.
Timo Sirainen <tss@iki.fi>
parents: 11216
diff changeset
28 struct mdbox_map *map;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 ARRAY_DEFINE(open_files, struct mdbox_file *);
10868
863eafcf8428 mdbox: Removed mdbox_max_open_files setting.
Timo Sirainen <tss@iki.fi>
parents: 10690
diff changeset
31 struct timeout *to_close_unused_files;
10975
52d9b2d8c1e8 mdbox: Do delayed storage rebuild when closing mailbox.
Timo Sirainen <tss@iki.fi>
parents: 10868
diff changeset
32
11177
a92389387cb7 mdbox: Moving messages to alt storage is done done with doveadm altmove command.
Timo Sirainen <tss@iki.fi>
parents: 10975
diff changeset
33 ARRAY_TYPE(uint32_t) move_to_alt_map_uids;
a92389387cb7 mdbox: Moving messages to alt storage is done done with doveadm altmove command.
Timo Sirainen <tss@iki.fi>
parents: 10975
diff changeset
34 ARRAY_TYPE(uint32_t) move_from_alt_map_uids;
a92389387cb7 mdbox: Moving messages to alt storage is done done with doveadm altmove command.
Timo Sirainen <tss@iki.fi>
parents: 10975
diff changeset
35
11216
de0ed7bea201 mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents: 11177
diff changeset
36 /* if non-zero, storage should be rebuilt (except if rebuild_count
de0ed7bea201 mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents: 11177
diff changeset
37 has changed from this value) */
de0ed7bea201 mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents: 11177
diff changeset
38 uint32_t corrupted_rebuild_count;
de0ed7bea201 mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents: 11177
diff changeset
39
de0ed7bea201 mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents: 11177
diff changeset
40 unsigned int corrupted:1;
10975
52d9b2d8c1e8 mdbox: Do delayed storage rebuild when closing mailbox.
Timo Sirainen <tss@iki.fi>
parents: 10868
diff changeset
41 unsigned int rebuilding_storage:1;
12320
b884441a713f mdbox: Added mdbox_preallocate_space setting to preallocate size for newly created files.
Timo Sirainen <tss@iki.fi>
parents: 11476
diff changeset
42 unsigned int preallocate_space:1;
9977
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 struct mdbox_mail_index_record {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 uint32_t map_uid;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 /* UNIX timestamp of when the message was saved/copied to this
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 mailbox */
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 uint32_t save_date;
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
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 struct mdbox_mailbox {
10660
56b1d4dd9c7d lib-storage: *_mailboxes don't descend from index_mailbox anymore, it's now a context.
Timo Sirainen <tss@iki.fi>
parents: 10367
diff changeset
53 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
54 struct mdbox_storage *storage;
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 uint32_t map_uid_validity;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 uint32_t ext_id, hdr_ext_id, guid_ext_id;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 unsigned int creating:1;
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
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 extern struct mail_vfuncs mdbox_mail_vfuncs;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 int mdbox_mail_open(struct dbox_mail *mail, uoff_t *offset_r,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 struct dbox_file **file_r);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 /* Get map_uid for wanted message. */
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 int mdbox_mail_lookup(struct mdbox_mailbox *mbox, 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
69 uint32_t seq, uint32_t *map_uid_r);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 uint32_t dbox_get_uidvalidity_next(struct mailbox_list *list);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71 int mdbox_read_header(struct mdbox_mailbox *mbox,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 struct mdbox_index_header *hdr);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 void mdbox_update_header(struct mdbox_mailbox *mbox,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 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
75 const struct mailbox_update *update);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 struct mail_save_context *
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 mdbox_save_alloc(struct mailbox_transaction_context *_t);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 int mdbox_save_begin(struct mail_save_context *ctx, struct istream *input);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 int mdbox_save_finish(struct mail_save_context *ctx);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 void mdbox_save_cancel(struct mail_save_context *ctx);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 struct dbox_file *
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 mdbox_save_file_get_file(struct mailbox_transaction_context *t,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 uint32_t seq, uoff_t *offset_r);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 int mdbox_transaction_save_commit_pre(struct mail_save_context *ctx);
10367
75d3d4374dda Transaction commits can now track how many uid/modseq updates were ignored.
Timo Sirainen <tss@iki.fi>
parents: 9977
diff changeset
88 void mdbox_transaction_save_commit_post(struct mail_save_context *ctx,
75d3d4374dda Transaction commits can now track how many uid/modseq updates were ignored.
Timo Sirainen <tss@iki.fi>
parents: 9977
diff changeset
89 struct mail_index_transaction_commit_result *result);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 void mdbox_transaction_save_rollback(struct mail_save_context *ctx);
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 int mdbox_copy(struct mail_save_context *ctx, struct mail *mail);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93
11177
a92389387cb7 mdbox: Moving messages to alt storage is done done with doveadm altmove command.
Timo Sirainen <tss@iki.fi>
parents: 10975
diff changeset
94 void mdbox_purge_alt_flag_change(struct mail *mail, bool move_to_alt);
a92389387cb7 mdbox: Moving messages to alt storage is done done with doveadm altmove command.
Timo Sirainen <tss@iki.fi>
parents: 10975
diff changeset
95 int mdbox_purge(struct mail_storage *storage);
a92389387cb7 mdbox: Moving messages to alt storage is done done with doveadm altmove command.
Timo Sirainen <tss@iki.fi>
parents: 10975
diff changeset
96
11216
de0ed7bea201 mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents: 11177
diff changeset
97 void mdbox_storage_set_corrupted(struct mdbox_storage *storage);
de0ed7bea201 mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents: 11177
diff changeset
98
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99 #endif