annotate src/lib-index/mail-index.c @ 6755:b3de2053937f HEAD

mail_index_refresh(): If index is in memory, we should still refresh the map in case we ourself had committed transactions. Also don't bother checking if index is exclusively locked, it never happens anymore.
author Timo Sirainen <tss@iki.fi>
date Sat, 10 Nov 2007 17:40:11 +0200
parents 3e189cbb7e7a
children a59deefc552f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6429
65c69a53a7be Replaced my Copyright notices. The year range always ends with 2007 now.
Timo Sirainen <tss@iki.fi>
parents: 6428
diff changeset
1 /* Copyright (c) 2003-2007 Dovecot authors, see the included COPYING file */
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
5819
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5775
diff changeset
4 #include "ioloop.h"
3470
346a494c2feb Moved array declaration to array-decl.h and include it in lib.h. So array.h
Timo Sirainen <tss@iki.fi>
parents: 3445
diff changeset
5 #include "array.h"
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "buffer.h"
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
7 #include "hash.h"
6384
2c8b1d487728 Make sure the extension name doesn't contain control characters. It most
Timo Sirainen <tss@iki.fi>
parents: 6378
diff changeset
8 #include "str-sanitize.h"
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "mmap-util.h"
4071
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents: 4067
diff changeset
10 #include "nfs-workarounds.h"
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
11 #include "read-full.h"
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #include "write-full.h"
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include "mail-index-private.h"
5272
82b4a055e109 mmap_disable=yes crashes with recent changes.
Timo Sirainen <tss@iki.fi>
parents: 5247
diff changeset
14 #include "mail-index-view-private.h"
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
15 #include "mail-index-sync-private.h"
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 #include "mail-transaction-log.h"
2200
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
17 #include "mail-cache.h"
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 #include <stdio.h>
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 #include <stddef.h>
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 #include <time.h>
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
22 #include <sys/stat.h>
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
23
5453
a0a1432bb4e8 Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents: 5430
diff changeset
24 struct mail_index_module_register mail_index_module_register = { 0 };
4453
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
25
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 struct mail_index *mail_index_alloc(const char *dir, const char *prefix)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 struct mail_index *index;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 index = i_new(struct mail_index, 1);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 index->dir = i_strdup(dir);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 index->prefix = i_strdup(prefix);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 index->fd = -1;
2116
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
34
5028
774c965ac79a Memory pool size changes
Timo Sirainen <tss@iki.fi>
parents: 5024
diff changeset
35 index->extension_pool =
774c965ac79a Memory pool size changes
Timo Sirainen <tss@iki.fi>
parents: 5024
diff changeset
36 pool_alloconly_create(MEMPOOL_GROWING"index extension", 1024);
4596
bf4e98a0de3f Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents: 4594
diff changeset
37 p_array_init(&index->extensions, index->extension_pool, 5);
bf4e98a0de3f Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents: 4594
diff changeset
38 i_array_init(&index->sync_lost_handlers, 4);
5453
a0a1432bb4e8 Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents: 5430
diff changeset
39 i_array_init(&index->module_contexts,
a0a1432bb4e8 Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents: 5430
diff changeset
40 I_MIN(5, mail_index_module_register.id));
4453
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
41
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 index->mode = 0600;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 index->gid = (gid_t)-1;
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
44
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
45 index->keywords_ext_id =
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
46 mail_index_ext_register(index, "keywords", 128, 2, 1);
3086
66c44404f9a1 Keyword fixes.
Timo Sirainen <tss@iki.fi>
parents: 3016
diff changeset
47 index->keywords_pool = pool_alloconly_create("keywords", 512);
4596
bf4e98a0de3f Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents: 4594
diff changeset
48 i_array_init(&index->keywords, 16);
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
49 index->keywords_hash =
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
50 hash_create(default_pool, index->keywords_pool, 0,
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
51 strcase_hash, (hash_cmp_callback_t *)strcasecmp);
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
52 index->log = mail_transaction_log_alloc(index);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 return index;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
56 void mail_index_free(struct mail_index **_index)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 {
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
58 struct mail_index *index = *_index;
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
59
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
60 *_index = NULL;
1967
b6d900688c55 memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 1965
diff changeset
61 mail_index_close(index);
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
62
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
63 mail_transaction_log_free(&index->log);
6417
047d0d8bbf0a hash_destroy() and hash_iterate_deinit() now take ** pointer.
Timo Sirainen <tss@iki.fi>
parents: 6390
diff changeset
64 hash_destroy(&index->keywords_hash);
6428
7cad076906eb pool_unref() now takes ** pointer.
Timo Sirainen <tss@iki.fi>
parents: 6417
diff changeset
65 pool_unref(&index->extension_pool);
7cad076906eb pool_unref() now takes ** pointer.
Timo Sirainen <tss@iki.fi>
parents: 6417
diff changeset
66 pool_unref(&index->keywords_pool);
1967
b6d900688c55 memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 1965
diff changeset
67
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
68 array_free(&index->sync_lost_handlers);
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
69 array_free(&index->keywords);
5453
a0a1432bb4e8 Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents: 5430
diff changeset
70 array_free(&index->module_contexts);
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
71
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 i_free(index->error);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 i_free(index->dir);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 i_free(index->prefix);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 i_free(index);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77
6736
3e189cbb7e7a fsync transaction commits only if the transaction contains change types
Timo Sirainen <tss@iki.fi>
parents: 6686
diff changeset
78 void mail_index_set_fsync_types(struct mail_index *index,
3e189cbb7e7a fsync transaction commits only if the transaction contains change types
Timo Sirainen <tss@iki.fi>
parents: 6686
diff changeset
79 enum mail_index_sync_type fsync_mask)
3e189cbb7e7a fsync transaction commits only if the transaction contains change types
Timo Sirainen <tss@iki.fi>
parents: 6686
diff changeset
80 {
3e189cbb7e7a fsync transaction commits only if the transaction contains change types
Timo Sirainen <tss@iki.fi>
parents: 6686
diff changeset
81 index->fsync_mask = fsync_mask;
3e189cbb7e7a fsync transaction commits only if the transaction contains change types
Timo Sirainen <tss@iki.fi>
parents: 6686
diff changeset
82 }
3e189cbb7e7a fsync transaction commits only if the transaction contains change types
Timo Sirainen <tss@iki.fi>
parents: 6686
diff changeset
83
2650
9b78674428f5 Get index file mode and GID from dovecot-shared file.
Timo Sirainen <tss@iki.fi>
parents: 2618
diff changeset
84 void mail_index_set_permissions(struct mail_index *index,
9b78674428f5 Get index file mode and GID from dovecot-shared file.
Timo Sirainen <tss@iki.fi>
parents: 2618
diff changeset
85 mode_t mode, gid_t gid)
9b78674428f5 Get index file mode and GID from dovecot-shared file.
Timo Sirainen <tss@iki.fi>
parents: 2618
diff changeset
86 {
9b78674428f5 Get index file mode and GID from dovecot-shared file.
Timo Sirainen <tss@iki.fi>
parents: 2618
diff changeset
87 index->mode = mode & 0666;
9b78674428f5 Get index file mode and GID from dovecot-shared file.
Timo Sirainen <tss@iki.fi>
parents: 2618
diff changeset
88 index->gid = gid;
9b78674428f5 Get index file mode and GID from dovecot-shared file.
Timo Sirainen <tss@iki.fi>
parents: 2618
diff changeset
89 }
9b78674428f5 Get index file mode and GID from dovecot-shared file.
Timo Sirainen <tss@iki.fi>
parents: 2618
diff changeset
90
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
91 uint32_t mail_index_ext_register(struct mail_index *index, const char *name,
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
92 uint32_t default_hdr_size,
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
93 uint16_t default_record_size,
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
94 uint16_t default_record_align)
2114
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
95 {
3816
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
96 struct mail_index_registered_ext rext;
6679
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
97 uint32_t ext_id;
2115
f720b3f15333 Modifying extra_records should work now.
Timo Sirainen <tss@iki.fi>
parents: 2114
diff changeset
98
6384
2c8b1d487728 Make sure the extension name doesn't contain control characters. It most
Timo Sirainen <tss@iki.fi>
parents: 6378
diff changeset
99 if (strcmp(name, str_sanitize(name, -1)) != 0)
2c8b1d487728 Make sure the extension name doesn't contain control characters. It most
Timo Sirainen <tss@iki.fi>
parents: 6378
diff changeset
100 i_panic("mail_index_ext_register(%s): Invalid name", name);
2c8b1d487728 Make sure the extension name doesn't contain control characters. It most
Timo Sirainen <tss@iki.fi>
parents: 6378
diff changeset
101
6679
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
102 if (mail_index_ext_lookup(index, name, &ext_id))
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
103 return ext_id;
2116
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
104
3816
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
105 memset(&rext, 0, sizeof(rext));
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
106 rext.name = p_strdup(index->extension_pool, name);
6679
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
107 rext.index_idx = array_count(&index->extensions);
3816
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
108 rext.hdr_size = default_hdr_size;
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
109 rext.record_size = default_record_size;
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
110 rext.record_align = default_record_align;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
111
3816
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
112 array_append(&index->extensions, &rext, 1);
6679
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
113 return rext.index_idx;
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
114 }
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
115
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
116 bool mail_index_ext_lookup(struct mail_index *index, const char *name,
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
117 uint32_t *ext_id_r)
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
118 {
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
119 const struct mail_index_registered_ext *extensions;
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
120 unsigned int i, count;
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
121
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
122 extensions = array_get(&index->extensions, &count);
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
123 for (i = 0; i < count; i++) {
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
124 if (strcmp(extensions[i].name, name) == 0) {
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
125 *ext_id_r = i;
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
126 return TRUE;
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
127 }
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
128 }
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
129
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
130 *ext_id_r = (uint32_t)-1;
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
131 return FALSE;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
132 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
133
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
134 void mail_index_register_expunge_handler(struct mail_index *index,
4903
204d7edc7cdc Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents: 4876
diff changeset
135 uint32_t ext_id, bool call_always,
4490
56d17f2e1d66 Added support for calling expunge handler for an extension even if the
Timo Sirainen <tss@iki.fi>
parents: 4453
diff changeset
136 mail_index_expunge_handler_t *cb,
4903
204d7edc7cdc Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents: 4876
diff changeset
137 void *context)
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
138 {
3817
dc560ef2654b Moved expunge handlers to mail_index_registered_ext.
Timo Sirainen <tss@iki.fi>
parents: 3816
diff changeset
139 struct mail_index_registered_ext *rext;
3224
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
140
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4396
diff changeset
141 rext = array_idx_modifiable(&index->extensions, ext_id);
4616
b0966236fda7 Memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 4596
diff changeset
142 i_assert(rext->expunge_handler == NULL || rext->expunge_handler == cb);
3224
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
143
3817
dc560ef2654b Moved expunge handlers to mail_index_registered_ext.
Timo Sirainen <tss@iki.fi>
parents: 3816
diff changeset
144 rext->expunge_handler = cb;
4490
56d17f2e1d66 Added support for calling expunge handler for an extension even if the
Timo Sirainen <tss@iki.fi>
parents: 4453
diff changeset
145 rext->expunge_context = context;
56d17f2e1d66 Added support for calling expunge handler for an extension even if the
Timo Sirainen <tss@iki.fi>
parents: 4453
diff changeset
146 rext->expunge_handler_call_always = call_always;
3224
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
147 }
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
148
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
149 void mail_index_unregister_expunge_handler(struct mail_index *index,
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
150 uint32_t ext_id)
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
151 {
3817
dc560ef2654b Moved expunge handlers to mail_index_registered_ext.
Timo Sirainen <tss@iki.fi>
parents: 3816
diff changeset
152 struct mail_index_registered_ext *rext;
3224
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
153
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4396
diff changeset
154 rext = array_idx_modifiable(&index->extensions, ext_id);
3817
dc560ef2654b Moved expunge handlers to mail_index_registered_ext.
Timo Sirainen <tss@iki.fi>
parents: 3816
diff changeset
155 i_assert(rext->expunge_handler != NULL);
3224
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
156
3817
dc560ef2654b Moved expunge handlers to mail_index_registered_ext.
Timo Sirainen <tss@iki.fi>
parents: 3816
diff changeset
157 rext->expunge_handler = NULL;
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
158 }
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
159
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
160 void mail_index_register_sync_handler(struct mail_index *index, uint32_t ext_id,
2869
d2daf90c79f1 Cache invalidating needed to hook into view syncing as well.
Timo Sirainen <tss@iki.fi>
parents: 2857
diff changeset
161 mail_index_sync_handler_t *cb,
d2daf90c79f1 Cache invalidating needed to hook into view syncing as well.
Timo Sirainen <tss@iki.fi>
parents: 2857
diff changeset
162 enum mail_index_sync_handler_type type)
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
163 {
3816
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
164 struct mail_index_registered_ext *rext;
2869
d2daf90c79f1 Cache invalidating needed to hook into view syncing as well.
Timo Sirainen <tss@iki.fi>
parents: 2857
diff changeset
165
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4396
diff changeset
166 rext = array_idx_modifiable(&index->extensions, ext_id);
3816
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
167 i_assert(rext->sync_handler.callback == NULL);
3224
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
168
3816
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
169 rext->sync_handler.callback = cb;
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
170 rext->sync_handler.type = type;
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
171 }
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
172
3224
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
173 void mail_index_unregister_sync_handler(struct mail_index *index,
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
174 uint32_t ext_id)
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
175 {
3816
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
176 struct mail_index_registered_ext *rext;
3224
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
177
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4396
diff changeset
178 rext = array_idx_modifiable(&index->extensions, ext_id);
3816
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
179 i_assert(rext->sync_handler.callback != NULL);
3224
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
180
3816
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
181 rext->sync_handler.callback = NULL;
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
182 rext->sync_handler.type = 0;
3224
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
183 }
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
184
2934
c3ae75597952 Added "sync lost" handlers which are called with mmap_disable=yes when index
Timo Sirainen <tss@iki.fi>
parents: 2926
diff changeset
185 void mail_index_register_sync_lost_handler(struct mail_index *index,
c3ae75597952 Added "sync lost" handlers which are called with mmap_disable=yes when index
Timo Sirainen <tss@iki.fi>
parents: 2926
diff changeset
186 mail_index_sync_lost_handler_t *cb)
c3ae75597952 Added "sync lost" handlers which are called with mmap_disable=yes when index
Timo Sirainen <tss@iki.fi>
parents: 2926
diff changeset
187 {
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
188 array_append(&index->sync_lost_handlers, &cb, 1);
2934
c3ae75597952 Added "sync lost" handlers which are called with mmap_disable=yes when index
Timo Sirainen <tss@iki.fi>
parents: 2926
diff changeset
189 }
c3ae75597952 Added "sync lost" handlers which are called with mmap_disable=yes when index
Timo Sirainen <tss@iki.fi>
parents: 2926
diff changeset
190
3224
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
191 void mail_index_unregister_sync_lost_handler(struct mail_index *index,
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
192 mail_index_sync_lost_handler_t *cb)
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
193 {
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
194 mail_index_sync_lost_handler_t *const *handlers;
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
195 unsigned int i, count;
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
196
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
197 handlers = array_get(&index->sync_lost_handlers, &count);
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
198 for (i = 0; i < count; i++) {
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
199 if (handlers[i] == cb) {
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
200 array_delete(&index->sync_lost_handlers, i, 1);
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
201 break;
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
202 }
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
203 }
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
204 }
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
205
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3833
diff changeset
206 bool mail_index_keyword_lookup(struct mail_index *index,
6335
a1c587d3d633 Removed autocreate parameter from mail_index_keyword_lookup(). Added a new
Timo Sirainen <tss@iki.fi>
parents: 6330
diff changeset
207 const char *keyword, unsigned int *idx_r)
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
208 {
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
209 void *value;
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
210
3818
6758c0f3c318 Comment updates and minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3817
diff changeset
211 /* keywords_hash keeps a name => index mapping of keywords.
6758c0f3c318 Comment updates and minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3817
diff changeset
212 Keywords are never removed from it, so the index values are valid
6758c0f3c318 Comment updates and minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3817
diff changeset
213 for the lifetime of the mail_index. */
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
214 if (hash_lookup_full(index->keywords_hash, keyword, NULL, &value)) {
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
215 *idx_r = POINTER_CAST_TO(value, unsigned int);
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
216 return TRUE;
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
217 }
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
218
6335
a1c587d3d633 Removed autocreate parameter from mail_index_keyword_lookup(). Added a new
Timo Sirainen <tss@iki.fi>
parents: 6330
diff changeset
219 *idx_r = (unsigned int)-1;
a1c587d3d633 Removed autocreate parameter from mail_index_keyword_lookup(). Added a new
Timo Sirainen <tss@iki.fi>
parents: 6330
diff changeset
220 return FALSE;
a1c587d3d633 Removed autocreate parameter from mail_index_keyword_lookup(). Added a new
Timo Sirainen <tss@iki.fi>
parents: 6330
diff changeset
221 }
a1c587d3d633 Removed autocreate parameter from mail_index_keyword_lookup(). Added a new
Timo Sirainen <tss@iki.fi>
parents: 6330
diff changeset
222
a1c587d3d633 Removed autocreate parameter from mail_index_keyword_lookup(). Added a new
Timo Sirainen <tss@iki.fi>
parents: 6330
diff changeset
223 void mail_index_keyword_lookup_or_create(struct mail_index *index,
a1c587d3d633 Removed autocreate parameter from mail_index_keyword_lookup(). Added a new
Timo Sirainen <tss@iki.fi>
parents: 6330
diff changeset
224 const char *keyword,
a1c587d3d633 Removed autocreate parameter from mail_index_keyword_lookup(). Added a new
Timo Sirainen <tss@iki.fi>
parents: 6330
diff changeset
225 unsigned int *idx_r)
a1c587d3d633 Removed autocreate parameter from mail_index_keyword_lookup(). Added a new
Timo Sirainen <tss@iki.fi>
parents: 6330
diff changeset
226 {
a1c587d3d633 Removed autocreate parameter from mail_index_keyword_lookup(). Added a new
Timo Sirainen <tss@iki.fi>
parents: 6330
diff changeset
227 char *keyword_dup;
a1c587d3d633 Removed autocreate parameter from mail_index_keyword_lookup(). Added a new
Timo Sirainen <tss@iki.fi>
parents: 6330
diff changeset
228
6350
e7f61751822e Added assert against empty keyword.
Timo Sirainen <tss@iki.fi>
parents: 6349
diff changeset
229 i_assert(*keyword != '\0');
e7f61751822e Added assert against empty keyword.
Timo Sirainen <tss@iki.fi>
parents: 6349
diff changeset
230
6335
a1c587d3d633 Removed autocreate parameter from mail_index_keyword_lookup(). Added a new
Timo Sirainen <tss@iki.fi>
parents: 6330
diff changeset
231 if (mail_index_keyword_lookup(index, keyword, idx_r))
a1c587d3d633 Removed autocreate parameter from mail_index_keyword_lookup(). Added a new
Timo Sirainen <tss@iki.fi>
parents: 6330
diff changeset
232 return;
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
233
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
234 keyword = keyword_dup = p_strdup(index->keywords_pool, keyword);
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
235 *idx_r = array_count(&index->keywords);
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
236
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
237 hash_insert(index->keywords_hash, keyword_dup, POINTER_CAST(*idx_r));
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
238 array_append(&index->keywords, &keyword, 1);
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
239 }
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
240
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4396
diff changeset
241 const ARRAY_TYPE(keywords) *mail_index_get_keywords(struct mail_index *index)
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
242 {
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
243 return &index->keywords;
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
244 }
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
245
5686
0d2a6a7f2a1b Moved mail index map related code to its own file.
Timo Sirainen <tss@iki.fi>
parents: 5666
diff changeset
246 int mail_index_try_open_only(struct mail_index *index)
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
247 {
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
248 i_assert(index->fd == -1);
3243
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
249 i_assert(!MAIL_INDEX_IS_IN_MEMORY(index));
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
250
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
251 /* Note that our caller must close index->fd by itself. */
6686
610f3d9813b5 Added MAIL_INDEX_OPEN_FLAG_READONLY.
Timo Sirainen <tss@iki.fi>
parents: 6679
diff changeset
252 if (index->readonly)
610f3d9813b5 Added MAIL_INDEX_OPEN_FLAG_READONLY.
Timo Sirainen <tss@iki.fi>
parents: 6679
diff changeset
253 errno = EACCES;
610f3d9813b5 Added MAIL_INDEX_OPEN_FLAG_READONLY.
Timo Sirainen <tss@iki.fi>
parents: 6679
diff changeset
254 else {
610f3d9813b5 Added MAIL_INDEX_OPEN_FLAG_READONLY.
Timo Sirainen <tss@iki.fi>
parents: 6679
diff changeset
255 index->fd = nfs_safe_open(index->filepath, O_RDWR);
610f3d9813b5 Added MAIL_INDEX_OPEN_FLAG_READONLY.
Timo Sirainen <tss@iki.fi>
parents: 6679
diff changeset
256 index->readonly = FALSE;
610f3d9813b5 Added MAIL_INDEX_OPEN_FLAG_READONLY.
Timo Sirainen <tss@iki.fi>
parents: 6679
diff changeset
257 }
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
258
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
259 if (index->fd == -1 && errno == EACCES) {
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
260 index->fd = open(index->filepath, O_RDONLY);
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
261 index->readonly = TRUE;
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
262 }
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
263
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
264 if (index->fd == -1) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
265 if (errno != ENOENT)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
266 return mail_index_set_syscall_error(index, "open()");
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
267
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
268 /* have to create it */
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
269 return 0;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
270 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
271 return 1;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
272 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
273
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
274 static int
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
275 mail_index_try_open(struct mail_index *index)
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
276 {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
277 int ret;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
278
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
279 i_assert(index->fd == -1);
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
280
3243
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
281 if (MAIL_INDEX_IS_IN_MEMORY(index))
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
282 return 0;
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
283
6165
6418139447fa Created a new struct mail_index_record_map which can be shared by multiple
Timo Sirainen <tss@iki.fi>
parents: 6022
diff changeset
284 i_assert(index->map == NULL || index->map->rec_map->lock_id == 0);
5854
eca7e29dce0d Rewrite index lock handling.
Timo Sirainen <tss@iki.fi>
parents: 5853
diff changeset
285 ret = mail_index_map(index, MAIL_INDEX_SYNC_HANDLER_HEAD);
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
286 if (ret == 0) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
287 /* it's corrupted - recreate it */
5820
e59892590a02 Handle losing index file better. Handle fsck better.
Timo Sirainen <tss@iki.fi>
parents: 5819
diff changeset
288 if (index->fd != -1) {
e59892590a02 Handle losing index file better. Handle fsck better.
Timo Sirainen <tss@iki.fi>
parents: 5819
diff changeset
289 if (close(index->fd) < 0)
e59892590a02 Handle losing index file better. Handle fsck better.
Timo Sirainen <tss@iki.fi>
parents: 5819
diff changeset
290 mail_index_set_syscall_error(index, "close()");
e59892590a02 Handle losing index file better. Handle fsck better.
Timo Sirainen <tss@iki.fi>
parents: 5819
diff changeset
291 index->fd = -1;
e59892590a02 Handle losing index file better. Handle fsck better.
Timo Sirainen <tss@iki.fi>
parents: 5819
diff changeset
292 }
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
293 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
294 return ret;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
295 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
296
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
297 int mail_index_create_tmp_file(struct mail_index *index, const char **path_r)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
298 {
2879
aa93c7216722 dovecot-shared file was supposed to show permissions/gid for files created
Timo Sirainen <tss@iki.fi>
parents: 2877
diff changeset
299 mode_t old_mask;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
300 const char *path;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
301 int fd;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
302
3243
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
303 i_assert(!MAIL_INDEX_IS_IN_MEMORY(index));
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
304
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
305 path = *path_r = t_strconcat(index->filepath, ".tmp", NULL);
2879
aa93c7216722 dovecot-shared file was supposed to show permissions/gid for files created
Timo Sirainen <tss@iki.fi>
parents: 2877
diff changeset
306 old_mask = umask(0);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
307 fd = open(path, O_RDWR|O_CREAT|O_TRUNC, index->mode);
2879
aa93c7216722 dovecot-shared file was supposed to show permissions/gid for files created
Timo Sirainen <tss@iki.fi>
parents: 2877
diff changeset
308 umask(old_mask);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
309 if (fd == -1)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
310 return mail_index_file_set_syscall_error(index, path, "open()");
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
311
2879
aa93c7216722 dovecot-shared file was supposed to show permissions/gid for files created
Timo Sirainen <tss@iki.fi>
parents: 2877
diff changeset
312 if (index->gid != (gid_t)-1 && fchown(fd, (uid_t)-1, index->gid) < 0) {
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
313 mail_index_file_set_syscall_error(index, path, "fchown()");
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
314 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
315 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
316
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
317 return fd;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
318 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
319
6375
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
320 static int mail_index_open_files(struct mail_index *index,
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
321 enum mail_index_open_flags flags)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
322 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
323 int ret;
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
324 bool created = FALSE;
3582
bfa542369fdc When creating a new index file, mark its log offsets so that the possibly
Timo Sirainen <tss@iki.fi>
parents: 3556
diff changeset
325
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
326 ret = mail_transaction_log_open(index->log);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
327 if (ret == 0) {
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
328 if ((flags & MAIL_INDEX_OPEN_FLAG_CREATE) == 0)
6375
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
329 return 0;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
330
5819
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5775
diff changeset
331 /* if dovecot.index exists, read it first so that we can get
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5775
diff changeset
332 the correct indexid and log sequence */
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5775
diff changeset
333 (void)mail_index_try_open(index);
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5775
diff changeset
334
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5775
diff changeset
335 if (index->indexid == 0) {
6359
c54c07f30a97 Fixed opening indexes to memory.
Timo Sirainen <tss@iki.fi>
parents: 6350
diff changeset
336 /* Create a new indexid for us. If we're opening index
c54c07f30a97 Fixed opening indexes to memory.
Timo Sirainen <tss@iki.fi>
parents: 6350
diff changeset
337 into memory, index->map doesn't exist yet. */
5819
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5775
diff changeset
338 index->indexid = ioloop_time;
6359
c54c07f30a97 Fixed opening indexes to memory.
Timo Sirainen <tss@iki.fi>
parents: 6350
diff changeset
339 if (index->map != NULL)
c54c07f30a97 Fixed opening indexes to memory.
Timo Sirainen <tss@iki.fi>
parents: 6350
diff changeset
340 index->map->hdr.indexid = index->indexid;
5819
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5775
diff changeset
341 }
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5775
diff changeset
342
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
343 ret = mail_transaction_log_create(index->log);
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
344 created = TRUE;
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
345 }
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
346 if (ret >= 0) {
5819
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5775
diff changeset
347 ret = index->map != NULL ? 0 : mail_index_try_open(index);
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
348 if (ret == 0) {
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
349 /* doesn't exist / corrupted */
6322
8d9a156ec94e Handle opening corrupted index files better.
Timo Sirainen <tss@iki.fi>
parents: 6321
diff changeset
350 mail_transaction_log_close(index->log);
8d9a156ec94e Handle opening corrupted index files better.
Timo Sirainen <tss@iki.fi>
parents: 6321
diff changeset
351 ret = mail_transaction_log_create(index->log);
6359
c54c07f30a97 Fixed opening indexes to memory.
Timo Sirainen <tss@iki.fi>
parents: 6350
diff changeset
352 if (ret == 0) {
c54c07f30a97 Fixed opening indexes to memory.
Timo Sirainen <tss@iki.fi>
parents: 6350
diff changeset
353 if (index->map != NULL)
c54c07f30a97 Fixed opening indexes to memory.
Timo Sirainen <tss@iki.fi>
parents: 6350
diff changeset
354 mail_index_unmap(&index->map);
6322
8d9a156ec94e Handle opening corrupted index files better.
Timo Sirainen <tss@iki.fi>
parents: 6321
diff changeset
355 index->map = mail_index_map_alloc(index);
6359
c54c07f30a97 Fixed opening indexes to memory.
Timo Sirainen <tss@iki.fi>
parents: 6350
diff changeset
356 }
2170
fb785d235c43 minor fix for error handling
Timo Sirainen <tss@iki.fi>
parents: 2122
diff changeset
357 }
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
358 }
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
359 if (ret < 0) {
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
360 /* open/create failed, fallback to in-memory indexes */
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
361 if ((flags & MAIL_INDEX_OPEN_FLAG_CREATE) == 0)
6375
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
362 return -1;
3243
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
363
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
364 if (mail_index_move_to_memory(index) < 0)
6375
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
365 return -1;
2200
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
366 }
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
367
3129
1ea614abead3 Don't complain about cache indexid changing when recreating index.
Timo Sirainen <tss@iki.fi>
parents: 3105
diff changeset
368 index->cache = created ? mail_cache_create(index) :
1ea614abead3 Don't complain about cache indexid changing when recreating index.
Timo Sirainen <tss@iki.fi>
parents: 3105
diff changeset
369 mail_cache_open_or_create(index);
6375
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
370 return 1;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
371 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
372
2723
12b503fbb8af Replaced fcntl_locks_disable with lock_method, so it's now possible to use
Timo Sirainen <tss@iki.fi>
parents: 2715
diff changeset
373 int mail_index_open(struct mail_index *index, enum mail_index_open_flags flags,
4876
f1d77064884c Lock handling changes. Everything goes through file-lock API now and there's
Timo Sirainen <tss@iki.fi>
parents: 4795
diff changeset
374 enum file_lock_method lock_method)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
375 {
6375
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
376 int ret;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
377
2926
c035583b4839 Make sure index is reopened if it's marked corrupted.
Timo Sirainen <tss@iki.fi>
parents: 2922
diff changeset
378 if (index->opened) {
5772
002aa9bbfcb2 Removed index->hdr. Use index->map->hdr instead.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
379 if (index->map != NULL &&
002aa9bbfcb2 Removed index->hdr. Use index->map->hdr instead.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
380 (index->map->hdr.flags &
002aa9bbfcb2 Removed index->hdr. Use index->map->hdr instead.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
381 MAIL_INDEX_HDR_FLAG_CORRUPTED) != 0) {
2926
c035583b4839 Make sure index is reopened if it's marked corrupted.
Timo Sirainen <tss@iki.fi>
parents: 2922
diff changeset
382 /* corrupted, reopen files */
c035583b4839 Make sure index is reopened if it's marked corrupted.
Timo Sirainen <tss@iki.fi>
parents: 2922
diff changeset
383 mail_index_close(index);
c035583b4839 Make sure index is reopened if it's marked corrupted.
Timo Sirainen <tss@iki.fi>
parents: 2922
diff changeset
384 } else {
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
385 i_assert(index->map != NULL);
4067
96ae9c096bde mail_index_open(): If index is already open, return 1 instead of 0 so the
Timo Sirainen <tss@iki.fi>
parents: 4053
diff changeset
386 return 1;
2926
c035583b4839 Make sure index is reopened if it's marked corrupted.
Timo Sirainen <tss@iki.fi>
parents: 2922
diff changeset
387 }
c035583b4839 Make sure index is reopened if it's marked corrupted.
Timo Sirainen <tss@iki.fi>
parents: 2922
diff changeset
388 }
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
389
3243
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
390 index->filepath = MAIL_INDEX_IS_IN_MEMORY(index) ?
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
391 i_strdup("(in-memory index)") :
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
392 i_strconcat(index->dir, "/", index->prefix, NULL);
1967
b6d900688c55 memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 1965
diff changeset
393
6375
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
394 index->shared_lock_count = 0;
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
395 index->excl_lock_count = 0;
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
396 index->lock_type = F_UNLCK;
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
397 index->lock_id_counter = 2;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
398
6375
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
399 index->readonly = FALSE;
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
400 index->nodiskspace = FALSE;
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
401 index->index_lock_timeout = FALSE;
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
402 index->log_locked = FALSE;
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
403 index->mmap_disable = (flags & MAIL_INDEX_OPEN_FLAG_MMAP_DISABLE) != 0;
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
404 index->use_excl_dotlocks =
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
405 (flags & MAIL_INDEX_OPEN_FLAG_DOTLOCK_USE_EXCL) != 0;
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
406 index->fsync_disable =
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
407 (flags & MAIL_INDEX_OPEN_FLAG_FSYNC_DISABLE) != 0;
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
408 index->nfs_flush = (flags & MAIL_INDEX_OPEN_FLAG_NFS_FLUSH) != 0;
6686
610f3d9813b5 Added MAIL_INDEX_OPEN_FLAG_READONLY.
Timo Sirainen <tss@iki.fi>
parents: 6679
diff changeset
409 index->readonly = (flags & MAIL_INDEX_OPEN_FLAG_READONLY) != 0;
6375
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
410 index->lock_method = lock_method;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
411
6375
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
412 if (index->nfs_flush && index->fsync_disable)
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
413 i_fatal("nfs flush requires fsync_disable=no");
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
414 if (index->nfs_flush && !index->mmap_disable)
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
415 i_fatal("nfs flush requires mmap_disable=yes");
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
416
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
417 if ((ret = mail_index_open_files(index, flags)) <= 0) {
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
418 /* doesn't exist and create flag not used */
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
419 mail_index_close(index);
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
420 return ret;
3824
3e756ea0474b Comment updates, small cleanups and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 3819
diff changeset
421 }
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
422
6375
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
423 i_assert(index->map != NULL);
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
424 index->opened = TRUE;
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
425 return 1;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
426 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
427
6390
ff48b008150f Fix ESTALE handling when reading main index.
Timo Sirainen <tss@iki.fi>
parents: 6384
diff changeset
428 void mail_index_close_file(struct mail_index *index)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
429 {
4876
f1d77064884c Lock handling changes. Everything goes through file-lock API now and there's
Timo Sirainen <tss@iki.fi>
parents: 4795
diff changeset
430 if (index->file_lock != NULL)
f1d77064884c Lock handling changes. Everything goes through file-lock API now and there's
Timo Sirainen <tss@iki.fi>
parents: 4795
diff changeset
431 file_lock_free(&index->file_lock);
2200
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
432
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
433 if (index->fd != -1) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
434 if (close(index->fd) < 0)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
435 mail_index_set_syscall_error(index, "close()");
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
436 index->fd = -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
437 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
438
5854
eca7e29dce0d Rewrite index lock handling.
Timo Sirainen <tss@iki.fi>
parents: 5853
diff changeset
439 index->lock_id_counter += 2;
6372
f33ea6ff46ea Drop also exclusive locks when closing index files (there shouldn't be any
Timo Sirainen <tss@iki.fi>
parents: 6371
diff changeset
440 index->lock_type = F_UNLCK;
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
441 index->shared_lock_count = 0;
6372
f33ea6ff46ea Drop also exclusive locks when closing index files (there shouldn't be any
Timo Sirainen <tss@iki.fi>
parents: 6371
diff changeset
442 index->excl_lock_count = 0;
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
443 }
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
444
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
445 void mail_index_close(struct mail_index *index)
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
446 {
5827
f17d4bccd74d Memory and fd leak fix
Timo Sirainen <tss@iki.fi>
parents: 5820
diff changeset
447 if (index->map != NULL)
5853
d9f319a9d6e0 mail_index_map now contains pointer to index, so all functions taking map
Timo Sirainen <tss@iki.fi>
parents: 5827
diff changeset
448 mail_index_unmap(&index->map);
5827
f17d4bccd74d Memory and fd leak fix
Timo Sirainen <tss@iki.fi>
parents: 5820
diff changeset
449
f17d4bccd74d Memory and fd leak fix
Timo Sirainen <tss@iki.fi>
parents: 5820
diff changeset
450 mail_index_close_file(index);
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
451 mail_transaction_log_close(index->log);
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
452 if (index->cache != NULL)
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
453 mail_cache_free(&index->cache);
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
454
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
455 i_free_and_null(index->filepath);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
456
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
457 index->indexid = 0;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
458 index->opened = FALSE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
459 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
460
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
461 int mail_index_reopen_if_changed(struct mail_index *index)
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
462 {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
463 struct stat st1, st2;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
464
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
465 i_assert(index->excl_lock_count == 0);
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
466
3243
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
467 if (MAIL_INDEX_IS_IN_MEMORY(index))
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
468 return 0;
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
469
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
470 if (index->fd == -1)
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
471 return mail_index_try_open_only(index);
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
472
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
473 if (fstat(index->fd, &st1) < 0) {
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
474 if (errno != ESTALE)
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
475 return mail_index_set_syscall_error(index, "fstat()");
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
476 /* deleted/recreated, reopen */
6371
8468e3babea2 NFS: If index has been deleted, close the index properly before reopening it.
Timo Sirainen <tss@iki.fi>
parents: 6359
diff changeset
477 mail_index_close_file(index);
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
478 return mail_index_try_open_only(index);
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
479 }
5972
9fb9dc4d8df8 Flush NFS caches when needed if MAIL_INDEX_OPEN_FLAG_NFS_FLUSH is enabled.
Timo Sirainen <tss@iki.fi>
parents: 5867
diff changeset
480
9fb9dc4d8df8 Flush NFS caches when needed if MAIL_INDEX_OPEN_FLAG_NFS_FLUSH is enabled.
Timo Sirainen <tss@iki.fi>
parents: 5867
diff changeset
481 if (index->nfs_flush)
9fb9dc4d8df8 Flush NFS caches when needed if MAIL_INDEX_OPEN_FLAG_NFS_FLUSH is enabled.
Timo Sirainen <tss@iki.fi>
parents: 5867
diff changeset
482 nfs_flush_attr_cache(index->filepath);
4225
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4220
diff changeset
483 if (nfs_safe_stat(index->filepath, &st2) < 0) {
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
484 if (errno == ENOENT)
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
485 return 0;
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
486
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
487 return mail_index_set_syscall_error(index, "stat()");
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
488 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
489
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
490 if (st1.st_ino == st2.st_ino && CMP_DEV_T(st1.st_dev, st2.st_dev)) {
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
491 /* the same file */
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
492 return 1;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
493 }
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
494
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
495 /* new file, new locks. the old fd can keep its locks, they don't
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
496 matter anymore as no-one's going to modify the file. */
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
497 mail_index_close_file(index);
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
498
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
499 return mail_index_try_open_only(index);
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
500 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
501
2936
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
502 int mail_index_refresh(struct mail_index *index)
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
503 {
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
504 int ret;
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
505
5854
eca7e29dce0d Rewrite index lock handling.
Timo Sirainen <tss@iki.fi>
parents: 5853
diff changeset
506 ret = mail_index_map(index, MAIL_INDEX_SYNC_HANDLER_HEAD);
2936
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
507 return ret <= 0 ? -1 : 0;
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
508 }
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
509
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
510 struct mail_cache *mail_index_get_cache(struct mail_index *index)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
511 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
512 return index->cache;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
513 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
514
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
515 int mail_index_set_error(struct mail_index *index, const char *fmt, ...)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
516 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
517 va_list va;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
518
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
519 i_free(index->error);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
520
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
521 if (fmt == NULL)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
522 index->error = NULL;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
523 else {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
524 va_start(va, fmt);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
525 index->error = i_strdup_vprintf(fmt, va);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
526 va_end(va);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
527
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
528 i_error("%s", index->error);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
529 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
530
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
531 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
532 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
533
3833
318c70c1d4ec Beginnings of fallbacking to in-memory indexes when write fails with "out of
Timo Sirainen <tss@iki.fi>
parents: 3832
diff changeset
534 int mail_index_move_to_memory(struct mail_index *index)
318c70c1d4ec Beginnings of fallbacking to in-memory indexes when write fails with "out of
Timo Sirainen <tss@iki.fi>
parents: 3832
diff changeset
535 {
3911
3a2fe49912f3 Fixed mail_index_move_to_memory() to work better and made it public
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
536 struct mail_index_map *map;
3a2fe49912f3 Fixed mail_index_move_to_memory() to work better and made it public
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
537
4394
0462137fa4ce mail_index_move_to_memory(): Don't break if the index is already in memory.
Timo Sirainen <tss@iki.fi>
parents: 4312
diff changeset
538 if (MAIL_INDEX_IS_IN_MEMORY(index))
5430
c8bb83980ff7 If mail_index_move_to_memory() fails, make sure the future calls to it also
Timo Sirainen <tss@iki.fi>
parents: 5323
diff changeset
539 return index->map == NULL ? -1 : 0;
4394
0462137fa4ce mail_index_move_to_memory(): Don't break if the index is already in memory.
Timo Sirainen <tss@iki.fi>
parents: 4312
diff changeset
540
4919
d54145736f99 If mail_index_move_to_memory() was called before index file was opened, we
Timo Sirainen <tss@iki.fi>
parents: 4918
diff changeset
541 /* set the index as being into memory */
d54145736f99 If mail_index_move_to_memory() was called before index file was opened, we
Timo Sirainen <tss@iki.fi>
parents: 4918
diff changeset
542 i_free_and_null(index->dir);
d54145736f99 If mail_index_move_to_memory() was called before index file was opened, we
Timo Sirainen <tss@iki.fi>
parents: 4918
diff changeset
543
5274
7641e625fbd5 When moving index file to memory, change the filename to be "(in-memory
Timo Sirainen <tss@iki.fi>
parents: 5273
diff changeset
544 i_free(index->filepath);
7641e625fbd5 When moving index file to memory, change the filename to be "(in-memory
Timo Sirainen <tss@iki.fi>
parents: 5273
diff changeset
545 index->filepath = i_strdup("(in-memory index)");
7641e625fbd5 When moving index file to memory, change the filename to be "(in-memory
Timo Sirainen <tss@iki.fi>
parents: 5273
diff changeset
546
3912
fc0b638330a4 Added mbox_min_index_size setting.
Timo Sirainen <tss@iki.fi>
parents: 3911
diff changeset
547 if (index->map == NULL) {
5224
c3ab7e621fa6 comment cleanup
Timo Sirainen <tss@iki.fi>
parents: 5212
diff changeset
548 /* index was never even opened. just mark it as being in
3912
fc0b638330a4 Added mbox_min_index_size setting.
Timo Sirainen <tss@iki.fi>
parents: 3911
diff changeset
549 memory and let the caller re-open the index. */
fc0b638330a4 Added mbox_min_index_size setting.
Timo Sirainen <tss@iki.fi>
parents: 3911
diff changeset
550 i_assert(index->fd == -1);
fc0b638330a4 Added mbox_min_index_size setting.
Timo Sirainen <tss@iki.fi>
parents: 3911
diff changeset
551 return -1;
fc0b638330a4 Added mbox_min_index_size setting.
Timo Sirainen <tss@iki.fi>
parents: 3911
diff changeset
552 }
fc0b638330a4 Added mbox_min_index_size setting.
Timo Sirainen <tss@iki.fi>
parents: 3911
diff changeset
553
3911
3a2fe49912f3 Fixed mail_index_move_to_memory() to work better and made it public
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
554 /* move index map to memory */
5278
d569caa88a66 If we run out of disk space, move to in-memory indexes.
Timo Sirainen <tss@iki.fi>
parents: 5274
diff changeset
555 if (!MAIL_INDEX_MAP_IS_IN_MEMORY(index->map)) {
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
556 map = mail_index_map_clone(index->map);
5853
d9f319a9d6e0 mail_index_map now contains pointer to index, so all functions taking map
Timo Sirainen <tss@iki.fi>
parents: 5827
diff changeset
557 mail_index_unmap(&index->map);
5278
d569caa88a66 If we run out of disk space, move to in-memory indexes.
Timo Sirainen <tss@iki.fi>
parents: 5274
diff changeset
558 index->map = map;
d569caa88a66 If we run out of disk space, move to in-memory indexes.
Timo Sirainen <tss@iki.fi>
parents: 5274
diff changeset
559 }
3911
3a2fe49912f3 Fixed mail_index_move_to_memory() to work better and made it public
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
560
4053
94b3363165c8 If transaction log opening fails, don't crash when trying to move it to
Timo Sirainen <tss@iki.fi>
parents: 4026
diff changeset
561 if (index->log != NULL) {
94b3363165c8 If transaction log opening fails, don't crash when trying to move it to
Timo Sirainen <tss@iki.fi>
parents: 4026
diff changeset
562 /* move transaction log to memory */
5714
dcf5dbb6a76a mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents: 5689
diff changeset
563 mail_transaction_log_move_to_memory(index->log);
4053
94b3363165c8 If transaction log opening fails, don't crash when trying to move it to
Timo Sirainen <tss@iki.fi>
parents: 4026
diff changeset
564 }
3911
3a2fe49912f3 Fixed mail_index_move_to_memory() to work better and made it public
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
565
4876
f1d77064884c Lock handling changes. Everything goes through file-lock API now and there's
Timo Sirainen <tss@iki.fi>
parents: 4795
diff changeset
566 if (index->file_lock != NULL)
f1d77064884c Lock handling changes. Everything goes through file-lock API now and there's
Timo Sirainen <tss@iki.fi>
parents: 4795
diff changeset
567 file_lock_free(&index->file_lock);
f1d77064884c Lock handling changes. Everything goes through file-lock API now and there's
Timo Sirainen <tss@iki.fi>
parents: 4795
diff changeset
568
6022
8da2881df0dc mail_index_move_to_memory(): Don't log an error if index fd is already closed
Timo Sirainen <tss@iki.fi>
parents: 5976
diff changeset
569 if (index->fd != -1) {
8da2881df0dc mail_index_move_to_memory(): Don't log an error if index fd is already closed
Timo Sirainen <tss@iki.fi>
parents: 5976
diff changeset
570 if (close(index->fd) < 0)
8da2881df0dc mail_index_move_to_memory(): Don't log an error if index fd is already closed
Timo Sirainen <tss@iki.fi>
parents: 5976
diff changeset
571 mail_index_set_syscall_error(index, "close()");
8da2881df0dc mail_index_move_to_memory(): Don't log an error if index fd is already closed
Timo Sirainen <tss@iki.fi>
parents: 5976
diff changeset
572 index->fd = -1;
8da2881df0dc mail_index_move_to_memory(): Don't log an error if index fd is already closed
Timo Sirainen <tss@iki.fi>
parents: 5976
diff changeset
573 }
5714
dcf5dbb6a76a mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents: 5689
diff changeset
574 return 0;
3833
318c70c1d4ec Beginnings of fallbacking to in-memory indexes when write fails with "out of
Timo Sirainen <tss@iki.fi>
parents: 3832
diff changeset
575 }
318c70c1d4ec Beginnings of fallbacking to in-memory indexes when write fails with "out of
Timo Sirainen <tss@iki.fi>
parents: 3832
diff changeset
576
1945
268a4096e8be cleanup
Timo Sirainen <tss@iki.fi>
parents: 1943
diff changeset
577 void mail_index_mark_corrupted(struct mail_index *index)
1943
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
578 {
5820
e59892590a02 Handle losing index file better. Handle fsck better.
Timo Sirainen <tss@iki.fi>
parents: 5819
diff changeset
579 index->indexid = 0;
1945
268a4096e8be cleanup
Timo Sirainen <tss@iki.fi>
parents: 1943
diff changeset
580
5772
002aa9bbfcb2 Removed index->hdr. Use index->map->hdr instead.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
581 index->map->hdr.flags |= MAIL_INDEX_HDR_FLAG_CORRUPTED;
5775
98d5e3bd4d13 Handle corruption marking by unlinking dovecot.index file. Removed
Timo Sirainen <tss@iki.fi>
parents: 5773
diff changeset
582 if (unlink(index->filepath) < 0 && errno != ENOENT && errno != ESTALE)
98d5e3bd4d13 Handle corruption marking by unlinking dovecot.index file. Removed
Timo Sirainen <tss@iki.fi>
parents: 5773
diff changeset
583 mail_index_set_syscall_error(index, "unlink()");
1943
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
584 }
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
585
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
586 int mail_index_set_syscall_error(struct mail_index *index,
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
587 const char *function)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
588 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
589 i_assert(function != NULL);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
590
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
591 if (ENOSPACE(errno)) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
592 index->nodiskspace = TRUE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
593 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
594 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
595
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
596 return mail_index_set_error(index, "%s failed with index file %s: %m",
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
597 function, index->filepath);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
598 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
599
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
600 int mail_index_file_set_syscall_error(struct mail_index *index,
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
601 const char *filepath,
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
602 const char *function)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
603 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
604 i_assert(filepath != NULL);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
605 i_assert(function != NULL);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
606
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
607 if (ENOSPACE(errno)) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
608 index->nodiskspace = TRUE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
609 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
610 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
611
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
612 return mail_index_set_error(index, "%s failed with file %s: %m",
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
613 function, filepath);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
614 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
615
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
616 const char *mail_index_get_error_message(struct mail_index *index)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
617 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
618 return index->error;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
619 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
620
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
621 void mail_index_reset_error(struct mail_index *index)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
622 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
623 if (index->error != NULL) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
624 i_free(index->error);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
625 index->error = NULL;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
626 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
627
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
628 index->nodiskspace = FALSE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
629 index->index_lock_timeout = FALSE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
630 }
2407
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
631
5666
a0e59849a03d Better implementation for mail_index_uint32_to_offset() and
Timo Sirainen <tss@iki.fi>
parents: 5627
diff changeset
632 #ifdef WORDS_BIGENDIAN
a0e59849a03d Better implementation for mail_index_uint32_to_offset() and
Timo Sirainen <tss@iki.fi>
parents: 5627
diff changeset
633 /* FIXME: Unfortunately these functions were originally written to use
a0e59849a03d Better implementation for mail_index_uint32_to_offset() and
Timo Sirainen <tss@iki.fi>
parents: 5627
diff changeset
634 endian-specific code and we can't avoid that without breaking backwards
a0e59849a03d Better implementation for mail_index_uint32_to_offset() and
Timo Sirainen <tss@iki.fi>
parents: 5627
diff changeset
635 compatibility. When we do break it, just select one of these. */
2407
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
636 uint32_t mail_index_uint32_to_offset(uint32_t offset)
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
637 {
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
638 i_assert(offset < 0x40000000);
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
639 i_assert((offset & 3) == 0);
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
640
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
641 offset >>= 2;
5666
a0e59849a03d Better implementation for mail_index_uint32_to_offset() and
Timo Sirainen <tss@iki.fi>
parents: 5627
diff changeset
642 return 0x00000080 | ((offset & 0x0000007f)) |
a0e59849a03d Better implementation for mail_index_uint32_to_offset() and
Timo Sirainen <tss@iki.fi>
parents: 5627
diff changeset
643 0x00008000 | ((offset & 0x00003f80) >> 7 << 8) |
a0e59849a03d Better implementation for mail_index_uint32_to_offset() and
Timo Sirainen <tss@iki.fi>
parents: 5627
diff changeset
644 0x00800000 | ((offset & 0x001fc000) >> 14 << 16) |
a0e59849a03d Better implementation for mail_index_uint32_to_offset() and
Timo Sirainen <tss@iki.fi>
parents: 5627
diff changeset
645 0x80000000 | ((offset & 0x0fe00000) >> 21 << 24);
2407
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
646 }
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
647
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
648 uint32_t mail_index_offset_to_uint32(uint32_t offset)
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
649 {
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
650 if ((offset & 0x80808080) != 0x80808080)
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
651 return 0;
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
652
5666
a0e59849a03d Better implementation for mail_index_uint32_to_offset() and
Timo Sirainen <tss@iki.fi>
parents: 5627
diff changeset
653 return (((offset & 0x0000007f)) |
a0e59849a03d Better implementation for mail_index_uint32_to_offset() and
Timo Sirainen <tss@iki.fi>
parents: 5627
diff changeset
654 ((offset & 0x00007f00) >> 8 << 7) |
a0e59849a03d Better implementation for mail_index_uint32_to_offset() and
Timo Sirainen <tss@iki.fi>
parents: 5627
diff changeset
655 ((offset & 0x007f0000) >> 16 << 14) |
a0e59849a03d Better implementation for mail_index_uint32_to_offset() and
Timo Sirainen <tss@iki.fi>
parents: 5627
diff changeset
656 ((offset & 0x7f000000) >> 24 << 21)) << 2;
2407
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
657 }
5666
a0e59849a03d Better implementation for mail_index_uint32_to_offset() and
Timo Sirainen <tss@iki.fi>
parents: 5627
diff changeset
658 #else
a0e59849a03d Better implementation for mail_index_uint32_to_offset() and
Timo Sirainen <tss@iki.fi>
parents: 5627
diff changeset
659 uint32_t mail_index_uint32_to_offset(uint32_t offset)
a0e59849a03d Better implementation for mail_index_uint32_to_offset() and
Timo Sirainen <tss@iki.fi>
parents: 5627
diff changeset
660 {
a0e59849a03d Better implementation for mail_index_uint32_to_offset() and
Timo Sirainen <tss@iki.fi>
parents: 5627
diff changeset
661 i_assert(offset < 0x40000000);
a0e59849a03d Better implementation for mail_index_uint32_to_offset() and
Timo Sirainen <tss@iki.fi>
parents: 5627
diff changeset
662 i_assert((offset & 3) == 0);
a0e59849a03d Better implementation for mail_index_uint32_to_offset() and
Timo Sirainen <tss@iki.fi>
parents: 5627
diff changeset
663
a0e59849a03d Better implementation for mail_index_uint32_to_offset() and
Timo Sirainen <tss@iki.fi>
parents: 5627
diff changeset
664 offset >>= 2;
a0e59849a03d Better implementation for mail_index_uint32_to_offset() and
Timo Sirainen <tss@iki.fi>
parents: 5627
diff changeset
665 return 0x80000000 | ((offset & 0x0000007f) << 24) |
a0e59849a03d Better implementation for mail_index_uint32_to_offset() and
Timo Sirainen <tss@iki.fi>
parents: 5627
diff changeset
666 0x00800000 | ((offset & 0x00003f80) >> 7 << 16) |
a0e59849a03d Better implementation for mail_index_uint32_to_offset() and
Timo Sirainen <tss@iki.fi>
parents: 5627
diff changeset
667 0x00008000 | ((offset & 0x001fc000) >> 14 << 8) |
a0e59849a03d Better implementation for mail_index_uint32_to_offset() and
Timo Sirainen <tss@iki.fi>
parents: 5627
diff changeset
668 0x00000080 | ((offset & 0x0fe00000) >> 21);
a0e59849a03d Better implementation for mail_index_uint32_to_offset() and
Timo Sirainen <tss@iki.fi>
parents: 5627
diff changeset
669 }
a0e59849a03d Better implementation for mail_index_uint32_to_offset() and
Timo Sirainen <tss@iki.fi>
parents: 5627
diff changeset
670
a0e59849a03d Better implementation for mail_index_uint32_to_offset() and
Timo Sirainen <tss@iki.fi>
parents: 5627
diff changeset
671 uint32_t mail_index_offset_to_uint32(uint32_t offset)
a0e59849a03d Better implementation for mail_index_uint32_to_offset() and
Timo Sirainen <tss@iki.fi>
parents: 5627
diff changeset
672 {
a0e59849a03d Better implementation for mail_index_uint32_to_offset() and
Timo Sirainen <tss@iki.fi>
parents: 5627
diff changeset
673 if ((offset & 0x80808080) != 0x80808080)
a0e59849a03d Better implementation for mail_index_uint32_to_offset() and
Timo Sirainen <tss@iki.fi>
parents: 5627
diff changeset
674 return 0;
a0e59849a03d Better implementation for mail_index_uint32_to_offset() and
Timo Sirainen <tss@iki.fi>
parents: 5627
diff changeset
675
a0e59849a03d Better implementation for mail_index_uint32_to_offset() and
Timo Sirainen <tss@iki.fi>
parents: 5627
diff changeset
676 return (((offset & 0x0000007f) << 21) |
a0e59849a03d Better implementation for mail_index_uint32_to_offset() and
Timo Sirainen <tss@iki.fi>
parents: 5627
diff changeset
677 ((offset & 0x00007f00) >> 8 << 14) |
a0e59849a03d Better implementation for mail_index_uint32_to_offset() and
Timo Sirainen <tss@iki.fi>
parents: 5627
diff changeset
678 ((offset & 0x007f0000) >> 16 << 7) |
a0e59849a03d Better implementation for mail_index_uint32_to_offset() and
Timo Sirainen <tss@iki.fi>
parents: 5627
diff changeset
679 ((offset & 0x7f000000) >> 24)) << 2;
a0e59849a03d Better implementation for mail_index_uint32_to_offset() and
Timo Sirainen <tss@iki.fi>
parents: 5627
diff changeset
680 }
a0e59849a03d Better implementation for mail_index_uint32_to_offset() and
Timo Sirainen <tss@iki.fi>
parents: 5627
diff changeset
681 #endif