Mercurial > dovecot > core-2.2
annotate src/lib-index/mail-cache.c @ 22576:707ae9de3812
lib: istream-multiplex - Minor code cleanup
Avoid propagating the error twice, and avoid any confusion about what "got"
actually contains.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Thu, 05 Oct 2017 20:24:11 +0300 |
parents | 03b5a6dfd3ba |
children | 65ada9976a7f |
rev | line source |
---|---|
21390
2e2563132d5f
Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21351
diff
changeset
|
1 /* Copyright (c) 2003-2017 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" |
3470
346a494c2feb
Moved array declaration to array-decl.h and include it in lib.h. So array.h
Timo Sirainen <tss@iki.fi>
parents:
3380
diff
changeset
|
4 #include "array.h" |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2307
diff
changeset
|
5 #include "buffer.h" |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2307
diff
changeset
|
6 #include "hash.h" |
4247
9c3f19110538
Don't compress cache file if it was just compressed by another process.
Timo Sirainen <tss@iki.fi>
parents:
4023
diff
changeset
|
7 #include "nfs-workarounds.h" |
2866
bf1e718e7370
Cache file works now with mmap_disable=yes. Still needs a few optimizations.
Timo Sirainen <tss@iki.fi>
parents:
2853
diff
changeset
|
8 #include "file-cache.h" |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #include "mmap-util.h" |
15313
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
10 #include "read-full.h" |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 #include "write-full.h" |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 #include "mail-cache-private.h" |
21186
34074cc72a15
lib-index: Limit mmap errors in index cache to 1/s
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21168
diff
changeset
|
13 #include "ioloop.h" |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 #include <unistd.h> |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 |
15333
0efb98659a1f
lib-index: Optimize cache file reads with MAIL_INDEX_OPEN_FLAG_SAVEONLY
Timo Sirainen <tss@iki.fi>
parents:
15332
diff
changeset
|
17 #define MAIL_CACHE_MIN_HEADER_READ_SIZE 4096 |
0efb98659a1f
lib-index: Optimize cache file reads with MAIL_INDEX_OPEN_FLAG_SAVEONLY
Timo Sirainen <tss@iki.fi>
parents:
15332
diff
changeset
|
18 |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 void mail_cache_set_syscall_error(struct mail_cache *cache, |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 const char *function) |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 { |
10686
442c980d6221
lib-index: Fixed logging file creation EACCES failures.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
22 mail_index_file_set_syscall_error(cache->index, cache->filepath, |
442c980d6221
lib-index: Fixed logging file creation EACCES failures.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
23 function); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 |
10006
a425ba46a64c
lib-index: Take MAIL_INDEX_OPEN_FLAG_READONLY more seriously.
Timo Sirainen <tss@iki.fi>
parents:
9696
diff
changeset
|
26 static void mail_cache_unlink(struct mail_cache *cache) |
a425ba46a64c
lib-index: Take MAIL_INDEX_OPEN_FLAG_READONLY more seriously.
Timo Sirainen <tss@iki.fi>
parents:
9696
diff
changeset
|
27 { |
21422
aa57a51c8ce6
index: don't try to unlink in-memory cache file
Josef 'Jeff' Sipek <jeff.sipek@dovecot.fi>
parents:
21390
diff
changeset
|
28 if (!cache->index->readonly && !MAIL_INDEX_IS_IN_MEMORY(cache->index)) |
21447
de3c25669608
lib-index: Don't log error on dovecot.index.cache delete if it doesn't exist
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21422
diff
changeset
|
29 i_unlink_if_exists(cache->filepath); |
10006
a425ba46a64c
lib-index: Take MAIL_INDEX_OPEN_FLAG_READONLY more seriously.
Timo Sirainen <tss@iki.fi>
parents:
9696
diff
changeset
|
30 } |
a425ba46a64c
lib-index: Take MAIL_INDEX_OPEN_FLAG_READONLY more seriously.
Timo Sirainen <tss@iki.fi>
parents:
9696
diff
changeset
|
31 |
11988
117053f20528
lib-index: Added mail_cache_reset().
Timo Sirainen <tss@iki.fi>
parents:
11634
diff
changeset
|
32 void mail_cache_reset(struct mail_cache *cache) |
117053f20528
lib-index: Added mail_cache_reset().
Timo Sirainen <tss@iki.fi>
parents:
11634
diff
changeset
|
33 { |
117053f20528
lib-index: Added mail_cache_reset().
Timo Sirainen <tss@iki.fi>
parents:
11634
diff
changeset
|
34 mail_cache_unlink(cache); |
117053f20528
lib-index: Added mail_cache_reset().
Timo Sirainen <tss@iki.fi>
parents:
11634
diff
changeset
|
35 /* mark the cache as unusable */ |
117053f20528
lib-index: Added mail_cache_reset().
Timo Sirainen <tss@iki.fi>
parents:
11634
diff
changeset
|
36 cache->hdr = NULL; |
117053f20528
lib-index: Added mail_cache_reset().
Timo Sirainen <tss@iki.fi>
parents:
11634
diff
changeset
|
37 } |
117053f20528
lib-index: Added mail_cache_reset().
Timo Sirainen <tss@iki.fi>
parents:
11634
diff
changeset
|
38 |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 void mail_cache_set_corrupted(struct mail_cache *cache, const char *fmt, ...) |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 { |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 va_list va; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 |
11988
117053f20528
lib-index: Added mail_cache_reset().
Timo Sirainen <tss@iki.fi>
parents:
11634
diff
changeset
|
43 mail_cache_reset(cache); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 va_start(va, fmt); |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7205
diff
changeset
|
46 T_BEGIN { |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6857
diff
changeset
|
47 mail_index_set_error(cache->index, |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6857
diff
changeset
|
48 "Corrupted index cache file %s: %s", |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6857
diff
changeset
|
49 cache->filepath, |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6857
diff
changeset
|
50 t_strdup_vprintf(fmt, va)); |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7205
diff
changeset
|
51 } T_END; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 va_end(va); |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 |
22033
03b5a6dfd3ba
lib-index: Add mail_cache_set_seq_corrupted_reason
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21537
diff
changeset
|
55 void mail_cache_set_seq_corrupted_reason(struct mail_cache_view *cache_view, |
03b5a6dfd3ba
lib-index: Add mail_cache_set_seq_corrupted_reason
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21537
diff
changeset
|
56 uint32_t seq, const char *reason) |
03b5a6dfd3ba
lib-index: Add mail_cache_set_seq_corrupted_reason
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21537
diff
changeset
|
57 { |
03b5a6dfd3ba
lib-index: Add mail_cache_set_seq_corrupted_reason
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21537
diff
changeset
|
58 uint32_t empty = 0; |
03b5a6dfd3ba
lib-index: Add mail_cache_set_seq_corrupted_reason
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21537
diff
changeset
|
59 struct mail_cache *cache = cache_view->cache; |
03b5a6dfd3ba
lib-index: Add mail_cache_set_seq_corrupted_reason
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21537
diff
changeset
|
60 struct mail_index_view *view = cache_view->view; |
03b5a6dfd3ba
lib-index: Add mail_cache_set_seq_corrupted_reason
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21537
diff
changeset
|
61 |
03b5a6dfd3ba
lib-index: Add mail_cache_set_seq_corrupted_reason
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21537
diff
changeset
|
62 mail_index_set_error(cache->index, |
03b5a6dfd3ba
lib-index: Add mail_cache_set_seq_corrupted_reason
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21537
diff
changeset
|
63 "Corrupted record in index cache file %s: %s", |
03b5a6dfd3ba
lib-index: Add mail_cache_set_seq_corrupted_reason
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21537
diff
changeset
|
64 cache->filepath, reason); |
03b5a6dfd3ba
lib-index: Add mail_cache_set_seq_corrupted_reason
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21537
diff
changeset
|
65 |
03b5a6dfd3ba
lib-index: Add mail_cache_set_seq_corrupted_reason
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21537
diff
changeset
|
66 /* drop cache pointer */ |
03b5a6dfd3ba
lib-index: Add mail_cache_set_seq_corrupted_reason
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21537
diff
changeset
|
67 struct mail_index_transaction *t = |
03b5a6dfd3ba
lib-index: Add mail_cache_set_seq_corrupted_reason
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21537
diff
changeset
|
68 mail_index_transaction_begin(view, MAIL_INDEX_TRANSACTION_FLAG_EXTERNAL); |
03b5a6dfd3ba
lib-index: Add mail_cache_set_seq_corrupted_reason
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21537
diff
changeset
|
69 mail_index_update_ext(t, seq, cache->ext_id, &empty, NULL); |
03b5a6dfd3ba
lib-index: Add mail_cache_set_seq_corrupted_reason
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21537
diff
changeset
|
70 |
03b5a6dfd3ba
lib-index: Add mail_cache_set_seq_corrupted_reason
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21537
diff
changeset
|
71 if (mail_index_transaction_commit(&t) < 0) |
03b5a6dfd3ba
lib-index: Add mail_cache_set_seq_corrupted_reason
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21537
diff
changeset
|
72 mail_cache_reset(cache); |
03b5a6dfd3ba
lib-index: Add mail_cache_set_seq_corrupted_reason
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21537
diff
changeset
|
73 else |
03b5a6dfd3ba
lib-index: Add mail_cache_set_seq_corrupted_reason
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21537
diff
changeset
|
74 mail_cache_expunge_count(cache, 1); |
03b5a6dfd3ba
lib-index: Add mail_cache_set_seq_corrupted_reason
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21537
diff
changeset
|
75 } |
03b5a6dfd3ba
lib-index: Add mail_cache_set_seq_corrupted_reason
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21537
diff
changeset
|
76 |
2247
2d51bb58a070
Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents:
2220
diff
changeset
|
77 void mail_cache_file_close(struct mail_cache *cache) |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 { |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 if (cache->mmap_base != NULL) { |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 if (munmap(cache->mmap_base, cache->mmap_length) < 0) |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 mail_cache_set_syscall_error(cache, "munmap()"); |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 |
2866
bf1e718e7370
Cache file works now with mmap_disable=yes. Still needs a few optimizations.
Timo Sirainen <tss@iki.fi>
parents:
2853
diff
changeset
|
84 if (cache->file_cache != NULL) |
bf1e718e7370
Cache file works now with mmap_disable=yes. Still needs a few optimizations.
Timo Sirainen <tss@iki.fi>
parents:
2853
diff
changeset
|
85 file_cache_set_fd(cache->file_cache, -1); |
19917
1ef6401c749d
lib-index: After MAIL_INDEX_OPEN_FLAG_SAVEONLY access cache's read_buf wasn't always reset.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
86 if (cache->read_buf != NULL) |
1ef6401c749d
lib-index: After MAIL_INDEX_OPEN_FLAG_SAVEONLY access cache's read_buf wasn't always reset.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
87 buffer_set_used_size(cache->read_buf, 0); |
2866
bf1e718e7370
Cache file works now with mmap_disable=yes. Still needs a few optimizations.
Timo Sirainen <tss@iki.fi>
parents:
2853
diff
changeset
|
88 |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 cache->mmap_base = NULL; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 cache->hdr = NULL; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 cache->mmap_length = 0; |
6705
68bb5bec043e
When reading the latest fields, begin finding the fields from the last known
Timo Sirainen <tss@iki.fi>
parents:
6703
diff
changeset
|
92 cache->last_field_header_offset = 0; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 |
4876
f1d77064884c
Lock handling changes. Everything goes through file-lock API now and there's
Timo Sirainen <tss@iki.fi>
parents:
4657
diff
changeset
|
94 if (cache->file_lock != NULL) |
f1d77064884c
Lock handling changes. Everything goes through file-lock API now and there's
Timo Sirainen <tss@iki.fi>
parents:
4657
diff
changeset
|
95 file_lock_free(&cache->file_lock); |
f1d77064884c
Lock handling changes. Everything goes through file-lock API now and there's
Timo Sirainen <tss@iki.fi>
parents:
4657
diff
changeset
|
96 cache->locked = FALSE; |
f1d77064884c
Lock handling changes. Everything goes through file-lock API now and there's
Timo Sirainen <tss@iki.fi>
parents:
4657
diff
changeset
|
97 |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 if (cache->fd != -1) { |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 if (close(cache->fd) < 0) |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 mail_cache_set_syscall_error(cache, "close()"); |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 cache->fd = -1; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 } |
20041
4d83654e61d6
lib-index: If opening a cache file fails, try again later.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20040
diff
changeset
|
103 cache->opened = FALSE; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 |
5145
3eecde9cbea4
Allocate cache file's size amount of memory for the file cache so it doesn't
Timo Sirainen <tss@iki.fi>
parents:
5014
diff
changeset
|
106 static void mail_cache_init_file_cache(struct mail_cache *cache) |
3eecde9cbea4
Allocate cache file's size amount of memory for the file cache so it doesn't
Timo Sirainen <tss@iki.fi>
parents:
5014
diff
changeset
|
107 { |
3eecde9cbea4
Allocate cache file's size amount of memory for the file cache so it doesn't
Timo Sirainen <tss@iki.fi>
parents:
5014
diff
changeset
|
108 struct stat st; |
3eecde9cbea4
Allocate cache file's size amount of memory for the file cache so it doesn't
Timo Sirainen <tss@iki.fi>
parents:
5014
diff
changeset
|
109 |
17902
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
110 if (cache->file_cache != NULL) |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
111 file_cache_set_fd(cache->file_cache, cache->fd); |
5145
3eecde9cbea4
Allocate cache file's size amount of memory for the file cache so it doesn't
Timo Sirainen <tss@iki.fi>
parents:
5014
diff
changeset
|
112 |
17902
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
113 if (fstat(cache->fd, &st) == 0) { |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
114 if (cache->file_cache != NULL) |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
115 (void)file_cache_set_size(cache->file_cache, st.st_size); |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
116 } else if (!ESTALE_FSTAT(errno)) { |
5145
3eecde9cbea4
Allocate cache file's size amount of memory for the file cache so it doesn't
Timo Sirainen <tss@iki.fi>
parents:
5014
diff
changeset
|
117 mail_cache_set_syscall_error(cache, "fstat()"); |
17902
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
118 } |
6815
c991d1b132d8
Fixed cache file's NFS attribute cache flushing.
Timo Sirainen <tss@iki.fi>
parents:
6772
diff
changeset
|
119 |
c991d1b132d8
Fixed cache file's NFS attribute cache flushing.
Timo Sirainen <tss@iki.fi>
parents:
6772
diff
changeset
|
120 cache->st_ino = st.st_ino; |
c991d1b132d8
Fixed cache file's NFS attribute cache flushing.
Timo Sirainen <tss@iki.fi>
parents:
6772
diff
changeset
|
121 cache->st_dev = st.st_dev; |
5145
3eecde9cbea4
Allocate cache file's size amount of memory for the file cache so it doesn't
Timo Sirainen <tss@iki.fi>
parents:
5014
diff
changeset
|
122 } |
3eecde9cbea4
Allocate cache file's size amount of memory for the file cache so it doesn't
Timo Sirainen <tss@iki.fi>
parents:
5014
diff
changeset
|
123 |
17901
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
124 static int mail_cache_try_open(struct mail_cache *cache) |
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
125 { |
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
126 const void *data; |
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
127 |
20041
4d83654e61d6
lib-index: If opening a cache file fails, try again later.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20040
diff
changeset
|
128 i_assert(!cache->opened); |
17901
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
129 cache->opened = TRUE; |
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
130 |
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
131 if (MAIL_INDEX_IS_IN_MEMORY(cache->index)) |
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
132 return 0; |
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
133 |
20041
4d83654e61d6
lib-index: If opening a cache file fails, try again later.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20040
diff
changeset
|
134 i_assert(cache->fd == -1); |
17901
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
135 cache->fd = nfs_safe_open(cache->filepath, |
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
136 cache->index->readonly ? O_RDONLY : O_RDWR); |
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
137 if (cache->fd == -1) { |
20041
4d83654e61d6
lib-index: If opening a cache file fails, try again later.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20040
diff
changeset
|
138 mail_cache_file_close(cache); |
17901
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
139 if (errno == ENOENT) { |
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
140 cache->need_compress_file_seq = 0; |
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
141 return 0; |
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
142 } |
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
143 |
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
144 mail_cache_set_syscall_error(cache, "open()"); |
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
145 return -1; |
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
146 } |
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
147 |
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
148 mail_cache_init_file_cache(cache); |
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
149 |
20041
4d83654e61d6
lib-index: If opening a cache file fails, try again later.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20040
diff
changeset
|
150 if (mail_cache_map(cache, 0, 0, &data) < 0) { |
4d83654e61d6
lib-index: If opening a cache file fails, try again later.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20040
diff
changeset
|
151 mail_cache_file_close(cache); |
17901
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
152 return -1; |
20041
4d83654e61d6
lib-index: If opening a cache file fails, try again later.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20040
diff
changeset
|
153 } |
17901
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
154 return 1; |
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
155 } |
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
156 |
6701
c601e8cd0ffc
mail_cache_reopen(): Don't bother reopening if file is still the same.
Timo Sirainen <tss@iki.fi>
parents:
6700
diff
changeset
|
157 static bool mail_cache_need_reopen(struct mail_cache *cache) |
c601e8cd0ffc
mail_cache_reopen(): Don't bother reopening if file is still the same.
Timo Sirainen <tss@iki.fi>
parents:
6700
diff
changeset
|
158 { |
6815
c991d1b132d8
Fixed cache file's NFS attribute cache flushing.
Timo Sirainen <tss@iki.fi>
parents:
6772
diff
changeset
|
159 struct stat st; |
6701
c601e8cd0ffc
mail_cache_reopen(): Don't bother reopening if file is still the same.
Timo Sirainen <tss@iki.fi>
parents:
6700
diff
changeset
|
160 |
c601e8cd0ffc
mail_cache_reopen(): Don't bother reopening if file is still the same.
Timo Sirainen <tss@iki.fi>
parents:
6700
diff
changeset
|
161 if (MAIL_CACHE_IS_UNUSABLE(cache)) { |
c601e8cd0ffc
mail_cache_reopen(): Don't bother reopening if file is still the same.
Timo Sirainen <tss@iki.fi>
parents:
6700
diff
changeset
|
162 if (cache->need_compress_file_seq != 0) { |
c601e8cd0ffc
mail_cache_reopen(): Don't bother reopening if file is still the same.
Timo Sirainen <tss@iki.fi>
parents:
6700
diff
changeset
|
163 /* we're waiting for compression */ |
c601e8cd0ffc
mail_cache_reopen(): Don't bother reopening if file is still the same.
Timo Sirainen <tss@iki.fi>
parents:
6700
diff
changeset
|
164 return FALSE; |
c601e8cd0ffc
mail_cache_reopen(): Don't bother reopening if file is still the same.
Timo Sirainen <tss@iki.fi>
parents:
6700
diff
changeset
|
165 } |
c601e8cd0ffc
mail_cache_reopen(): Don't bother reopening if file is still the same.
Timo Sirainen <tss@iki.fi>
parents:
6700
diff
changeset
|
166 if (MAIL_INDEX_IS_IN_MEMORY(cache->index)) { |
c601e8cd0ffc
mail_cache_reopen(): Don't bother reopening if file is still the same.
Timo Sirainen <tss@iki.fi>
parents:
6700
diff
changeset
|
167 /* disabled */ |
c601e8cd0ffc
mail_cache_reopen(): Don't bother reopening if file is still the same.
Timo Sirainen <tss@iki.fi>
parents:
6700
diff
changeset
|
168 return FALSE; |
c601e8cd0ffc
mail_cache_reopen(): Don't bother reopening if file is still the same.
Timo Sirainen <tss@iki.fi>
parents:
6700
diff
changeset
|
169 } |
c601e8cd0ffc
mail_cache_reopen(): Don't bother reopening if file is still the same.
Timo Sirainen <tss@iki.fi>
parents:
6700
diff
changeset
|
170 } |
c601e8cd0ffc
mail_cache_reopen(): Don't bother reopening if file is still the same.
Timo Sirainen <tss@iki.fi>
parents:
6700
diff
changeset
|
171 |
c601e8cd0ffc
mail_cache_reopen(): Don't bother reopening if file is still the same.
Timo Sirainen <tss@iki.fi>
parents:
6700
diff
changeset
|
172 if (cache->fd == -1) |
c601e8cd0ffc
mail_cache_reopen(): Don't bother reopening if file is still the same.
Timo Sirainen <tss@iki.fi>
parents:
6700
diff
changeset
|
173 return TRUE; |
c601e8cd0ffc
mail_cache_reopen(): Don't bother reopening if file is still the same.
Timo Sirainen <tss@iki.fi>
parents:
6700
diff
changeset
|
174 |
c601e8cd0ffc
mail_cache_reopen(): Don't bother reopening if file is still the same.
Timo Sirainen <tss@iki.fi>
parents:
6700
diff
changeset
|
175 /* see if the file has changed */ |
9696
126132cb1c19
index: Removed duplication of mail_index_open_flags from struct mail_index.
Timo Sirainen <tss@iki.fi>
parents:
8973
diff
changeset
|
176 if ((cache->index->flags & MAIL_INDEX_OPEN_FLAG_NFS_FLUSH) != 0) { |
6829
dbab5e592577
NFS cache flushing APIs changed and backend implements it a bit differently.
Timo Sirainen <tss@iki.fi>
parents:
6827
diff
changeset
|
177 i_assert(!cache->locked); |
6857 | 178 nfs_flush_file_handle_cache(cache->filepath); |
6829
dbab5e592577
NFS cache flushing APIs changed and backend implements it a bit differently.
Timo Sirainen <tss@iki.fi>
parents:
6827
diff
changeset
|
179 } |
6815
c991d1b132d8
Fixed cache file's NFS attribute cache flushing.
Timo Sirainen <tss@iki.fi>
parents:
6772
diff
changeset
|
180 if (nfs_safe_stat(cache->filepath, &st) < 0) { |
6701
c601e8cd0ffc
mail_cache_reopen(): Don't bother reopening if file is still the same.
Timo Sirainen <tss@iki.fi>
parents:
6700
diff
changeset
|
181 mail_cache_set_syscall_error(cache, "stat()"); |
c601e8cd0ffc
mail_cache_reopen(): Don't bother reopening if file is still the same.
Timo Sirainen <tss@iki.fi>
parents:
6700
diff
changeset
|
182 return TRUE; |
c601e8cd0ffc
mail_cache_reopen(): Don't bother reopening if file is still the same.
Timo Sirainen <tss@iki.fi>
parents:
6700
diff
changeset
|
183 } |
6829
dbab5e592577
NFS cache flushing APIs changed and backend implements it a bit differently.
Timo Sirainen <tss@iki.fi>
parents:
6827
diff
changeset
|
184 |
dbab5e592577
NFS cache flushing APIs changed and backend implements it a bit differently.
Timo Sirainen <tss@iki.fi>
parents:
6827
diff
changeset
|
185 if (st.st_ino != cache->st_ino || |
dbab5e592577
NFS cache flushing APIs changed and backend implements it a bit differently.
Timo Sirainen <tss@iki.fi>
parents:
6827
diff
changeset
|
186 !CMP_DEV_T(st.st_dev, cache->st_dev)) { |
dbab5e592577
NFS cache flushing APIs changed and backend implements it a bit differently.
Timo Sirainen <tss@iki.fi>
parents:
6827
diff
changeset
|
187 /* file changed */ |
dbab5e592577
NFS cache flushing APIs changed and backend implements it a bit differently.
Timo Sirainen <tss@iki.fi>
parents:
6827
diff
changeset
|
188 return TRUE; |
dbab5e592577
NFS cache flushing APIs changed and backend implements it a bit differently.
Timo Sirainen <tss@iki.fi>
parents:
6827
diff
changeset
|
189 } |
dbab5e592577
NFS cache flushing APIs changed and backend implements it a bit differently.
Timo Sirainen <tss@iki.fi>
parents:
6827
diff
changeset
|
190 |
9696
126132cb1c19
index: Removed duplication of mail_index_open_flags from struct mail_index.
Timo Sirainen <tss@iki.fi>
parents:
8973
diff
changeset
|
191 if ((cache->index->flags & MAIL_INDEX_OPEN_FLAG_NFS_FLUSH) != 0) { |
6815
c991d1b132d8
Fixed cache file's NFS attribute cache flushing.
Timo Sirainen <tss@iki.fi>
parents:
6772
diff
changeset
|
192 /* if the old file has been deleted, the new file may have |
6829
dbab5e592577
NFS cache flushing APIs changed and backend implements it a bit differently.
Timo Sirainen <tss@iki.fi>
parents:
6827
diff
changeset
|
193 the same inode as the old one. we'll catch this here by |
dbab5e592577
NFS cache flushing APIs changed and backend implements it a bit differently.
Timo Sirainen <tss@iki.fi>
parents:
6827
diff
changeset
|
194 checking if fstat() fails with ESTALE */ |
dbab5e592577
NFS cache flushing APIs changed and backend implements it a bit differently.
Timo Sirainen <tss@iki.fi>
parents:
6827
diff
changeset
|
195 if (fstat(cache->fd, &st) < 0) { |
12936
d14b0fd0a423
Linux NFS: fstat() may return ENOENT instead of ESTALE in some kernel versions.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
196 if (ESTALE_FSTAT(errno)) |
6829
dbab5e592577
NFS cache flushing APIs changed and backend implements it a bit differently.
Timo Sirainen <tss@iki.fi>
parents:
6827
diff
changeset
|
197 return TRUE; |
dbab5e592577
NFS cache flushing APIs changed and backend implements it a bit differently.
Timo Sirainen <tss@iki.fi>
parents:
6827
diff
changeset
|
198 mail_cache_set_syscall_error(cache, "fstat()"); |
dbab5e592577
NFS cache flushing APIs changed and backend implements it a bit differently.
Timo Sirainen <tss@iki.fi>
parents:
6827
diff
changeset
|
199 return FALSE; |
dbab5e592577
NFS cache flushing APIs changed and backend implements it a bit differently.
Timo Sirainen <tss@iki.fi>
parents:
6827
diff
changeset
|
200 } |
6815
c991d1b132d8
Fixed cache file's NFS attribute cache flushing.
Timo Sirainen <tss@iki.fi>
parents:
6772
diff
changeset
|
201 } |
6829
dbab5e592577
NFS cache flushing APIs changed and backend implements it a bit differently.
Timo Sirainen <tss@iki.fi>
parents:
6827
diff
changeset
|
202 return FALSE; |
6701
c601e8cd0ffc
mail_cache_reopen(): Don't bother reopening if file is still the same.
Timo Sirainen <tss@iki.fi>
parents:
6700
diff
changeset
|
203 } |
c601e8cd0ffc
mail_cache_reopen(): Don't bother reopening if file is still the same.
Timo Sirainen <tss@iki.fi>
parents:
6700
diff
changeset
|
204 |
17901
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
205 static int mail_cache_reopen_now(struct mail_cache *cache) |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
206 { |
2853
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2828
diff
changeset
|
207 struct mail_index_view *view; |
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2828
diff
changeset
|
208 const struct mail_index_ext *ext; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
209 |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
210 mail_cache_file_close(cache); |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
211 |
17901
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
212 if (mail_cache_try_open(cache) <= 0) |
2275
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2251
diff
changeset
|
213 return -1; |
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2251
diff
changeset
|
214 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2307
diff
changeset
|
215 if (mail_cache_header_fields_read(cache) < 0) |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2307
diff
changeset
|
216 return -1; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2307
diff
changeset
|
217 |
2853
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2828
diff
changeset
|
218 view = mail_index_view_open(cache->index); |
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2828
diff
changeset
|
219 ext = mail_index_view_get_ext(view, cache->ext_id); |
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2828
diff
changeset
|
220 if (ext == NULL || cache->hdr->file_seq != ext->reset_id) { |
2275
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2251
diff
changeset
|
221 /* still different - maybe a race condition or maybe the |
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2251
diff
changeset
|
222 file_seq really is corrupted. either way, this shouldn't |
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2251
diff
changeset
|
223 happen often so we'll just mark cache to be compressed |
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2251
diff
changeset
|
224 later which fixes this. */ |
4247
9c3f19110538
Don't compress cache file if it was just compressed by another process.
Timo Sirainen <tss@iki.fi>
parents:
4023
diff
changeset
|
225 cache->need_compress_file_seq = cache->hdr->file_seq; |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
226 mail_index_view_close(&view); |
2275
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2251
diff
changeset
|
227 return 0; |
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2251
diff
changeset
|
228 } |
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2251
diff
changeset
|
229 |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
230 mail_index_view_close(&view); |
5736
b3ed52bbeca7
Changed mail_cache_foreach() to be an iterator: mail_cache_lookup_iter_*()
Timo Sirainen <tss@iki.fi>
parents:
5734
diff
changeset
|
231 i_assert(!MAIL_CACHE_IS_UNUSABLE(cache)); |
2275
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2251
diff
changeset
|
232 return 1; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
233 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
234 |
17901
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
235 int mail_cache_reopen(struct mail_cache *cache) |
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
236 { |
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
237 i_assert(!cache->locked); |
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
238 |
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
239 if (!mail_cache_need_reopen(cache)) { |
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
240 /* reopening does no good */ |
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
241 return 0; |
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
242 } |
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
243 return mail_cache_reopen_now(cache); |
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
244 } |
a10eea380073
lib-index: Code cleanup - avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents:
17900
diff
changeset
|
245 |
8292
9ed4ecd4a866
Fixes to handling "out of disk space/quota" write failures.
Timo Sirainen <tss@iki.fi>
parents:
8190
diff
changeset
|
246 static void mail_cache_update_need_compress(struct mail_cache *cache) |
9ed4ecd4a866
Fixes to handling "out of disk space/quota" write failures.
Timo Sirainen <tss@iki.fi>
parents:
8190
diff
changeset
|
247 { |
9ed4ecd4a866
Fixes to handling "out of disk space/quota" write failures.
Timo Sirainen <tss@iki.fi>
parents:
8190
diff
changeset
|
248 const struct mail_cache_header *hdr = cache->hdr; |
15190
60c4815778fb
lib-index: Simplified writing to dovecot.index.cache file.
Timo Sirainen <tss@iki.fi>
parents:
14918
diff
changeset
|
249 struct stat st; |
15374
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
250 unsigned int msg_count; |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
251 unsigned int records_count, cont_percentage, delete_percentage; |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
252 bool want_compress = FALSE; |
8292
9ed4ecd4a866
Fixes to handling "out of disk space/quota" write failures.
Timo Sirainen <tss@iki.fi>
parents:
8190
diff
changeset
|
253 |
15374
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
254 if (hdr->minor_version == 0) { |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
255 /* compress to get ourself into the new header version */ |
8292
9ed4ecd4a866
Fixes to handling "out of disk space/quota" write failures.
Timo Sirainen <tss@iki.fi>
parents:
8190
diff
changeset
|
256 cache->need_compress_file_seq = hdr->file_seq; |
15190
60c4815778fb
lib-index: Simplified writing to dovecot.index.cache file.
Timo Sirainen <tss@iki.fi>
parents:
14918
diff
changeset
|
257 return; |
8292
9ed4ecd4a866
Fixes to handling "out of disk space/quota" write failures.
Timo Sirainen <tss@iki.fi>
parents:
8190
diff
changeset
|
258 } |
9ed4ecd4a866
Fixes to handling "out of disk space/quota" write failures.
Timo Sirainen <tss@iki.fi>
parents:
8190
diff
changeset
|
259 |
15374
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
260 msg_count = cache->index->map->rec_map->records_count; |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
261 if (msg_count == 0) |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
262 records_count = 1; |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
263 else if (hdr->record_count == 0 || hdr->record_count > msg_count*2) { |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
264 /* probably not the real record_count, but hole offset that |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
265 Dovecot <=v2.1 versions used to use in this position. |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
266 we already checked that minor_version>0, but this could |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
267 happen if old Dovecot was used to access mailbox after |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
268 it had been updated. */ |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
269 records_count = I_MAX(msg_count, 1); |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
270 cache->hdr_copy.record_count = msg_count; |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
271 cache->hdr_modified = TRUE; |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
272 } else { |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
273 records_count = hdr->record_count; |
8292
9ed4ecd4a866
Fixes to handling "out of disk space/quota" write failures.
Timo Sirainen <tss@iki.fi>
parents:
8190
diff
changeset
|
274 } |
9ed4ecd4a866
Fixes to handling "out of disk space/quota" write failures.
Timo Sirainen <tss@iki.fi>
parents:
8190
diff
changeset
|
275 |
15374
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
276 cont_percentage = hdr->continued_record_count * 100 / records_count; |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
277 if (cont_percentage >= MAIL_CACHE_COMPRESS_CONTINUED_PERCENTAGE) { |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
278 /* too many continued rows, compress */ |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
279 want_compress = TRUE; |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
280 } |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
281 |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
282 delete_percentage = hdr->deleted_record_count * 100 / |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
283 (records_count + hdr->deleted_record_count); |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
284 if (delete_percentage >= MAIL_CACHE_COMPRESS_DELETE_PERCENTAGE) { |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
285 /* too many deleted records, compress */ |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
286 want_compress = TRUE; |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
287 } |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
288 |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
289 if (want_compress) { |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
290 if (fstat(cache->fd, &st) < 0) { |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
291 if (!ESTALE_FSTAT(errno)) |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
292 mail_cache_set_syscall_error(cache, "fstat()"); |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
293 return; |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
294 } |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
295 if (st.st_size >= MAIL_CACHE_COMPRESS_MIN_SIZE) |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
296 cache->need_compress_file_seq = hdr->file_seq; |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
297 } |
debecd057f9c
lib-index: Replaced cache's deleted_space with deleted_record_count.
Timo Sirainen <tss@iki.fi>
parents:
15373
diff
changeset
|
298 |
8292
9ed4ecd4a866
Fixes to handling "out of disk space/quota" write failures.
Timo Sirainen <tss@iki.fi>
parents:
8190
diff
changeset
|
299 } |
9ed4ecd4a866
Fixes to handling "out of disk space/quota" write failures.
Timo Sirainen <tss@iki.fi>
parents:
8190
diff
changeset
|
300 |
15312
0d1de37ad9d8
lib-index: Code cleanup: Removed mail_cache.data
Timo Sirainen <tss@iki.fi>
parents:
15311
diff
changeset
|
301 static bool mail_cache_verify_header(struct mail_cache *cache, |
0d1de37ad9d8
lib-index: Code cleanup: Removed mail_cache.data
Timo Sirainen <tss@iki.fi>
parents:
15311
diff
changeset
|
302 const struct mail_cache_header *hdr) |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
303 { |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
304 /* check that the header is still ok */ |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
305 if (cache->mmap_length < sizeof(struct mail_cache_header)) { |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
306 mail_cache_set_corrupted(cache, "File too small"); |
2275
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2251
diff
changeset
|
307 return FALSE; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
308 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
309 |
15373
8323e81785e2
lib-index: Added minor version to dovecot.index.cache file header.
Timo Sirainen <tss@iki.fi>
parents:
15371
diff
changeset
|
310 if (hdr->major_version != MAIL_CACHE_MAJOR_VERSION) { |
2276
5f374049abdb
Caching fixes and optimizations. Removed all network byte ordering code -
Timo Sirainen <tss@iki.fi>
parents:
2275
diff
changeset
|
311 /* version changed - upgrade silently */ |
10006
a425ba46a64c
lib-index: Take MAIL_INDEX_OPEN_FLAG_READONLY more seriously.
Timo Sirainen <tss@iki.fi>
parents:
9696
diff
changeset
|
312 mail_cache_unlink(cache); |
2276
5f374049abdb
Caching fixes and optimizations. Removed all network byte ordering code -
Timo Sirainen <tss@iki.fi>
parents:
2275
diff
changeset
|
313 return FALSE; |
5f374049abdb
Caching fixes and optimizations. Removed all network byte ordering code -
Timo Sirainen <tss@iki.fi>
parents:
2275
diff
changeset
|
314 } |
4657
a2a9b6a92831
Don't use time_t anymore in cache file. uint32_t is large enough and makes
Timo Sirainen <tss@iki.fi>
parents:
4655
diff
changeset
|
315 if (hdr->compat_sizeof_uoff_t != sizeof(uoff_t)) { |
a2a9b6a92831
Don't use time_t anymore in cache file. uint32_t is large enough and makes
Timo Sirainen <tss@iki.fi>
parents:
4655
diff
changeset
|
316 /* architecture change - handle silently(?) */ |
10006
a425ba46a64c
lib-index: Take MAIL_INDEX_OPEN_FLAG_READONLY more seriously.
Timo Sirainen <tss@iki.fi>
parents:
9696
diff
changeset
|
317 mail_cache_unlink(cache); |
4657
a2a9b6a92831
Don't use time_t anymore in cache file. uint32_t is large enough and makes
Timo Sirainen <tss@iki.fi>
parents:
4655
diff
changeset
|
318 return FALSE; |
3819
61f0e1fe9b55
Moved uoff_t and time_t compatibility checks to cache file, since they're
Timo Sirainen <tss@iki.fi>
parents:
3627
diff
changeset
|
319 } |
2276
5f374049abdb
Caching fixes and optimizations. Removed all network byte ordering code -
Timo Sirainen <tss@iki.fi>
parents:
2275
diff
changeset
|
320 |
6703
75c48f171ad3
Keep a separate copy of mail_cache_header when mmap_disable=yes, otherwise
Timo Sirainen <tss@iki.fi>
parents:
6702
diff
changeset
|
321 if (hdr->indexid != cache->index->indexid) { |
6407
1deb160e5fbb
Don't bother complaining about indexid changes. The real reason for the
Timo Sirainen <tss@iki.fi>
parents:
6360
diff
changeset
|
322 /* index id changed - handle silently */ |
10006
a425ba46a64c
lib-index: Take MAIL_INDEX_OPEN_FLAG_READONLY more seriously.
Timo Sirainen <tss@iki.fi>
parents:
9696
diff
changeset
|
323 mail_cache_unlink(cache); |
2275
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2251
diff
changeset
|
324 return FALSE; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
325 } |
6703
75c48f171ad3
Keep a separate copy of mail_cache_header when mmap_disable=yes, otherwise
Timo Sirainen <tss@iki.fi>
parents:
6702
diff
changeset
|
326 if (hdr->file_seq == 0) { |
5014
59b04ed146a9
Make sure file_seq isn't zero in cache file header.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
327 mail_cache_set_corrupted(cache, "file_seq is 0"); |
59b04ed146a9
Make sure file_seq isn't zero in cache file header.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
328 return FALSE; |
59b04ed146a9
Make sure file_seq isn't zero in cache file header.
Timo Sirainen <tss@iki.fi>
parents:
4968
diff
changeset
|
329 } |
2275
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2251
diff
changeset
|
330 return TRUE; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
331 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
332 |
15313
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
333 static int |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
334 mail_cache_map_finish(struct mail_cache *cache, uoff_t offset, size_t size, |
15332
3700fb6f8a42
lib-index: After recent cache changes, cache was often wrongly being thought of as unusable
Timo Sirainen <tss@iki.fi>
parents:
15318
diff
changeset
|
335 const void *hdr_data, bool copy_hdr) |
15313
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
336 { |
15332
3700fb6f8a42
lib-index: After recent cache changes, cache was often wrongly being thought of as unusable
Timo Sirainen <tss@iki.fi>
parents:
15318
diff
changeset
|
337 const struct mail_cache_header *hdr = hdr_data; |
3700fb6f8a42
lib-index: After recent cache changes, cache was often wrongly being thought of as unusable
Timo Sirainen <tss@iki.fi>
parents:
15318
diff
changeset
|
338 |
15313
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
339 if (offset == 0) { |
15332
3700fb6f8a42
lib-index: After recent cache changes, cache was often wrongly being thought of as unusable
Timo Sirainen <tss@iki.fi>
parents:
15318
diff
changeset
|
340 /* verify the header validity only with offset=0. this way |
3700fb6f8a42
lib-index: After recent cache changes, cache was often wrongly being thought of as unusable
Timo Sirainen <tss@iki.fi>
parents:
15318
diff
changeset
|
341 we won't waste time re-verifying it all the time */ |
15313
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
342 if (!mail_cache_verify_header(cache, hdr)) { |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
343 cache->need_compress_file_seq = |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
344 !MAIL_CACHE_IS_UNUSABLE(cache) && |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
345 cache->hdr->file_seq != 0 ? |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
346 cache->hdr->file_seq : 0; |
15537
348e9bad84f0
lib-index: Fixed assert-crash caused by recent cache file changes.
Timo Sirainen <tss@iki.fi>
parents:
15536
diff
changeset
|
347 cache->hdr = NULL; |
15313
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
348 return -1; |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
349 } |
15332
3700fb6f8a42
lib-index: After recent cache changes, cache was often wrongly being thought of as unusable
Timo Sirainen <tss@iki.fi>
parents:
15318
diff
changeset
|
350 } |
3700fb6f8a42
lib-index: After recent cache changes, cache was often wrongly being thought of as unusable
Timo Sirainen <tss@iki.fi>
parents:
15318
diff
changeset
|
351 if (hdr_data != NULL) { |
15313
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
352 if (!copy_hdr) |
15332
3700fb6f8a42
lib-index: After recent cache changes, cache was often wrongly being thought of as unusable
Timo Sirainen <tss@iki.fi>
parents:
15318
diff
changeset
|
353 cache->hdr = hdr; |
15313
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
354 else { |
15332
3700fb6f8a42
lib-index: After recent cache changes, cache was often wrongly being thought of as unusable
Timo Sirainen <tss@iki.fi>
parents:
15318
diff
changeset
|
355 memcpy(&cache->hdr_ro_copy, hdr, |
15313
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
356 sizeof(cache->hdr_ro_copy)); |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
357 cache->hdr = &cache->hdr_ro_copy; |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
358 } |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
359 mail_cache_update_need_compress(cache); |
15332
3700fb6f8a42
lib-index: After recent cache changes, cache was often wrongly being thought of as unusable
Timo Sirainen <tss@iki.fi>
parents:
15318
diff
changeset
|
360 } else { |
3700fb6f8a42
lib-index: After recent cache changes, cache was often wrongly being thought of as unusable
Timo Sirainen <tss@iki.fi>
parents:
15318
diff
changeset
|
361 i_assert(cache->hdr != NULL); |
15313
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
362 } |
15537
348e9bad84f0
lib-index: Fixed assert-crash caused by recent cache file changes.
Timo Sirainen <tss@iki.fi>
parents:
15536
diff
changeset
|
363 i_assert(cache->hdr->file_seq != 0); |
15313
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
364 |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
365 if (offset + size > cache->mmap_length) |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
366 return 0; |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
367 return 1; |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
368 } |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
369 |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
370 static int |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
371 mail_cache_map_with_read(struct mail_cache *cache, size_t offset, size_t size, |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
372 const void **data_r) |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
373 { |
15332
3700fb6f8a42
lib-index: After recent cache changes, cache was often wrongly being thought of as unusable
Timo Sirainen <tss@iki.fi>
parents:
15318
diff
changeset
|
374 const void *hdr_data; |
15313
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
375 void *data; |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
376 ssize_t ret; |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
377 |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
378 if (cache->read_buf == NULL) { |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
379 cache->read_buf = |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
380 buffer_create_dynamic(default_pool, size); |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
381 } else if (cache->read_offset <= offset && |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
382 cache->read_offset + cache->read_buf->used >= offset+size) { |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
383 /* already mapped */ |
15318
99aec8d4d6c6
lib-index: Crashfix for MAIL_INDEX_OPEN_FLAG_SAVEONLY change.
Timo Sirainen <tss@iki.fi>
parents:
15313
diff
changeset
|
384 *data_r = CONST_PTR_OFFSET(cache->read_buf->data, |
15313
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
385 offset - cache->read_offset); |
15332
3700fb6f8a42
lib-index: After recent cache changes, cache was often wrongly being thought of as unusable
Timo Sirainen <tss@iki.fi>
parents:
15318
diff
changeset
|
386 hdr_data = offset == 0 ? *data_r : NULL; |
3700fb6f8a42
lib-index: After recent cache changes, cache was often wrongly being thought of as unusable
Timo Sirainen <tss@iki.fi>
parents:
15318
diff
changeset
|
387 return mail_cache_map_finish(cache, offset, size, hdr_data, TRUE); |
15313
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
388 } else { |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
389 buffer_set_used_size(cache->read_buf, 0); |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
390 } |
15333
0efb98659a1f
lib-index: Optimize cache file reads with MAIL_INDEX_OPEN_FLAG_SAVEONLY
Timo Sirainen <tss@iki.fi>
parents:
15332
diff
changeset
|
391 if (offset == 0 && size < MAIL_CACHE_MIN_HEADER_READ_SIZE) { |
0efb98659a1f
lib-index: Optimize cache file reads with MAIL_INDEX_OPEN_FLAG_SAVEONLY
Timo Sirainen <tss@iki.fi>
parents:
15332
diff
changeset
|
392 /* we can usually read the fields header after the cache |
0efb98659a1f
lib-index: Optimize cache file reads with MAIL_INDEX_OPEN_FLAG_SAVEONLY
Timo Sirainen <tss@iki.fi>
parents:
15332
diff
changeset
|
393 header. we need them both, so try to read them all with one |
0efb98659a1f
lib-index: Optimize cache file reads with MAIL_INDEX_OPEN_FLAG_SAVEONLY
Timo Sirainen <tss@iki.fi>
parents:
15332
diff
changeset
|
394 pread() call. */ |
0efb98659a1f
lib-index: Optimize cache file reads with MAIL_INDEX_OPEN_FLAG_SAVEONLY
Timo Sirainen <tss@iki.fi>
parents:
15332
diff
changeset
|
395 size = MAIL_CACHE_MIN_HEADER_READ_SIZE; |
0efb98659a1f
lib-index: Optimize cache file reads with MAIL_INDEX_OPEN_FLAG_SAVEONLY
Timo Sirainen <tss@iki.fi>
parents:
15332
diff
changeset
|
396 } |
0efb98659a1f
lib-index: Optimize cache file reads with MAIL_INDEX_OPEN_FLAG_SAVEONLY
Timo Sirainen <tss@iki.fi>
parents:
15332
diff
changeset
|
397 |
15313
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
398 data = buffer_append_space_unsafe(cache->read_buf, size); |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
399 ret = pread(cache->fd, data, size, offset); |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
400 if (ret < 0) { |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
401 if (errno != ESTALE) |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
402 mail_cache_set_syscall_error(cache, "read()"); |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
403 |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
404 buffer_set_used_size(cache->read_buf, 0); |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
405 cache->hdr = NULL; |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
406 cache->mmap_length = 0; |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
407 return -1; |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
408 } |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
409 buffer_set_used_size(cache->read_buf, ret); |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
410 |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
411 cache->read_offset = offset; |
15565
bded819417d9
lib-index: MAIL_INDEX_OPEN_FLAG_SAVEONLY was buggy when reading data near end of dovecot.index.cache.
Timo Sirainen <tss@iki.fi>
parents:
15537
diff
changeset
|
412 cache->mmap_length = offset + cache->read_buf->used; |
15313
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
413 |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
414 *data_r = data; |
15332
3700fb6f8a42
lib-index: After recent cache changes, cache was often wrongly being thought of as unusable
Timo Sirainen <tss@iki.fi>
parents:
15318
diff
changeset
|
415 hdr_data = offset == 0 ? *data_r : NULL; |
15565
bded819417d9
lib-index: MAIL_INDEX_OPEN_FLAG_SAVEONLY was buggy when reading data near end of dovecot.index.cache.
Timo Sirainen <tss@iki.fi>
parents:
15537
diff
changeset
|
416 return mail_cache_map_finish(cache, offset, |
bded819417d9
lib-index: MAIL_INDEX_OPEN_FLAG_SAVEONLY was buggy when reading data near end of dovecot.index.cache.
Timo Sirainen <tss@iki.fi>
parents:
15537
diff
changeset
|
417 cache->read_buf->used, hdr_data, TRUE); |
15313
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
418 } |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
419 |
15311
022d0d21e56d
lib-index: mail_cache_map() API cleanup
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
420 int mail_cache_map(struct mail_cache *cache, size_t offset, size_t size, |
022d0d21e56d
lib-index: mail_cache_map() API cleanup
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
421 const void **data_r) |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
422 { |
15792
99b7be36631b
lib-index: Fixes to handling broken cache records that point outside file.
Timo Sirainen <tss@iki.fi>
parents:
15567
diff
changeset
|
423 struct stat st; |
15311
022d0d21e56d
lib-index: mail_cache_map() API cleanup
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
424 const void *data; |
2866
bf1e718e7370
Cache file works now with mmap_disable=yes. Still needs a few optimizations.
Timo Sirainen <tss@iki.fi>
parents:
2853
diff
changeset
|
425 ssize_t ret; |
bf1e718e7370
Cache file works now with mmap_disable=yes. Still needs a few optimizations.
Timo Sirainen <tss@iki.fi>
parents:
2853
diff
changeset
|
426 |
2275
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2251
diff
changeset
|
427 if (size == 0) |
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2251
diff
changeset
|
428 size = sizeof(struct mail_cache_header); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
429 |
15792
99b7be36631b
lib-index: Fixes to handling broken cache records that point outside file.
Timo Sirainen <tss@iki.fi>
parents:
15567
diff
changeset
|
430 /* verify offset + size before trying to allocate a huge amount of |
99b7be36631b
lib-index: Fixes to handling broken cache records that point outside file.
Timo Sirainen <tss@iki.fi>
parents:
15567
diff
changeset
|
431 memory due to them. note that we may be prefetching more than we |
99b7be36631b
lib-index: Fixes to handling broken cache records that point outside file.
Timo Sirainen <tss@iki.fi>
parents:
15567
diff
changeset
|
432 actually need, so don't fail too early. */ |
15805
443ff272317f
lib-index: Bug in cache file size verification caused the whole cache file to be mapped.
Timo Sirainen <tss@iki.fi>
parents:
15793
diff
changeset
|
433 if ((size > cache->mmap_length || offset + size > cache->mmap_length) && |
443ff272317f
lib-index: Bug in cache file size verification caused the whole cache file to be mapped.
Timo Sirainen <tss@iki.fi>
parents:
15793
diff
changeset
|
434 (offset > 0 || size > sizeof(struct mail_cache_header))) { |
15792
99b7be36631b
lib-index: Fixes to handling broken cache records that point outside file.
Timo Sirainen <tss@iki.fi>
parents:
15567
diff
changeset
|
435 if (fstat(cache->fd, &st) < 0) { |
99b7be36631b
lib-index: Fixes to handling broken cache records that point outside file.
Timo Sirainen <tss@iki.fi>
parents:
15567
diff
changeset
|
436 i_error("fstat(%s) failed: %m", cache->filepath); |
99b7be36631b
lib-index: Fixes to handling broken cache records that point outside file.
Timo Sirainen <tss@iki.fi>
parents:
15567
diff
changeset
|
437 return -1; |
99b7be36631b
lib-index: Fixes to handling broken cache records that point outside file.
Timo Sirainen <tss@iki.fi>
parents:
15567
diff
changeset
|
438 } |
99b7be36631b
lib-index: Fixes to handling broken cache records that point outside file.
Timo Sirainen <tss@iki.fi>
parents:
15567
diff
changeset
|
439 if (offset >= (uoff_t)st.st_size) { |
99b7be36631b
lib-index: Fixes to handling broken cache records that point outside file.
Timo Sirainen <tss@iki.fi>
parents:
15567
diff
changeset
|
440 *data_r = NULL; |
99b7be36631b
lib-index: Fixes to handling broken cache records that point outside file.
Timo Sirainen <tss@iki.fi>
parents:
15567
diff
changeset
|
441 return 0; |
99b7be36631b
lib-index: Fixes to handling broken cache records that point outside file.
Timo Sirainen <tss@iki.fi>
parents:
15567
diff
changeset
|
442 } |
15805
443ff272317f
lib-index: Bug in cache file size verification caused the whole cache file to be mapped.
Timo Sirainen <tss@iki.fi>
parents:
15793
diff
changeset
|
443 if (offset + size > (uoff_t)st.st_size) |
443ff272317f
lib-index: Bug in cache file size verification caused the whole cache file to be mapped.
Timo Sirainen <tss@iki.fi>
parents:
15793
diff
changeset
|
444 size = st.st_size - offset; |
15792
99b7be36631b
lib-index: Fixes to handling broken cache records that point outside file.
Timo Sirainen <tss@iki.fi>
parents:
15567
diff
changeset
|
445 } |
99b7be36631b
lib-index: Fixes to handling broken cache records that point outside file.
Timo Sirainen <tss@iki.fi>
parents:
15567
diff
changeset
|
446 |
15313
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
447 cache->remap_counter++; |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
448 if (cache->map_with_read) |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
449 return mail_cache_map_with_read(cache, offset, size, data_r); |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
450 |
2866
bf1e718e7370
Cache file works now with mmap_disable=yes. Still needs a few optimizations.
Timo Sirainen <tss@iki.fi>
parents:
2853
diff
changeset
|
451 if (cache->file_cache != NULL) { |
bf1e718e7370
Cache file works now with mmap_disable=yes. Still needs a few optimizations.
Timo Sirainen <tss@iki.fi>
parents:
2853
diff
changeset
|
452 ret = file_cache_read(cache->file_cache, offset, size); |
bf1e718e7370
Cache file works now with mmap_disable=yes. Still needs a few optimizations.
Timo Sirainen <tss@iki.fi>
parents:
2853
diff
changeset
|
453 if (ret < 0) { |
4023
b19ccbaa3802
Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3981
diff
changeset
|
454 /* In case of ESTALE we'll simply fail without error |
b19ccbaa3802
Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3981
diff
changeset
|
455 messages. The caller will then just have to |
b19ccbaa3802
Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3981
diff
changeset
|
456 fallback to generating the value itself. |
b19ccbaa3802
Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3981
diff
changeset
|
457 |
b19ccbaa3802
Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3981
diff
changeset
|
458 We can't simply reopen the cache flie, because |
b19ccbaa3802
Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3981
diff
changeset
|
459 using it requires also having updated file |
b19ccbaa3802
Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3981
diff
changeset
|
460 offsets. */ |
b19ccbaa3802
Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3981
diff
changeset
|
461 if (errno != ESTALE) |
b19ccbaa3802
Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3981
diff
changeset
|
462 mail_cache_set_syscall_error(cache, "read()"); |
15537
348e9bad84f0
lib-index: Fixed assert-crash caused by recent cache file changes.
Timo Sirainen <tss@iki.fi>
parents:
15536
diff
changeset
|
463 cache->hdr = NULL; |
2866
bf1e718e7370
Cache file works now with mmap_disable=yes. Still needs a few optimizations.
Timo Sirainen <tss@iki.fi>
parents:
2853
diff
changeset
|
464 return -1; |
bf1e718e7370
Cache file works now with mmap_disable=yes. Still needs a few optimizations.
Timo Sirainen <tss@iki.fi>
parents:
2853
diff
changeset
|
465 } |
bf1e718e7370
Cache file works now with mmap_disable=yes. Still needs a few optimizations.
Timo Sirainen <tss@iki.fi>
parents:
2853
diff
changeset
|
466 |
15312
0d1de37ad9d8
lib-index: Code cleanup: Removed mail_cache.data
Timo Sirainen <tss@iki.fi>
parents:
15311
diff
changeset
|
467 data = file_cache_get_map(cache->file_cache, |
0d1de37ad9d8
lib-index: Code cleanup: Removed mail_cache.data
Timo Sirainen <tss@iki.fi>
parents:
15311
diff
changeset
|
468 &cache->mmap_length); |
15313
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
469 *data_r = offset > cache->mmap_length ? NULL : |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
470 CONST_PTR_OFFSET(data, offset); |
15537
348e9bad84f0
lib-index: Fixed assert-crash caused by recent cache file changes.
Timo Sirainen <tss@iki.fi>
parents:
15536
diff
changeset
|
471 return mail_cache_map_finish(cache, offset, size, |
348e9bad84f0
lib-index: Fixed assert-crash caused by recent cache file changes.
Timo Sirainen <tss@iki.fi>
parents:
15536
diff
changeset
|
472 offset == 0 ? data : NULL, TRUE); |
2866
bf1e718e7370
Cache file works now with mmap_disable=yes. Still needs a few optimizations.
Timo Sirainen <tss@iki.fi>
parents:
2853
diff
changeset
|
473 } |
bf1e718e7370
Cache file works now with mmap_disable=yes. Still needs a few optimizations.
Timo Sirainen <tss@iki.fi>
parents:
2853
diff
changeset
|
474 |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
475 if (offset < cache->mmap_length && |
2275
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2251
diff
changeset
|
476 size <= cache->mmap_length - offset) { |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
477 /* already mapped */ |
15567
32ce915e046a
lib-index: If map_with_read gets disabled, reset the cache buffers properly.
Timo Sirainen <tss@iki.fi>
parents:
15565
diff
changeset
|
478 i_assert(cache->mmap_base != NULL); |
15311
022d0d21e56d
lib-index: mail_cache_map() API cleanup
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
479 *data_r = CONST_PTR_OFFSET(cache->mmap_base, offset); |
022d0d21e56d
lib-index: mail_cache_map() API cleanup
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
480 return 1; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
481 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
482 |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
483 if (cache->mmap_base != NULL) { |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
484 if (munmap(cache->mmap_base, cache->mmap_length) < 0) |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
485 mail_cache_set_syscall_error(cache, "munmap()"); |
2275
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2251
diff
changeset
|
486 } else { |
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2251
diff
changeset
|
487 if (cache->fd == -1) { |
3243
40b4ba3c55b8
In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents:
3224
diff
changeset
|
488 /* unusable, waiting for compression or |
40b4ba3c55b8
In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents:
3224
diff
changeset
|
489 index is in memory */ |
4247
9c3f19110538
Don't compress cache file if it was just compressed by another process.
Timo Sirainen <tss@iki.fi>
parents:
4023
diff
changeset
|
490 i_assert(cache->need_compress_file_seq != 0 || |
3243
40b4ba3c55b8
In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents:
3224
diff
changeset
|
491 MAIL_INDEX_IS_IN_MEMORY(cache->index)); |
2275
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2251
diff
changeset
|
492 return -1; |
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2251
diff
changeset
|
493 } |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
494 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
495 |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
496 /* map the whole file */ |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
497 cache->hdr = NULL; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
498 cache->mmap_length = 0; |
19917
1ef6401c749d
lib-index: After MAIL_INDEX_OPEN_FLAG_SAVEONLY access cache's read_buf wasn't always reset.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
499 if (cache->read_buf != NULL) |
1ef6401c749d
lib-index: After MAIL_INDEX_OPEN_FLAG_SAVEONLY access cache's read_buf wasn't always reset.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
500 buffer_set_used_size(cache->read_buf, 0); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
501 |
2277
41e56f28d085
Cache updating is done now by first reserving space where to write, and then
Timo Sirainen <tss@iki.fi>
parents:
2276
diff
changeset
|
502 cache->mmap_base = mmap_ro_file(cache->fd, &cache->mmap_length); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
503 if (cache->mmap_base == MAP_FAILED) { |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
504 cache->mmap_base = NULL; |
21186
34074cc72a15
lib-index: Limit mmap errors in index cache to 1/s
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21168
diff
changeset
|
505 if (ioloop_time != cache->last_mmap_error_time) { |
34074cc72a15
lib-index: Limit mmap errors in index cache to 1/s
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21168
diff
changeset
|
506 cache->last_mmap_error_time = ioloop_time; |
34074cc72a15
lib-index: Limit mmap errors in index cache to 1/s
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21168
diff
changeset
|
507 mail_cache_set_syscall_error(cache, t_strdup_printf( |
34074cc72a15
lib-index: Limit mmap errors in index cache to 1/s
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21168
diff
changeset
|
508 "mmap(size=%"PRIuSIZE_T")", cache->mmap_length)); |
34074cc72a15
lib-index: Limit mmap errors in index cache to 1/s
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21168
diff
changeset
|
509 } |
21537
8ebf69bd381b
lib-index: zero mmap_length after logging error
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents:
21447
diff
changeset
|
510 cache->mmap_length = 0; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
511 return -1; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
512 } |
15313
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
513 *data_r = offset > cache->mmap_length ? NULL : |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
514 CONST_PTR_OFFSET(cache->mmap_base, offset); |
15332
3700fb6f8a42
lib-index: After recent cache changes, cache was often wrongly being thought of as unusable
Timo Sirainen <tss@iki.fi>
parents:
15318
diff
changeset
|
515 return mail_cache_map_finish(cache, offset, size, |
3700fb6f8a42
lib-index: After recent cache changes, cache was often wrongly being thought of as unusable
Timo Sirainen <tss@iki.fi>
parents:
15318
diff
changeset
|
516 cache->mmap_base, FALSE); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
517 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
518 |
4655
df8de2e47fb5
Delay opening the cache file until it's actually needed.
Timo Sirainen <tss@iki.fi>
parents:
4653
diff
changeset
|
519 int mail_cache_open_and_verify(struct mail_cache *cache) |
df8de2e47fb5
Delay opening the cache file until it's actually needed.
Timo Sirainen <tss@iki.fi>
parents:
4653
diff
changeset
|
520 { |
df8de2e47fb5
Delay opening the cache file until it's actually needed.
Timo Sirainen <tss@iki.fi>
parents:
4653
diff
changeset
|
521 int ret; |
df8de2e47fb5
Delay opening the cache file until it's actually needed.
Timo Sirainen <tss@iki.fi>
parents:
4653
diff
changeset
|
522 |
20040
4da8d743d98f
lib-index: Fixed calling mail_cache_open_and_verify() on an already open cache.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19917
diff
changeset
|
523 if (cache->opened) |
4da8d743d98f
lib-index: Fixed calling mail_cache_open_and_verify() on an already open cache.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19917
diff
changeset
|
524 return 0; |
4655
df8de2e47fb5
Delay opening the cache file until it's actually needed.
Timo Sirainen <tss@iki.fi>
parents:
4653
diff
changeset
|
525 ret = mail_cache_try_open(cache); |
df8de2e47fb5
Delay opening the cache file until it's actually needed.
Timo Sirainen <tss@iki.fi>
parents:
4653
diff
changeset
|
526 if (ret > 0) |
df8de2e47fb5
Delay opening the cache file until it's actually needed.
Timo Sirainen <tss@iki.fi>
parents:
4653
diff
changeset
|
527 ret = mail_cache_header_fields_read(cache); |
df8de2e47fb5
Delay opening the cache file until it's actually needed.
Timo Sirainen <tss@iki.fi>
parents:
4653
diff
changeset
|
528 if (ret < 0) { |
df8de2e47fb5
Delay opening the cache file until it's actually needed.
Timo Sirainen <tss@iki.fi>
parents:
4653
diff
changeset
|
529 /* failed for some reason - doesn't really matter, |
df8de2e47fb5
Delay opening the cache file until it's actually needed.
Timo Sirainen <tss@iki.fi>
parents:
4653
diff
changeset
|
530 it's disabled for now. */ |
df8de2e47fb5
Delay opening the cache file until it's actually needed.
Timo Sirainen <tss@iki.fi>
parents:
4653
diff
changeset
|
531 mail_cache_file_close(cache); |
df8de2e47fb5
Delay opening the cache file until it's actually needed.
Timo Sirainen <tss@iki.fi>
parents:
4653
diff
changeset
|
532 } |
df8de2e47fb5
Delay opening the cache file until it's actually needed.
Timo Sirainen <tss@iki.fi>
parents:
4653
diff
changeset
|
533 return ret; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
534 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
535 |
3129
1ea614abead3
Don't complain about cache indexid changing when recreating index.
Timo Sirainen <tss@iki.fi>
parents:
3106
diff
changeset
|
536 static struct mail_cache *mail_cache_alloc(struct mail_index *index) |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
537 { |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
538 struct mail_cache *cache; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
539 |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
540 cache = i_new(struct mail_cache, 1); |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
541 cache->index = index; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
542 cache->fd = -1; |
3129
1ea614abead3
Don't complain about cache indexid changing when recreating index.
Timo Sirainen <tss@iki.fi>
parents:
3106
diff
changeset
|
543 cache->filepath = |
3316
62d31be5ae60
s/PREFIX/SUFFIX/ for .cache and .log filename suffixes..
Timo Sirainen <tss@iki.fi>
parents:
3271
diff
changeset
|
544 i_strconcat(index->filepath, MAIL_CACHE_FILE_SUFFIX, NULL); |
14078
f6102f0af71d
Increase initial memory pool sizes.
Timo Sirainen <tss@iki.fi>
parents:
13339
diff
changeset
|
545 cache->field_pool = pool_alloconly_create("Cache fields", 2048); |
14918
8eae4e205c82
Hash table API is now (mostly) type safe.
Timo Sirainen <tss@iki.fi>
parents:
14917
diff
changeset
|
546 hash_table_create(&cache->field_name_hash, cache->field_pool, 0, |
8eae4e205c82
Hash table API is now (mostly) type safe.
Timo Sirainen <tss@iki.fi>
parents:
14917
diff
changeset
|
547 strcase_hash, strcasecmp); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
548 |
9696
126132cb1c19
index: Removed duplication of mail_index_open_flags from struct mail_index.
Timo Sirainen <tss@iki.fi>
parents:
8973
diff
changeset
|
549 cache->dotlock_settings.use_excl_lock = |
126132cb1c19
index: Removed duplication of mail_index_open_flags from struct mail_index.
Timo Sirainen <tss@iki.fi>
parents:
8973
diff
changeset
|
550 (index->flags & MAIL_INDEX_OPEN_FLAG_DOTLOCK_USE_EXCL) != 0; |
126132cb1c19
index: Removed duplication of mail_index_open_flags from struct mail_index.
Timo Sirainen <tss@iki.fi>
parents:
8973
diff
changeset
|
551 cache->dotlock_settings.nfs_flush = |
126132cb1c19
index: Removed duplication of mail_index_open_flags from struct mail_index.
Timo Sirainen <tss@iki.fi>
parents:
8973
diff
changeset
|
552 (index->flags & MAIL_INDEX_OPEN_FLAG_NFS_FLUSH) != 0; |
11623
c3ee4421e86a
Added mail_max_lock_timeout setting.
Timo Sirainen <tss@iki.fi>
parents:
11438
diff
changeset
|
553 cache->dotlock_settings.timeout = |
c3ee4421e86a
Added mail_max_lock_timeout setting.
Timo Sirainen <tss@iki.fi>
parents:
11438
diff
changeset
|
554 I_MIN(MAIL_CACHE_LOCK_TIMEOUT, index->max_lock_timeout_secs); |
3106 | 555 cache->dotlock_settings.stale_timeout = MAIL_CACHE_LOCK_CHANGE_TIMEOUT; |
556 | |
9696
126132cb1c19
index: Removed duplication of mail_index_open_flags from struct mail_index.
Timo Sirainen <tss@iki.fi>
parents:
8973
diff
changeset
|
557 if (!MAIL_INDEX_IS_IN_MEMORY(index) && |
126132cb1c19
index: Removed duplication of mail_index_open_flags from struct mail_index.
Timo Sirainen <tss@iki.fi>
parents:
8973
diff
changeset
|
558 (index->flags & MAIL_INDEX_OPEN_FLAG_MMAP_DISABLE) != 0) |
21307
3a8ad59caa7d
lib-index: Use file_cache_new_path() for dovecot.index.cache
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21186
diff
changeset
|
559 cache->file_cache = file_cache_new_path(-1, cache->filepath); |
15313
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
560 cache->map_with_read = |
51f2be9aa8ad
lib-index: Added MAIL_INDEX_OPEN_FLAG_SAVEONLY to do only minimal reads from cache file.
Timo Sirainen <tss@iki.fi>
parents:
15312
diff
changeset
|
561 (cache->index->flags & MAIL_INDEX_OPEN_FLAG_SAVEONLY) != 0; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
562 |
2853
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2828
diff
changeset
|
563 cache->ext_id = |
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2828
diff
changeset
|
564 mail_index_ext_register(index, "cache", 0, |
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2828
diff
changeset
|
565 sizeof(uint32_t), sizeof(uint32_t)); |
4903
204d7edc7cdc
Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents:
4876
diff
changeset
|
566 mail_index_register_expunge_handler(index, cache->ext_id, FALSE, |
204d7edc7cdc
Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents:
4876
diff
changeset
|
567 mail_cache_expunge_handler, cache); |
2200
97bb7b127617
Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents:
1956
diff
changeset
|
568 return cache; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
569 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
570 |
3129
1ea614abead3
Don't complain about cache indexid changing when recreating index.
Timo Sirainen <tss@iki.fi>
parents:
3106
diff
changeset
|
571 struct mail_cache *mail_cache_open_or_create(struct mail_index *index) |
1ea614abead3
Don't complain about cache indexid changing when recreating index.
Timo Sirainen <tss@iki.fi>
parents:
3106
diff
changeset
|
572 { |
1ea614abead3
Don't complain about cache indexid changing when recreating index.
Timo Sirainen <tss@iki.fi>
parents:
3106
diff
changeset
|
573 struct mail_cache *cache; |
1ea614abead3
Don't complain about cache indexid changing when recreating index.
Timo Sirainen <tss@iki.fi>
parents:
3106
diff
changeset
|
574 |
1ea614abead3
Don't complain about cache indexid changing when recreating index.
Timo Sirainen <tss@iki.fi>
parents:
3106
diff
changeset
|
575 cache = mail_cache_alloc(index); |
1ea614abead3
Don't complain about cache indexid changing when recreating index.
Timo Sirainen <tss@iki.fi>
parents:
3106
diff
changeset
|
576 return cache; |
1ea614abead3
Don't complain about cache indexid changing when recreating index.
Timo Sirainen <tss@iki.fi>
parents:
3106
diff
changeset
|
577 } |
1ea614abead3
Don't complain about cache indexid changing when recreating index.
Timo Sirainen <tss@iki.fi>
parents:
3106
diff
changeset
|
578 |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
579 void mail_cache_free(struct mail_cache **_cache) |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
580 { |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
581 struct mail_cache *cache = *_cache; |
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
582 |
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
583 *_cache = NULL; |
15371
67afcb730109
lib-index: Cache record linking is now while writing new records, not later with pwrite().
Timo Sirainen <tss@iki.fi>
parents:
15369
diff
changeset
|
584 if (cache->file_cache != NULL) |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
585 file_cache_free(&cache->file_cache); |
2866
bf1e718e7370
Cache file works now with mmap_disable=yes. Still needs a few optimizations.
Timo Sirainen <tss@iki.fi>
parents:
2853
diff
changeset
|
586 |
3224
f6e0d1826645
Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
587 mail_index_unregister_expunge_handler(cache->index, cache->ext_id); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
588 mail_cache_file_close(cache); |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
589 |
15536
e62938129955
lib-index: Fixed memory leak with MAIL_INDEX_OPEN_FLAG_SAVEONLY
Timo Sirainen <tss@iki.fi>
parents:
15505
diff
changeset
|
590 if (cache->read_buf != NULL) |
e62938129955
lib-index: Fixed memory leak with MAIL_INDEX_OPEN_FLAG_SAVEONLY
Timo Sirainen <tss@iki.fi>
parents:
15505
diff
changeset
|
591 buffer_free(&cache->read_buf); |
8573
f9166a09423a
Renamed hash_*() to hash_table_*() to avoid conflicts with OSX's strhash.h
Timo Sirainen <tss@iki.fi>
parents:
8292
diff
changeset
|
592 hash_table_destroy(&cache->field_name_hash); |
6428
7cad076906eb
pool_unref() now takes ** pointer.
Timo Sirainen <tss@iki.fi>
parents:
6417
diff
changeset
|
593 pool_unref(&cache->field_pool); |
2362
f2acbe281ac1
Allocate cache->fields and cache->fields_file_map with malloc rather than
Timo Sirainen <tss@iki.fi>
parents:
2343
diff
changeset
|
594 i_free(cache->field_file_map); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2307
diff
changeset
|
595 i_free(cache->file_field_map); |
2362
f2acbe281ac1
Allocate cache->fields and cache->fields_file_map with malloc rather than
Timo Sirainen <tss@iki.fi>
parents:
2343
diff
changeset
|
596 i_free(cache->fields); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
597 i_free(cache->filepath); |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
598 i_free(cache); |
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 |
8188
2db48458d73b
Mail cache compression: If we can't get lock immediately, do it later.
Timo Sirainen <tss@iki.fi>
parents:
8187
diff
changeset
|
601 static int mail_cache_lock_file(struct mail_cache *cache, bool nonblock) |
5972
9fb9dc4d8df8
Flush NFS caches when needed if MAIL_INDEX_OPEN_FLAG_NFS_FLUSH is enabled.
Timo Sirainen <tss@iki.fi>
parents:
5947
diff
changeset
|
602 { |
11623
c3ee4421e86a
Added mail_max_lock_timeout setting.
Timo Sirainen <tss@iki.fi>
parents:
11438
diff
changeset
|
603 unsigned int timeout_secs; |
5972
9fb9dc4d8df8
Flush NFS caches when needed if MAIL_INDEX_OPEN_FLAG_NFS_FLUSH is enabled.
Timo Sirainen <tss@iki.fi>
parents:
5947
diff
changeset
|
604 int ret; |
9fb9dc4d8df8
Flush NFS caches when needed if MAIL_INDEX_OPEN_FLAG_NFS_FLUSH is enabled.
Timo Sirainen <tss@iki.fi>
parents:
5947
diff
changeset
|
605 |
8190
9902de77194e
Mail cache: If locking failed, the next time try to lock it only once.
Timo Sirainen <tss@iki.fi>
parents:
8189
diff
changeset
|
606 if (cache->last_lock_failed) { |
9902de77194e
Mail cache: If locking failed, the next time try to lock it only once.
Timo Sirainen <tss@iki.fi>
parents:
8189
diff
changeset
|
607 /* previous locking failed. don't waste time waiting on it |
9902de77194e
Mail cache: If locking failed, the next time try to lock it only once.
Timo Sirainen <tss@iki.fi>
parents:
8189
diff
changeset
|
608 again, just try once to see if it's available now. */ |
9902de77194e
Mail cache: If locking failed, the next time try to lock it only once.
Timo Sirainen <tss@iki.fi>
parents:
8189
diff
changeset
|
609 nonblock = TRUE; |
9902de77194e
Mail cache: If locking failed, the next time try to lock it only once.
Timo Sirainen <tss@iki.fi>
parents:
8189
diff
changeset
|
610 } |
9902de77194e
Mail cache: If locking failed, the next time try to lock it only once.
Timo Sirainen <tss@iki.fi>
parents:
8189
diff
changeset
|
611 |
4876
f1d77064884c
Lock handling changes. Everything goes through file-lock API now and there's
Timo Sirainen <tss@iki.fi>
parents:
4657
diff
changeset
|
612 if (cache->index->lock_method != FILE_LOCK_METHOD_DOTLOCK) { |
f1d77064884c
Lock handling changes. Everything goes through file-lock API now and there's
Timo Sirainen <tss@iki.fi>
parents:
4657
diff
changeset
|
613 i_assert(cache->file_lock == NULL); |
11623
c3ee4421e86a
Added mail_max_lock_timeout setting.
Timo Sirainen <tss@iki.fi>
parents:
11438
diff
changeset
|
614 timeout_secs = I_MIN(MAIL_CACHE_LOCK_TIMEOUT, |
c3ee4421e86a
Added mail_max_lock_timeout setting.
Timo Sirainen <tss@iki.fi>
parents:
11438
diff
changeset
|
615 cache->index->max_lock_timeout_secs); |
c3ee4421e86a
Added mail_max_lock_timeout setting.
Timo Sirainen <tss@iki.fi>
parents:
11438
diff
changeset
|
616 |
5972
9fb9dc4d8df8
Flush NFS caches when needed if MAIL_INDEX_OPEN_FLAG_NFS_FLUSH is enabled.
Timo Sirainen <tss@iki.fi>
parents:
5947
diff
changeset
|
617 ret = mail_index_lock_fd(cache->index, cache->filepath, |
9fb9dc4d8df8
Flush NFS caches when needed if MAIL_INDEX_OPEN_FLAG_NFS_FLUSH is enabled.
Timo Sirainen <tss@iki.fi>
parents:
5947
diff
changeset
|
618 cache->fd, F_WRLCK, |
11623
c3ee4421e86a
Added mail_max_lock_timeout setting.
Timo Sirainen <tss@iki.fi>
parents:
11438
diff
changeset
|
619 nonblock ? 0 : timeout_secs, |
5972
9fb9dc4d8df8
Flush NFS caches when needed if MAIL_INDEX_OPEN_FLAG_NFS_FLUSH is enabled.
Timo Sirainen <tss@iki.fi>
parents:
5947
diff
changeset
|
620 &cache->file_lock); |
4876
f1d77064884c
Lock handling changes. Everything goes through file-lock API now and there's
Timo Sirainen <tss@iki.fi>
parents:
4657
diff
changeset
|
621 } else { |
8188
2db48458d73b
Mail cache compression: If we can't get lock immediately, do it later.
Timo Sirainen <tss@iki.fi>
parents:
8187
diff
changeset
|
622 enum dotlock_create_flags flags = |
2db48458d73b
Mail cache compression: If we can't get lock immediately, do it later.
Timo Sirainen <tss@iki.fi>
parents:
8187
diff
changeset
|
623 nonblock ? DOTLOCK_CREATE_FLAG_NONBLOCK : 0; |
2db48458d73b
Mail cache compression: If we can't get lock immediately, do it later.
Timo Sirainen <tss@iki.fi>
parents:
8187
diff
changeset
|
624 |
4876
f1d77064884c
Lock handling changes. Everything goes through file-lock API now and there's
Timo Sirainen <tss@iki.fi>
parents:
4657
diff
changeset
|
625 i_assert(cache->dotlock == NULL); |
5972
9fb9dc4d8df8
Flush NFS caches when needed if MAIL_INDEX_OPEN_FLAG_NFS_FLUSH is enabled.
Timo Sirainen <tss@iki.fi>
parents:
5947
diff
changeset
|
626 ret = file_dotlock_create(&cache->dotlock_settings, |
8188
2db48458d73b
Mail cache compression: If we can't get lock immediately, do it later.
Timo Sirainen <tss@iki.fi>
parents:
8187
diff
changeset
|
627 cache->filepath, flags, |
2db48458d73b
Mail cache compression: If we can't get lock immediately, do it later.
Timo Sirainen <tss@iki.fi>
parents:
8187
diff
changeset
|
628 &cache->dotlock); |
8189
7528e7256a1a
Mail cache: Don't warn if dotlocking fails due to timeout (non-dotlocking already didn't).
Timo Sirainen <tss@iki.fi>
parents:
8188
diff
changeset
|
629 if (ret < 0) { |
6772
b78cfc60f6a1
Added missing error logging for file_dotlock_create/open calls.
Timo Sirainen <tss@iki.fi>
parents:
6708
diff
changeset
|
630 mail_cache_set_syscall_error(cache, |
b78cfc60f6a1
Added missing error logging for file_dotlock_create/open calls.
Timo Sirainen <tss@iki.fi>
parents:
6708
diff
changeset
|
631 "file_dotlock_create()"); |
b78cfc60f6a1
Added missing error logging for file_dotlock_create/open calls.
Timo Sirainen <tss@iki.fi>
parents:
6708
diff
changeset
|
632 } |
4876
f1d77064884c
Lock handling changes. Everything goes through file-lock API now and there's
Timo Sirainen <tss@iki.fi>
parents:
4657
diff
changeset
|
633 } |
8190
9902de77194e
Mail cache: If locking failed, the next time try to lock it only once.
Timo Sirainen <tss@iki.fi>
parents:
8189
diff
changeset
|
634 cache->last_lock_failed = ret <= 0; |
5972
9fb9dc4d8df8
Flush NFS caches when needed if MAIL_INDEX_OPEN_FLAG_NFS_FLUSH is enabled.
Timo Sirainen <tss@iki.fi>
parents:
5947
diff
changeset
|
635 |
8189
7528e7256a1a
Mail cache: Don't warn if dotlocking fails due to timeout (non-dotlocking already didn't).
Timo Sirainen <tss@iki.fi>
parents:
8188
diff
changeset
|
636 /* don't bother warning if locking failed due to a timeout. since cache |
7528e7256a1a
Mail cache: Don't warn if dotlocking fails due to timeout (non-dotlocking already didn't).
Timo Sirainen <tss@iki.fi>
parents:
8188
diff
changeset
|
637 updating isn't all that important we're using a very short timeout |
7528e7256a1a
Mail cache: Don't warn if dotlocking fails due to timeout (non-dotlocking already didn't).
Timo Sirainen <tss@iki.fi>
parents:
8188
diff
changeset
|
638 so it can be triggered sometimes on heavy load */ |
5972
9fb9dc4d8df8
Flush NFS caches when needed if MAIL_INDEX_OPEN_FLAG_NFS_FLUSH is enabled.
Timo Sirainen <tss@iki.fi>
parents:
5947
diff
changeset
|
639 if (ret <= 0) |
9fb9dc4d8df8
Flush NFS caches when needed if MAIL_INDEX_OPEN_FLAG_NFS_FLUSH is enabled.
Timo Sirainen <tss@iki.fi>
parents:
5947
diff
changeset
|
640 return ret; |
9fb9dc4d8df8
Flush NFS caches when needed if MAIL_INDEX_OPEN_FLAG_NFS_FLUSH is enabled.
Timo Sirainen <tss@iki.fi>
parents:
5947
diff
changeset
|
641 |
6829
dbab5e592577
NFS cache flushing APIs changed and backend implements it a bit differently.
Timo Sirainen <tss@iki.fi>
parents:
6827
diff
changeset
|
642 mail_index_flush_read_cache(cache->index, cache->filepath, cache->fd, |
dbab5e592577
NFS cache flushing APIs changed and backend implements it a bit differently.
Timo Sirainen <tss@iki.fi>
parents:
6827
diff
changeset
|
643 TRUE); |
5972
9fb9dc4d8df8
Flush NFS caches when needed if MAIL_INDEX_OPEN_FLAG_NFS_FLUSH is enabled.
Timo Sirainen <tss@iki.fi>
parents:
5947
diff
changeset
|
644 return 1; |
4876
f1d77064884c
Lock handling changes. Everything goes through file-lock API now and there's
Timo Sirainen <tss@iki.fi>
parents:
4657
diff
changeset
|
645 } |
f1d77064884c
Lock handling changes. Everything goes through file-lock API now and there's
Timo Sirainen <tss@iki.fi>
parents:
4657
diff
changeset
|
646 |
f1d77064884c
Lock handling changes. Everything goes through file-lock API now and there's
Timo Sirainen <tss@iki.fi>
parents:
4657
diff
changeset
|
647 static void mail_cache_unlock_file(struct mail_cache *cache) |
f1d77064884c
Lock handling changes. Everything goes through file-lock API now and there's
Timo Sirainen <tss@iki.fi>
parents:
4657
diff
changeset
|
648 { |
f1d77064884c
Lock handling changes. Everything goes through file-lock API now and there's
Timo Sirainen <tss@iki.fi>
parents:
4657
diff
changeset
|
649 if (cache->index->lock_method != FILE_LOCK_METHOD_DOTLOCK) |
f1d77064884c
Lock handling changes. Everything goes through file-lock API now and there's
Timo Sirainen <tss@iki.fi>
parents:
4657
diff
changeset
|
650 file_unlock(&cache->file_lock); |
f1d77064884c
Lock handling changes. Everything goes through file-lock API now and there's
Timo Sirainen <tss@iki.fi>
parents:
4657
diff
changeset
|
651 else |
14637
a77ad2346cf0
Added file_dotlock_delete_verified() and changed file_dotlock_delete() to return void.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
652 file_dotlock_delete(&cache->dotlock); |
2941
89ab5c72430d
lock_method=dotlock doesn't crash anymore while trying to modify cache file.
Timo Sirainen <tss@iki.fi>
parents:
2936
diff
changeset
|
653 } |
89ab5c72430d
lock_method=dotlock doesn't crash anymore while trying to modify cache file.
Timo Sirainen <tss@iki.fi>
parents:
2936
diff
changeset
|
654 |
8188
2db48458d73b
Mail cache compression: If we can't get lock immediately, do it later.
Timo Sirainen <tss@iki.fi>
parents:
8187
diff
changeset
|
655 static int |
17902
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
656 mail_cache_lock_full(struct mail_cache *cache, bool nonblock) |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
657 { |
2853
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2828
diff
changeset
|
658 const struct mail_index_ext *ext; |
15311
022d0d21e56d
lib-index: mail_cache_map() API cleanup
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
659 const void *data; |
5947
7ebe0593f488
Don't create cache file until something is actually being added to it.
Timo Sirainen <tss@iki.fi>
parents:
5736
diff
changeset
|
660 struct mail_index_view *iview; |
7ebe0593f488
Don't create cache file until something is actually being added to it.
Timo Sirainen <tss@iki.fi>
parents:
5736
diff
changeset
|
661 uint32_t reset_id; |
17902
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
662 int i; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
663 |
2277
41e56f28d085
Cache updating is done now by first reserving space where to write, and then
Timo Sirainen <tss@iki.fi>
parents:
2276
diff
changeset
|
664 i_assert(!cache->locked); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
665 |
4655
df8de2e47fb5
Delay opening the cache file until it's actually needed.
Timo Sirainen <tss@iki.fi>
parents:
4653
diff
changeset
|
666 if (!cache->opened) |
df8de2e47fb5
Delay opening the cache file until it's actually needed.
Timo Sirainen <tss@iki.fi>
parents:
4653
diff
changeset
|
667 (void)mail_cache_open_and_verify(cache); |
df8de2e47fb5
Delay opening the cache file until it's actually needed.
Timo Sirainen <tss@iki.fi>
parents:
4653
diff
changeset
|
668 |
3833
318c70c1d4ec
Beginnings of fallbacking to in-memory indexes when write fails with "out of
Timo Sirainen <tss@iki.fi>
parents:
3819
diff
changeset
|
669 if (MAIL_CACHE_IS_UNUSABLE(cache) || |
11438
7adc45a6da2e
lib-index: If index is read-only, always fail when trying to lock cache file.
Timo Sirainen <tss@iki.fi>
parents:
10686
diff
changeset
|
670 MAIL_INDEX_IS_IN_MEMORY(cache->index) || |
7adc45a6da2e
lib-index: If index is read-only, always fail when trying to lock cache file.
Timo Sirainen <tss@iki.fi>
parents:
10686
diff
changeset
|
671 cache->index->readonly) |
2220
357bc14b6d05
Disable cache with mmap_disabled=yes, for now.
Timo Sirainen <tss@iki.fi>
parents:
2204
diff
changeset
|
672 return 0; |
357bc14b6d05
Disable cache with mmap_disabled=yes, for now.
Timo Sirainen <tss@iki.fi>
parents:
2204
diff
changeset
|
673 |
17902
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
674 for (;;) { |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
675 if (mail_cache_lock_file(cache, nonblock) <= 0) |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
676 return -1; |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
677 i_assert(!MAIL_CACHE_IS_UNUSABLE(cache)); |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
678 if (!mail_cache_need_reopen(cache)) { |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
679 /* locked the latest file */ |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
680 break; |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
681 } |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
682 if (mail_cache_reopen_now(cache) <= 0) { |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
683 i_assert(cache->file_lock == NULL); |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
684 return -1; |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
685 } |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
686 i_assert(cache->file_lock == NULL); |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
687 /* okay, so it was just compressed. try again. */ |
2853
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2828
diff
changeset
|
688 } |
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2828
diff
changeset
|
689 |
17902
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
690 /* now verify that the index reset_id matches the cache's file_seq */ |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
691 for (i = 0; ; i++) { |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
692 iview = mail_index_view_open(cache->index); |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
693 ext = mail_index_view_get_ext(iview, cache->ext_id); |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
694 reset_id = ext == NULL ? 0 : ext->reset_id; |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
695 mail_index_view_close(&iview); |
2275
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2251
diff
changeset
|
696 |
17902
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
697 if (cache->hdr->file_seq == reset_id) |
2275
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2251
diff
changeset
|
698 break; |
17902
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
699 /* mismatch. try refreshing index once. if that doesn't help, |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
700 we can't use the cache. */ |
17907
51233ae4af26
lib-index: Fixed assert-crash in some cache locking race conditions.
Timo Sirainen <tss@iki.fi>
parents:
17902
diff
changeset
|
701 if (i > 0 || cache->index->mapping) { |
17902
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
702 mail_cache_unlock_file(cache); |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
703 return 0; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
704 } |
17902
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
705 if (mail_index_refresh(cache->index) < 0) { |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
706 mail_cache_unlock_file(cache); |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
707 return -1; |
2929 | 708 } |
2866
bf1e718e7370
Cache file works now with mmap_disable=yes. Still needs a few optimizations.
Timo Sirainen <tss@iki.fi>
parents:
2853
diff
changeset
|
709 } |
2277
41e56f28d085
Cache updating is done now by first reserving space where to write, and then
Timo Sirainen <tss@iki.fi>
parents:
2276
diff
changeset
|
710 |
17902
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
711 /* successfully locked - make sure our header is up to date */ |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
712 cache->locked = TRUE; |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
713 cache->hdr_modified = FALSE; |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
714 |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
715 if (cache->file_cache != NULL) { |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
716 file_cache_invalidate(cache->file_cache, 0, |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
717 sizeof(struct mail_cache_header)); |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
718 } |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
719 if (cache->read_buf != NULL) |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
720 buffer_set_used_size(cache->read_buf, 0); |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
721 if (mail_cache_map(cache, 0, 0, &data) <= 0) { |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
722 (void)mail_cache_unlock(cache); |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
723 return -1; |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
724 } |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
725 cache->hdr_copy = *cache->hdr; |
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
726 return 1; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
727 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
728 |
17902
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
729 int mail_cache_lock(struct mail_cache *cache) |
8188
2db48458d73b
Mail cache compression: If we can't get lock immediately, do it later.
Timo Sirainen <tss@iki.fi>
parents:
8187
diff
changeset
|
730 { |
17902
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
731 return mail_cache_lock_full(cache, FALSE); |
8188
2db48458d73b
Mail cache compression: If we can't get lock immediately, do it later.
Timo Sirainen <tss@iki.fi>
parents:
8187
diff
changeset
|
732 } |
2db48458d73b
Mail cache compression: If we can't get lock immediately, do it later.
Timo Sirainen <tss@iki.fi>
parents:
8187
diff
changeset
|
733 |
2db48458d73b
Mail cache compression: If we can't get lock immediately, do it later.
Timo Sirainen <tss@iki.fi>
parents:
8187
diff
changeset
|
734 int mail_cache_try_lock(struct mail_cache *cache) |
2db48458d73b
Mail cache compression: If we can't get lock immediately, do it later.
Timo Sirainen <tss@iki.fi>
parents:
8187
diff
changeset
|
735 { |
17902
8c84b69e7f69
lib-index: mail_cache_lock() partial rewrite.
Timo Sirainen <tss@iki.fi>
parents:
17901
diff
changeset
|
736 return mail_cache_lock_full(cache, TRUE); |
8188
2db48458d73b
Mail cache compression: If we can't get lock immediately, do it later.
Timo Sirainen <tss@iki.fi>
parents:
8187
diff
changeset
|
737 } |
2db48458d73b
Mail cache compression: If we can't get lock immediately, do it later.
Timo Sirainen <tss@iki.fi>
parents:
8187
diff
changeset
|
738 |
3627
c0e35566dd14
Unlocking cache file can also corrupt it since it modifies it. Added a
Timo Sirainen <tss@iki.fi>
parents:
3553
diff
changeset
|
739 int mail_cache_unlock(struct mail_cache *cache) |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
740 { |
3627
c0e35566dd14
Unlocking cache file can also corrupt it since it modifies it. Added a
Timo Sirainen <tss@iki.fi>
parents:
3553
diff
changeset
|
741 int ret = 0; |
c0e35566dd14
Unlocking cache file can also corrupt it since it modifies it. Added a
Timo Sirainen <tss@iki.fi>
parents:
3553
diff
changeset
|
742 |
2277
41e56f28d085
Cache updating is done now by first reserving space where to write, and then
Timo Sirainen <tss@iki.fi>
parents:
2276
diff
changeset
|
743 i_assert(cache->locked); |
41e56f28d085
Cache updating is done now by first reserving space where to write, and then
Timo Sirainen <tss@iki.fi>
parents:
2276
diff
changeset
|
744 |
2339
406692edc12d
Cache fixes. Decisions are saved again.
Timo Sirainen <tss@iki.fi>
parents:
2327
diff
changeset
|
745 if (cache->field_header_write_pending) |
3627
c0e35566dd14
Unlocking cache file can also corrupt it since it modifies it. Added a
Timo Sirainen <tss@iki.fi>
parents:
3553
diff
changeset
|
746 ret = mail_cache_header_fields_update(cache); |
2339
406692edc12d
Cache fixes. Decisions are saved again.
Timo Sirainen <tss@iki.fi>
parents:
2327
diff
changeset
|
747 |
2920
9b772db4503d
Don't write to closed cache file
Timo Sirainen <tss@iki.fi>
parents:
2908
diff
changeset
|
748 if (MAIL_CACHE_IS_UNUSABLE(cache)) { |
9b772db4503d
Don't write to closed cache file
Timo Sirainen <tss@iki.fi>
parents:
2908
diff
changeset
|
749 /* we found it to be broken during the lock. just clean up. */ |
9b772db4503d
Don't write to closed cache file
Timo Sirainen <tss@iki.fi>
parents:
2908
diff
changeset
|
750 cache->hdr_modified = FALSE; |
15190
60c4815778fb
lib-index: Simplified writing to dovecot.index.cache file.
Timo Sirainen <tss@iki.fi>
parents:
14918
diff
changeset
|
751 cache->locked = FALSE; |
3627
c0e35566dd14
Unlocking cache file can also corrupt it since it modifies it. Added a
Timo Sirainen <tss@iki.fi>
parents:
3553
diff
changeset
|
752 return -1; |
2920
9b772db4503d
Don't write to closed cache file
Timo Sirainen <tss@iki.fi>
parents:
2908
diff
changeset
|
753 } |
9b772db4503d
Don't write to closed cache file
Timo Sirainen <tss@iki.fi>
parents:
2908
diff
changeset
|
754 |
2277
41e56f28d085
Cache updating is done now by first reserving space where to write, and then
Timo Sirainen <tss@iki.fi>
parents:
2276
diff
changeset
|
755 if (cache->hdr_modified) { |
41e56f28d085
Cache updating is done now by first reserving space where to write, and then
Timo Sirainen <tss@iki.fi>
parents:
2276
diff
changeset
|
756 cache->hdr_modified = FALSE; |
3627
c0e35566dd14
Unlocking cache file can also corrupt it since it modifies it. Added a
Timo Sirainen <tss@iki.fi>
parents:
3553
diff
changeset
|
757 if (mail_cache_write(cache, &cache->hdr_copy, |
c0e35566dd14
Unlocking cache file can also corrupt it since it modifies it. Added a
Timo Sirainen <tss@iki.fi>
parents:
3553
diff
changeset
|
758 sizeof(cache->hdr_copy), 0) < 0) |
c0e35566dd14
Unlocking cache file can also corrupt it since it modifies it. Added a
Timo Sirainen <tss@iki.fi>
parents:
3553
diff
changeset
|
759 ret = -1; |
6703
75c48f171ad3
Keep a separate copy of mail_cache_header when mmap_disable=yes, otherwise
Timo Sirainen <tss@iki.fi>
parents:
6702
diff
changeset
|
760 cache->hdr_ro_copy = cache->hdr_copy; |
2866
bf1e718e7370
Cache file works now with mmap_disable=yes. Still needs a few optimizations.
Timo Sirainen <tss@iki.fi>
parents:
2853
diff
changeset
|
761 mail_cache_update_need_compress(cache); |
2277
41e56f28d085
Cache updating is done now by first reserving space where to write, and then
Timo Sirainen <tss@iki.fi>
parents:
2276
diff
changeset
|
762 } |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
763 |
11634
7f19062f58fd
Renamed fsync_disable to mail_fsync=optimized|always|never.
Timo Sirainen <tss@iki.fi>
parents:
11623
diff
changeset
|
764 if (cache->index->fsync_mode == FSYNC_MODE_ALWAYS) { |
5972
9fb9dc4d8df8
Flush NFS caches when needed if MAIL_INDEX_OPEN_FLAG_NFS_FLUSH is enabled.
Timo Sirainen <tss@iki.fi>
parents:
5947
diff
changeset
|
765 if (fdatasync(cache->fd) < 0) |
9fb9dc4d8df8
Flush NFS caches when needed if MAIL_INDEX_OPEN_FLAG_NFS_FLUSH is enabled.
Timo Sirainen <tss@iki.fi>
parents:
5947
diff
changeset
|
766 mail_cache_set_syscall_error(cache, "fdatasync()"); |
9fb9dc4d8df8
Flush NFS caches when needed if MAIL_INDEX_OPEN_FLAG_NFS_FLUSH is enabled.
Timo Sirainen <tss@iki.fi>
parents:
5947
diff
changeset
|
767 } |
9fb9dc4d8df8
Flush NFS caches when needed if MAIL_INDEX_OPEN_FLAG_NFS_FLUSH is enabled.
Timo Sirainen <tss@iki.fi>
parents:
5947
diff
changeset
|
768 |
15190
60c4815778fb
lib-index: Simplified writing to dovecot.index.cache file.
Timo Sirainen <tss@iki.fi>
parents:
14918
diff
changeset
|
769 cache->locked = FALSE; |
4876
f1d77064884c
Lock handling changes. Everything goes through file-lock API now and there's
Timo Sirainen <tss@iki.fi>
parents:
4657
diff
changeset
|
770 mail_cache_unlock_file(cache); |
3627
c0e35566dd14
Unlocking cache file can also corrupt it since it modifies it. Added a
Timo Sirainen <tss@iki.fi>
parents:
3553
diff
changeset
|
771 return ret; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
772 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
773 |
3375
9e2abc4c341c
Whenever writing to cache file, also updated file_cache. Fixes problems with
Timo Sirainen <tss@iki.fi>
parents:
3316
diff
changeset
|
774 int mail_cache_write(struct mail_cache *cache, const void *data, size_t size, |
9e2abc4c341c
Whenever writing to cache file, also updated file_cache. Fixes problems with
Timo Sirainen <tss@iki.fi>
parents:
3316
diff
changeset
|
775 uoff_t offset) |
9e2abc4c341c
Whenever writing to cache file, also updated file_cache. Fixes problems with
Timo Sirainen <tss@iki.fi>
parents:
3316
diff
changeset
|
776 { |
15190
60c4815778fb
lib-index: Simplified writing to dovecot.index.cache file.
Timo Sirainen <tss@iki.fi>
parents:
14918
diff
changeset
|
777 i_assert(cache->locked); |
60c4815778fb
lib-index: Simplified writing to dovecot.index.cache file.
Timo Sirainen <tss@iki.fi>
parents:
14918
diff
changeset
|
778 |
3375
9e2abc4c341c
Whenever writing to cache file, also updated file_cache. Fixes problems with
Timo Sirainen <tss@iki.fi>
parents:
3316
diff
changeset
|
779 if (pwrite_full(cache->fd, data, size, offset) < 0) { |
9e2abc4c341c
Whenever writing to cache file, also updated file_cache. Fixes problems with
Timo Sirainen <tss@iki.fi>
parents:
3316
diff
changeset
|
780 mail_cache_set_syscall_error(cache, "pwrite_full()"); |
9e2abc4c341c
Whenever writing to cache file, also updated file_cache. Fixes problems with
Timo Sirainen <tss@iki.fi>
parents:
3316
diff
changeset
|
781 return -1; |
9e2abc4c341c
Whenever writing to cache file, also updated file_cache. Fixes problems with
Timo Sirainen <tss@iki.fi>
parents:
3316
diff
changeset
|
782 } |
9e2abc4c341c
Whenever writing to cache file, also updated file_cache. Fixes problems with
Timo Sirainen <tss@iki.fi>
parents:
3316
diff
changeset
|
783 |
15312
0d1de37ad9d8
lib-index: Code cleanup: Removed mail_cache.data
Timo Sirainen <tss@iki.fi>
parents:
15311
diff
changeset
|
784 if (cache->file_cache != NULL) |
3375
9e2abc4c341c
Whenever writing to cache file, also updated file_cache. Fixes problems with
Timo Sirainen <tss@iki.fi>
parents:
3316
diff
changeset
|
785 file_cache_write(cache->file_cache, data, size, offset); |
15505
8252bcd7c489
lib-index: MAIL_INDEX_OPEN_FLAG_SAVEONLY may have caused stale data to be read from cache.
Timo Sirainen <tss@iki.fi>
parents:
15504
diff
changeset
|
786 if (cache->read_buf != NULL) |
8252bcd7c489
lib-index: MAIL_INDEX_OPEN_FLAG_SAVEONLY may have caused stale data to be read from cache.
Timo Sirainen <tss@iki.fi>
parents:
15504
diff
changeset
|
787 buffer_set_used_size(cache->read_buf, 0); |
3375
9e2abc4c341c
Whenever writing to cache file, also updated file_cache. Fixes problems with
Timo Sirainen <tss@iki.fi>
parents:
3316
diff
changeset
|
788 return 0; |
9e2abc4c341c
Whenever writing to cache file, also updated file_cache. Fixes problems with
Timo Sirainen <tss@iki.fi>
parents:
3316
diff
changeset
|
789 } |
9e2abc4c341c
Whenever writing to cache file, also updated file_cache. Fixes problems with
Timo Sirainen <tss@iki.fi>
parents:
3316
diff
changeset
|
790 |
15190
60c4815778fb
lib-index: Simplified writing to dovecot.index.cache file.
Timo Sirainen <tss@iki.fi>
parents:
14918
diff
changeset
|
791 int mail_cache_append(struct mail_cache *cache, const void *data, size_t size, |
15371
67afcb730109
lib-index: Cache record linking is now while writing new records, not later with pwrite().
Timo Sirainen <tss@iki.fi>
parents:
15369
diff
changeset
|
792 uint32_t *offset) |
15190
60c4815778fb
lib-index: Simplified writing to dovecot.index.cache file.
Timo Sirainen <tss@iki.fi>
parents:
14918
diff
changeset
|
793 { |
60c4815778fb
lib-index: Simplified writing to dovecot.index.cache file.
Timo Sirainen <tss@iki.fi>
parents:
14918
diff
changeset
|
794 struct stat st; |
60c4815778fb
lib-index: Simplified writing to dovecot.index.cache file.
Timo Sirainen <tss@iki.fi>
parents:
14918
diff
changeset
|
795 |
15371
67afcb730109
lib-index: Cache record linking is now while writing new records, not later with pwrite().
Timo Sirainen <tss@iki.fi>
parents:
15369
diff
changeset
|
796 if (*offset == 0) { |
67afcb730109
lib-index: Cache record linking is now while writing new records, not later with pwrite().
Timo Sirainen <tss@iki.fi>
parents:
15369
diff
changeset
|
797 if (fstat(cache->fd, &st) < 0) { |
67afcb730109
lib-index: Cache record linking is now while writing new records, not later with pwrite().
Timo Sirainen <tss@iki.fi>
parents:
15369
diff
changeset
|
798 if (!ESTALE_FSTAT(errno)) |
67afcb730109
lib-index: Cache record linking is now while writing new records, not later with pwrite().
Timo Sirainen <tss@iki.fi>
parents:
15369
diff
changeset
|
799 mail_cache_set_syscall_error(cache, "fstat()"); |
67afcb730109
lib-index: Cache record linking is now while writing new records, not later with pwrite().
Timo Sirainen <tss@iki.fi>
parents:
15369
diff
changeset
|
800 return -1; |
67afcb730109
lib-index: Cache record linking is now while writing new records, not later with pwrite().
Timo Sirainen <tss@iki.fi>
parents:
15369
diff
changeset
|
801 } |
21351
10034ed9ee46
lib-index: Fix checking if cache file becomes >4GB
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21307
diff
changeset
|
802 if (st.st_size > (uint32_t)-1) { |
10034ed9ee46
lib-index: Fix checking if cache file becomes >4GB
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21307
diff
changeset
|
803 mail_cache_set_corrupted(cache, "Cache file too large"); |
10034ed9ee46
lib-index: Fix checking if cache file becomes >4GB
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21307
diff
changeset
|
804 return -1; |
10034ed9ee46
lib-index: Fix checking if cache file becomes >4GB
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21307
diff
changeset
|
805 } |
15371
67afcb730109
lib-index: Cache record linking is now while writing new records, not later with pwrite().
Timo Sirainen <tss@iki.fi>
parents:
15369
diff
changeset
|
806 *offset = st.st_size; |
15190
60c4815778fb
lib-index: Simplified writing to dovecot.index.cache file.
Timo Sirainen <tss@iki.fi>
parents:
14918
diff
changeset
|
807 } |
21351
10034ed9ee46
lib-index: Fix checking if cache file becomes >4GB
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21307
diff
changeset
|
808 if ((uint32_t)-1 - *offset < size) { |
15190
60c4815778fb
lib-index: Simplified writing to dovecot.index.cache file.
Timo Sirainen <tss@iki.fi>
parents:
14918
diff
changeset
|
809 mail_cache_set_corrupted(cache, "Cache file too large"); |
60c4815778fb
lib-index: Simplified writing to dovecot.index.cache file.
Timo Sirainen <tss@iki.fi>
parents:
14918
diff
changeset
|
810 return -1; |
60c4815778fb
lib-index: Simplified writing to dovecot.index.cache file.
Timo Sirainen <tss@iki.fi>
parents:
14918
diff
changeset
|
811 } |
15371
67afcb730109
lib-index: Cache record linking is now while writing new records, not later with pwrite().
Timo Sirainen <tss@iki.fi>
parents:
15369
diff
changeset
|
812 if (mail_cache_write(cache, data, size, *offset) < 0) |
15190
60c4815778fb
lib-index: Simplified writing to dovecot.index.cache file.
Timo Sirainen <tss@iki.fi>
parents:
14918
diff
changeset
|
813 return -1; |
60c4815778fb
lib-index: Simplified writing to dovecot.index.cache file.
Timo Sirainen <tss@iki.fi>
parents:
14918
diff
changeset
|
814 |
60c4815778fb
lib-index: Simplified writing to dovecot.index.cache file.
Timo Sirainen <tss@iki.fi>
parents:
14918
diff
changeset
|
815 /* FIXME: this is updated only so that older Dovecot versions (<=v2.1) |
60c4815778fb
lib-index: Simplified writing to dovecot.index.cache file.
Timo Sirainen <tss@iki.fi>
parents:
14918
diff
changeset
|
816 can read this file. we can remove this later. */ |
60c4815778fb
lib-index: Simplified writing to dovecot.index.cache file.
Timo Sirainen <tss@iki.fi>
parents:
14918
diff
changeset
|
817 cache->hdr_modified = TRUE; |
15371
67afcb730109
lib-index: Cache record linking is now while writing new records, not later with pwrite().
Timo Sirainen <tss@iki.fi>
parents:
15369
diff
changeset
|
818 cache->hdr_copy.backwards_compat_used_file_size = *offset + size; |
15190
60c4815778fb
lib-index: Simplified writing to dovecot.index.cache file.
Timo Sirainen <tss@iki.fi>
parents:
14918
diff
changeset
|
819 return 0; |
60c4815778fb
lib-index: Simplified writing to dovecot.index.cache file.
Timo Sirainen <tss@iki.fi>
parents:
14918
diff
changeset
|
820 } |
60c4815778fb
lib-index: Simplified writing to dovecot.index.cache file.
Timo Sirainen <tss@iki.fi>
parents:
14918
diff
changeset
|
821 |
13335
11ff6a7eb576
lib-index: Added mail_cache_exists()
Timo Sirainen <tss@iki.fi>
parents:
13328
diff
changeset
|
822 bool mail_cache_exists(struct mail_cache *cache) |
11ff6a7eb576
lib-index: Added mail_cache_exists()
Timo Sirainen <tss@iki.fi>
parents:
13328
diff
changeset
|
823 { |
11ff6a7eb576
lib-index: Added mail_cache_exists()
Timo Sirainen <tss@iki.fi>
parents:
13328
diff
changeset
|
824 return !MAIL_CACHE_IS_UNUSABLE(cache); |
11ff6a7eb576
lib-index: Added mail_cache_exists()
Timo Sirainen <tss@iki.fi>
parents:
13328
diff
changeset
|
825 } |
11ff6a7eb576
lib-index: Added mail_cache_exists()
Timo Sirainen <tss@iki.fi>
parents:
13328
diff
changeset
|
826 |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
827 struct mail_cache_view * |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
828 mail_cache_view_open(struct mail_cache *cache, struct mail_index_view *iview) |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
829 { |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
830 struct mail_cache_view *view; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
831 |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
832 view = i_new(struct mail_cache_view, 1); |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
833 view->cache = cache; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
834 view->view = iview; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2307
diff
changeset
|
835 view->cached_exists_buf = |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2307
diff
changeset
|
836 buffer_create_dynamic(default_pool, |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2632
diff
changeset
|
837 cache->file_fields_count + 10); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
838 return view; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
839 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
840 |
13339
b355309955f4
lib-index: Changed mail_cache_view_close() API to take pointer-to-pointer.
Timo Sirainen <tss@iki.fi>
parents:
13335
diff
changeset
|
841 void mail_cache_view_close(struct mail_cache_view **_view) |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
842 { |
13339
b355309955f4
lib-index: Changed mail_cache_view_close() API to take pointer-to-pointer.
Timo Sirainen <tss@iki.fi>
parents:
13335
diff
changeset
|
843 struct mail_cache_view *view = *_view; |
b355309955f4
lib-index: Changed mail_cache_view_close() API to take pointer-to-pointer.
Timo Sirainen <tss@iki.fi>
parents:
13335
diff
changeset
|
844 |
6455
5ad7a36ca8c3
mail_cache_transaction_commit()/rollback() API is now public and takes a **
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
845 i_assert(view->trans_view == NULL); |
5ad7a36ca8c3
mail_cache_transaction_commit()/rollback() API is now public and takes a **
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
846 |
13339
b355309955f4
lib-index: Changed mail_cache_view_close() API to take pointer-to-pointer.
Timo Sirainen <tss@iki.fi>
parents:
13335
diff
changeset
|
847 *_view = NULL; |
8187
f1203dce2d8c
Mail cache: lock_method=dotlock could have caused a process to deadlock with itself.
Timo Sirainen <tss@iki.fi>
parents:
8183
diff
changeset
|
848 if (view->cache->field_header_write_pending && |
f1203dce2d8c
Mail cache: lock_method=dotlock could have caused a process to deadlock with itself.
Timo Sirainen <tss@iki.fi>
parents:
8183
diff
changeset
|
849 !view->cache->compressing) |
2339
406692edc12d
Cache fixes. Decisions are saved again.
Timo Sirainen <tss@iki.fi>
parents:
2327
diff
changeset
|
850 (void)mail_cache_header_fields_update(view->cache); |
406692edc12d
Cache fixes. Decisions are saved again.
Timo Sirainen <tss@iki.fi>
parents:
2327
diff
changeset
|
851 |
6414
a6a49d5efc59
Changed buffer_free() and buffer_free_without_data() APIs to take ** pointer
Timo Sirainen <tss@iki.fi>
parents:
6407
diff
changeset
|
852 buffer_free(&view->cached_exists_buf); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
853 i_free(view); |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
854 } |
6841
0c970b3493ac
mail_cache_field_want_add(): Return TRUE for temp fields only if we're
Timo Sirainen <tss@iki.fi>
parents:
6830
diff
changeset
|
855 |
13328
4a19aea565f7
lib-index: Added mail_cache_view_update_cache_decisions()
Timo Sirainen <tss@iki.fi>
parents:
12936
diff
changeset
|
856 void mail_cache_view_update_cache_decisions(struct mail_cache_view *view, |
4a19aea565f7
lib-index: Added mail_cache_view_update_cache_decisions()
Timo Sirainen <tss@iki.fi>
parents:
12936
diff
changeset
|
857 bool update) |
4a19aea565f7
lib-index: Added mail_cache_view_update_cache_decisions()
Timo Sirainen <tss@iki.fi>
parents:
12936
diff
changeset
|
858 { |
4a19aea565f7
lib-index: Added mail_cache_view_update_cache_decisions()
Timo Sirainen <tss@iki.fi>
parents:
12936
diff
changeset
|
859 view->no_decision_updates = !update; |
4a19aea565f7
lib-index: Added mail_cache_view_update_cache_decisions()
Timo Sirainen <tss@iki.fi>
parents:
12936
diff
changeset
|
860 } |
4a19aea565f7
lib-index: Added mail_cache_view_update_cache_decisions()
Timo Sirainen <tss@iki.fi>
parents:
12936
diff
changeset
|
861 |
6841
0c970b3493ac
mail_cache_field_want_add(): Return TRUE for temp fields only if we're
Timo Sirainen <tss@iki.fi>
parents:
6830
diff
changeset
|
862 uint32_t mail_cache_get_first_new_seq(struct mail_index_view *view) |
0c970b3493ac
mail_cache_field_want_add(): Return TRUE for temp fields only if we're
Timo Sirainen <tss@iki.fi>
parents:
6830
diff
changeset
|
863 { |
0c970b3493ac
mail_cache_field_want_add(): Return TRUE for temp fields only if we're
Timo Sirainen <tss@iki.fi>
parents:
6830
diff
changeset
|
864 const struct mail_index_header *idx_hdr; |
0c970b3493ac
mail_cache_field_want_add(): Return TRUE for temp fields only if we're
Timo Sirainen <tss@iki.fi>
parents:
6830
diff
changeset
|
865 uint32_t first_new_seq, message_count; |
0c970b3493ac
mail_cache_field_want_add(): Return TRUE for temp fields only if we're
Timo Sirainen <tss@iki.fi>
parents:
6830
diff
changeset
|
866 |
0c970b3493ac
mail_cache_field_want_add(): Return TRUE for temp fields only if we're
Timo Sirainen <tss@iki.fi>
parents:
6830
diff
changeset
|
867 idx_hdr = mail_index_get_header(view); |
0c970b3493ac
mail_cache_field_want_add(): Return TRUE for temp fields only if we're
Timo Sirainen <tss@iki.fi>
parents:
6830
diff
changeset
|
868 if (idx_hdr->day_first_uid[7] == 0) |
0c970b3493ac
mail_cache_field_want_add(): Return TRUE for temp fields only if we're
Timo Sirainen <tss@iki.fi>
parents:
6830
diff
changeset
|
869 return 1; |
0c970b3493ac
mail_cache_field_want_add(): Return TRUE for temp fields only if we're
Timo Sirainen <tss@iki.fi>
parents:
6830
diff
changeset
|
870 |
0c970b3493ac
mail_cache_field_want_add(): Return TRUE for temp fields only if we're
Timo Sirainen <tss@iki.fi>
parents:
6830
diff
changeset
|
871 if (!mail_index_lookup_seq_range(view, idx_hdr->day_first_uid[7], |
0c970b3493ac
mail_cache_field_want_add(): Return TRUE for temp fields only if we're
Timo Sirainen <tss@iki.fi>
parents:
6830
diff
changeset
|
872 (uint32_t)-1, &first_new_seq, |
0c970b3493ac
mail_cache_field_want_add(): Return TRUE for temp fields only if we're
Timo Sirainen <tss@iki.fi>
parents:
6830
diff
changeset
|
873 &message_count)) { |
0c970b3493ac
mail_cache_field_want_add(): Return TRUE for temp fields only if we're
Timo Sirainen <tss@iki.fi>
parents:
6830
diff
changeset
|
874 /* all messages are too old */ |
0c970b3493ac
mail_cache_field_want_add(): Return TRUE for temp fields only if we're
Timo Sirainen <tss@iki.fi>
parents:
6830
diff
changeset
|
875 return message_count+1; |
0c970b3493ac
mail_cache_field_want_add(): Return TRUE for temp fields only if we're
Timo Sirainen <tss@iki.fi>
parents:
6830
diff
changeset
|
876 } |
0c970b3493ac
mail_cache_field_want_add(): Return TRUE for temp fields only if we're
Timo Sirainen <tss@iki.fi>
parents:
6830
diff
changeset
|
877 return first_new_seq; |
0c970b3493ac
mail_cache_field_want_add(): Return TRUE for temp fields only if we're
Timo Sirainen <tss@iki.fi>
parents:
6830
diff
changeset
|
878 } |