Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/lib-index/mail-transaction-log-file.c @ 9458:adee8cb3ff5d HEAD
Minor memory allocation tweaks.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 28 Oct 2009 14:10:04 -0400 |
parents | d55146fea954 |
children | 2cf9f73cf0aa |
rev | line source |
---|---|
8590
b9faf4db2a9f
Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents:
8312
diff
changeset
|
1 /* Copyright (c) 2003-2009 Dovecot authors, see the included COPYING file */ |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "ioloop.h" |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "buffer.h" |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "file-dotlock.h" |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "nfs-workarounds.h" |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "read-full.h" |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #include "write-full.h" |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 #include "mmap-util.h" |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 #include "mail-index-private.h" |
7812
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
12 #include "mail-index-modseq.h" |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 #include "mail-transaction-log-private.h" |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 #define LOG_PREFETCH 1024 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
16 #define MEMORY_LOG_NAME "(in-memory transaction log file)" |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 void |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 mail_transaction_log_file_set_corrupted(struct mail_transaction_log_file *file, |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 const char *fmt, ...) |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 va_list va; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 |
5819 | 24 file->corrupted = TRUE; |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 file->hdr.indexid = 0; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 if (!MAIL_TRANSACTION_LOG_FILE_IN_MEMORY(file)) { |
5716
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
27 /* indexid=0 marks the log file as corrupted */ |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
28 if (pwrite_full(file->fd, &file->hdr.indexid, |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 sizeof(file->hdr.indexid), |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 offsetof(struct mail_transaction_log_header, |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 indexid)) < 0) { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 mail_index_file_set_syscall_error(file->log->index, |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 file->filepath, "pwrite()"); |
5716
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
34 } |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 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:
7086
diff
changeset
|
38 T_BEGIN { |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6929
diff
changeset
|
39 mail_index_set_error(file->log->index, |
8809
8081eb6b1c61
Improved "corrupted transaction log file" error message.
Timo Sirainen <tss@iki.fi>
parents:
8805
diff
changeset
|
40 "Corrupted transaction log file %s seq %u: %s " |
8081eb6b1c61
Improved "corrupted transaction log file" error message.
Timo Sirainen <tss@iki.fi>
parents:
8805
diff
changeset
|
41 "(sync_offset=%"PRIuUOFF_T")", |
8081eb6b1c61
Improved "corrupted transaction log file" error message.
Timo Sirainen <tss@iki.fi>
parents:
8805
diff
changeset
|
42 file->filepath, file->hdr.file_seq, |
8081eb6b1c61
Improved "corrupted transaction log file" error message.
Timo Sirainen <tss@iki.fi>
parents:
8805
diff
changeset
|
43 t_strdup_vprintf(fmt, va), file->sync_offset); |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
44 } T_END; |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 va_end(va); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 struct mail_transaction_log_file * |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 mail_transaction_log_file_alloc(struct mail_transaction_log *log, |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 const char *path) |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 struct mail_transaction_log_file *file; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 file = i_new(struct mail_transaction_log_file, 1); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 file->log = log; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 file->filepath = i_strdup(path); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 file->fd = -1; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 return file; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
61 void mail_transaction_log_file_free(struct mail_transaction_log_file **_file) |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 { |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
63 struct mail_transaction_log_file *file = *_file; |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 struct mail_transaction_log_file **p; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 int old_errno = errno; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
67 *_file = NULL; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
68 |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 mail_transaction_log_file_unlock(file); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 for (p = &file->log->files; *p != NULL; p = &(*p)->next) { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 if (*p == file) { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 *p = file->next; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 break; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 if (file == file->log->head) |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 file->log->head = NULL; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 if (file->buffer != NULL) |
6414
a6a49d5efc59
Changed buffer_free() and buffer_free_without_data() APIs to take ** pointer
Timo Sirainen <tss@iki.fi>
parents:
6360
diff
changeset
|
82 buffer_free(&file->buffer); |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 if (file->mmap_base != NULL) { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 if (munmap(file->mmap_base, file->mmap_size) < 0) { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 mail_index_file_set_syscall_error(file->log->index, |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 file->filepath, |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 "munmap()"); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 if (file->fd != -1) { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 if (close(file->fd) < 0) { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 mail_index_file_set_syscall_error(file->log->index, |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 file->filepath, |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 "close()"); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 i_free(file->filepath); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 i_free(file); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 errno = old_errno; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
106 static void |
7931
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
107 mail_transaction_log_file_skip_to_head(struct mail_transaction_log_file *file) |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 struct mail_transaction_log *log = file->log; |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
110 struct mail_index_map *map = log->index->map; |
7812
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
111 const struct mail_index_modseq_header *modseq_hdr; |
7931
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
112 uoff_t head_offset; |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 |
7931
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
114 if (map == NULL || file->hdr.file_seq != map->hdr.log_file_seq || |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
115 map->hdr.log_file_head_offset == 0) |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
116 return; |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
117 |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
118 /* we can get a valid log offset from index file. initialize |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
119 sync_offset from it so we don't have to read the whole log |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
120 file from beginning. */ |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
121 head_offset = map->hdr.log_file_head_offset; |
7812
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
122 |
7931
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
123 modseq_hdr = mail_index_map_get_modseq_header(map); |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
124 if (head_offset < file->hdr.hdr_size) { |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
125 mail_index_set_error(log->index, |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
126 "%s: log_file_head_offset too small", |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
127 log->index->filepath); |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
128 file->sync_offset = file->hdr.hdr_size; |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
129 file->sync_highest_modseq = file->hdr.initial_modseq; |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
130 } else if (modseq_hdr == NULL && file->hdr.initial_modseq == 0) { |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
131 /* modseqs not used yet */ |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
132 file->sync_offset = head_offset; |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
133 file->sync_highest_modseq = 0; |
7962
465931d0a642
Index modseq handling crashfix.
Timo Sirainen <tss@iki.fi>
parents:
7932
diff
changeset
|
134 } else if (modseq_hdr == NULL || |
465931d0a642
Index modseq handling crashfix.
Timo Sirainen <tss@iki.fi>
parents:
7932
diff
changeset
|
135 modseq_hdr->log_seq != file->hdr.file_seq) { |
7931
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
136 /* highest_modseq not synced, start from beginning */ |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
137 file->sync_offset = file->hdr.hdr_size; |
7812
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
138 file->sync_highest_modseq = file->hdr.initial_modseq; |
7931
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
139 } else if (modseq_hdr->log_offset > head_offset) { |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
140 mail_index_set_error(log->index, |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
141 "%s: modseq_hdr.log_offset too large", |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
142 log->index->filepath); |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
143 file->sync_offset = file->hdr.hdr_size; |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
144 file->sync_highest_modseq = file->hdr.initial_modseq; |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
145 } else { |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
146 /* start from where we last stopped tracking modseqs */ |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
147 file->sync_offset = modseq_hdr->log_offset; |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
148 file->sync_highest_modseq = modseq_hdr->highest_modseq; |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 } |
8811
69ddd7c9c585
indexes: Fixes to handling shrinking tail offsets.
Timo Sirainen <tss@iki.fi>
parents:
8809
diff
changeset
|
150 if (file->hdr.file_seq == log->index->map->hdr.log_file_seq) { |
69ddd7c9c585
indexes: Fixes to handling shrinking tail offsets.
Timo Sirainen <tss@iki.fi>
parents:
8809
diff
changeset
|
151 file->saved_tail_offset = |
69ddd7c9c585
indexes: Fixes to handling shrinking tail offsets.
Timo Sirainen <tss@iki.fi>
parents:
8809
diff
changeset
|
152 log->index->map->hdr.log_file_tail_offset; |
69ddd7c9c585
indexes: Fixes to handling shrinking tail offsets.
Timo Sirainen <tss@iki.fi>
parents:
8809
diff
changeset
|
153 file->saved_tail_sync_offset = file->saved_tail_offset; |
69ddd7c9c585
indexes: Fixes to handling shrinking tail offsets.
Timo Sirainen <tss@iki.fi>
parents:
8809
diff
changeset
|
154 } |
8805
3feb2afdd81f
indexes: Make sure we don't shrink log_file_tail_offset.
Timo Sirainen <tss@iki.fi>
parents:
8613
diff
changeset
|
155 if (file->saved_tail_offset > file->max_tail_offset) |
3feb2afdd81f
indexes: Make sure we don't shrink log_file_tail_offset.
Timo Sirainen <tss@iki.fi>
parents:
8613
diff
changeset
|
156 file->max_tail_offset = file->saved_tail_offset; |
7931
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
157 } |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
158 |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
159 static void |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
160 mail_transaction_log_file_add_to_list(struct mail_transaction_log_file *file) |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
161 { |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
162 struct mail_transaction_log_file **p; |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
163 |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
164 file->sync_offset = file->hdr.hdr_size; |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
165 file->sync_highest_modseq = file->hdr.initial_modseq; |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
166 mail_transaction_log_file_skip_to_head(file); |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 /* insert it to correct position */ |
7931
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
169 for (p = &file->log->files; *p != NULL; p = &(*p)->next) { |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
170 if ((*p)->hdr.file_seq > file->hdr.file_seq) |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 break; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 i_assert((*p)->hdr.file_seq < file->hdr.file_seq); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
173 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
174 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 file->next = *p; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 *p = file; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
177 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
178 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 static int |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
180 mail_transaction_log_init_hdr(struct mail_transaction_log *log, |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
181 struct mail_transaction_log_header *hdr) |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
182 { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
183 struct mail_index *index = log->index; |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
184 |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 memset(hdr, 0, sizeof(*hdr)); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 hdr->major_version = MAIL_TRANSACTION_LOG_MAJOR_VERSION; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 hdr->minor_version = MAIL_TRANSACTION_LOG_MINOR_VERSION; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
188 hdr->hdr_size = sizeof(struct mail_transaction_log_header); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
189 hdr->indexid = log->index->indexid; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
190 hdr->create_stamp = ioloop_time; |
8129
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
191 #ifndef WORDS_BIGENDIAN |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
192 hdr->compat_flags |= MAIL_INDEX_COMPAT_LITTLE_ENDIAN; |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
193 #endif |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
194 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
195 if (index->fd != -1) { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
196 /* not creating index - make sure we have latest header */ |
5819 | 197 if (!index->mapping) { |
5854 | 198 if (mail_index_map(index, |
199 MAIL_INDEX_SYNC_HANDLER_HEAD) <= 0) | |
5819 | 200 return -1; |
201 } else { | |
202 /* if we got here from mapping, the .log file is | |
203 corrupted. use whatever values we got from index | |
204 file */ | |
205 } | |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
206 } |
5772
002aa9bbfcb2
Removed index->hdr. Use index->map->hdr instead.
Timo Sirainen <tss@iki.fi>
parents:
5749
diff
changeset
|
207 if (index->map != NULL) { |
002aa9bbfcb2
Removed index->hdr. Use index->map->hdr instead.
Timo Sirainen <tss@iki.fi>
parents:
5749
diff
changeset
|
208 hdr->prev_file_seq = index->map->hdr.log_file_seq; |
002aa9bbfcb2
Removed index->hdr. Use index->map->hdr instead.
Timo Sirainen <tss@iki.fi>
parents:
5749
diff
changeset
|
209 hdr->prev_file_offset = index->map->hdr.log_file_head_offset; |
002aa9bbfcb2
Removed index->hdr. Use index->map->hdr instead.
Timo Sirainen <tss@iki.fi>
parents:
5749
diff
changeset
|
210 hdr->file_seq = index->map->hdr.log_file_seq + 1; |
7932
91758686277a
View syncing: Keep track of highest modseq in views. If we lose transaction
Timo Sirainen <tss@iki.fi>
parents:
7931
diff
changeset
|
211 hdr->initial_modseq = |
7812
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
212 mail_index_map_modseq_get_highest(index->map); |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
213 } else { |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
214 hdr->file_seq = 1; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
215 } |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
216 |
7842
6480642aba24
Make sure initial_modseq is correct when rotating transaction log.
Timo Sirainen <tss@iki.fi>
parents:
7812
diff
changeset
|
217 if (log->head != NULL) { |
6480642aba24
Make sure initial_modseq is correct when rotating transaction log.
Timo Sirainen <tss@iki.fi>
parents:
7812
diff
changeset
|
218 if (hdr->file_seq <= log->head->hdr.file_seq) { |
6480642aba24
Make sure initial_modseq is correct when rotating transaction log.
Timo Sirainen <tss@iki.fi>
parents:
7812
diff
changeset
|
219 /* make sure the sequence grows */ |
6480642aba24
Make sure initial_modseq is correct when rotating transaction log.
Timo Sirainen <tss@iki.fi>
parents:
7812
diff
changeset
|
220 hdr->file_seq = log->head->hdr.file_seq+1; |
6480642aba24
Make sure initial_modseq is correct when rotating transaction log.
Timo Sirainen <tss@iki.fi>
parents:
7812
diff
changeset
|
221 } |
6480642aba24
Make sure initial_modseq is correct when rotating transaction log.
Timo Sirainen <tss@iki.fi>
parents:
7812
diff
changeset
|
222 if (hdr->initial_modseq < log->head->sync_highest_modseq) { |
6480642aba24
Make sure initial_modseq is correct when rotating transaction log.
Timo Sirainen <tss@iki.fi>
parents:
7812
diff
changeset
|
223 /* this should be always up-to-date */ |
6480642aba24
Make sure initial_modseq is correct when rotating transaction log.
Timo Sirainen <tss@iki.fi>
parents:
7812
diff
changeset
|
224 hdr->initial_modseq = log->head->sync_highest_modseq; |
6480642aba24
Make sure initial_modseq is correct when rotating transaction log.
Timo Sirainen <tss@iki.fi>
parents:
7812
diff
changeset
|
225 } |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
226 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
227 return 0; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
228 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
229 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
230 struct mail_transaction_log_file * |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
231 mail_transaction_log_file_alloc_in_memory(struct mail_transaction_log *log) |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
232 { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
233 struct mail_transaction_log_file *file; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
234 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
235 file = mail_transaction_log_file_alloc(log, MEMORY_LOG_NAME); |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
236 if (mail_transaction_log_init_hdr(log, &file->hdr) < 0) { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
237 i_free(file); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
238 return NULL; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
239 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
240 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
241 file->buffer = buffer_create_dynamic(default_pool, 4096); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
242 file->buffer_offset = sizeof(file->hdr); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
243 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
244 mail_transaction_log_file_add_to_list(file); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
245 return file; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
246 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
247 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
248 static int |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
249 mail_transaction_log_file_dotlock(struct mail_transaction_log_file *file) |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
250 { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
251 int ret; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
252 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
253 if (file->log->dotlock_count > 0) |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
254 ret = 1; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
255 else { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
256 ret = file_dotlock_create(&file->log->dotlock_settings, |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
257 file->filepath, 0, |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
258 &file->log->dotlock); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
259 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
260 if (ret > 0) { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
261 file->log->dotlock_count++; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
262 file->locked = TRUE; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
263 return 0; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
264 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
265 if (ret < 0) { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
266 mail_index_file_set_syscall_error(file->log->index, |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
267 file->filepath, |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
268 "file_dotlock_create()"); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
269 return -1; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
270 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
271 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
272 mail_index_set_error(file->log->index, |
7359 | 273 "Timeout while waiting for " |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
274 "dotlock for transaction log file %s", |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
275 file->filepath); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
276 file->log->index->index_lock_timeout = TRUE; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
277 return -1; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
278 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
279 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
280 static int |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
281 mail_transaction_log_file_undotlock(struct mail_transaction_log_file *file) |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
282 { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
283 int ret; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
284 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
285 if (--file->log->dotlock_count > 0) |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
286 return 0; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
287 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
288 ret = file_dotlock_delete(&file->log->dotlock); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
289 if (ret < 0) { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
290 mail_index_file_set_syscall_error(file->log->index, |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
291 file->filepath, "file_dotlock_delete()"); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
292 return -1; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
293 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
294 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
295 if (ret == 0) { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
296 mail_index_set_error(file->log->index, |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
297 "Dotlock was lost for transaction log file %s", |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
298 file->filepath); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
299 return -1; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
300 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
301 return 0; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
302 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
303 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
304 int mail_transaction_log_file_lock(struct mail_transaction_log_file *file) |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
305 { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
306 int ret; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
307 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
308 if (file->locked) |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
309 return 0; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
310 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
311 if (MAIL_TRANSACTION_LOG_FILE_IN_MEMORY(file)) { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
312 file->locked = TRUE; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
313 return 0; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
314 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
315 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
316 if (file->log->index->lock_method == FILE_LOCK_METHOD_DOTLOCK) |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
317 return mail_transaction_log_file_dotlock(file); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
318 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
319 i_assert(file->file_lock == NULL); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
320 ret = mail_index_lock_fd(file->log->index, file->filepath, file->fd, |
6360
461ae76c84da
Replaced MAIL_INDEX_LOCK_SECS usage with cache/index/log specific defines
Timo Sirainen <tss@iki.fi>
parents:
6002
diff
changeset
|
321 F_WRLCK, MAIL_TRANSCATION_LOG_LOCK_TIMEOUT, |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
322 &file->file_lock); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
323 if (ret > 0) { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
324 file->locked = TRUE; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
325 return 0; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
326 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
327 if (ret < 0) { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
328 mail_index_file_set_syscall_error(file->log->index, |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
329 file->filepath, |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
330 "mail_index_wait_lock_fd()"); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
331 return -1; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
332 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
333 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
334 mail_index_set_error(file->log->index, |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
335 "Timeout while waiting for lock for transaction log file %s", |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
336 file->filepath); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
337 file->log->index->index_lock_timeout = TRUE; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
338 return -1; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
339 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
340 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
341 void mail_transaction_log_file_unlock(struct mail_transaction_log_file *file) |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
342 { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
343 if (!file->locked) |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
344 return; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
345 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
346 file->locked = FALSE; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
347 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
348 if (MAIL_TRANSACTION_LOG_FILE_IN_MEMORY(file)) |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
349 return; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
350 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
351 if (file->log->index->lock_method == FILE_LOCK_METHOD_DOTLOCK) { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
352 mail_transaction_log_file_undotlock(file); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
353 return; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
354 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
355 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
356 file_unlock(&file->file_lock); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
357 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
358 |
8129
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
359 static ssize_t |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
360 mail_transaction_log_file_read_header(struct mail_transaction_log_file *file) |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
361 { |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
362 ssize_t pos; |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
363 int ret; |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
364 |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
365 memset(&file->hdr, 0, sizeof(file->hdr)); |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
366 |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
367 /* try to read the whole header, but it's not necessarily an error to |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
368 read less since the older versions of the log format could be |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
369 smaller. */ |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
370 pos = 0; |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
371 do { |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
372 ret = pread(file->fd, PTR_OFFSET(&file->hdr, pos), |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
373 sizeof(file->hdr) - pos, pos); |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
374 if (ret > 0) |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
375 pos += ret; |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
376 } while (ret > 0 && pos < (ssize_t)sizeof(file->hdr)); |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
377 return ret < 0 ? -1 : pos; |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
378 } |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
379 |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
380 static int |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
381 mail_transaction_log_file_read_hdr(struct mail_transaction_log_file *file, |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
382 bool ignore_estale) |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
383 { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
384 struct mail_transaction_log_file *f; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
385 int ret; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
386 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
387 i_assert(!MAIL_TRANSACTION_LOG_FILE_IN_MEMORY(file)); |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
388 |
5819 | 389 if (file->corrupted) |
390 return 0; | |
391 | |
8129
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
392 ret = mail_transaction_log_file_read_header(file); |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
393 if (ret < 0) { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
394 if (errno != ESTALE || !ignore_estale) { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
395 mail_index_file_set_syscall_error(file->log->index, |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
396 file->filepath, |
8129
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
397 "pread()"); |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
398 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
399 return -1; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
400 } |
8129
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
401 if (file->hdr.major_version != MAIL_TRANSACTION_LOG_MAJOR_VERSION) { |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
402 /* incompatible version - fix silently */ |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
403 return 0; |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
404 } |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
405 if (ret < MAIL_TRANSACTION_LOG_HEADER_MIN_SIZE) { |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
406 mail_transaction_log_file_set_corrupted(file, |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
407 "unexpected end of file while reading header"); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
408 return 0; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
409 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
410 |
8129
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
411 if (file->hdr.minor_version >= 2 || file->hdr.major_version > 1) { |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
412 /* we have compatibility flags */ |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
413 enum mail_index_header_compat_flags compat_flags = 0; |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
414 |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
415 #ifndef WORDS_BIGENDIAN |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
416 compat_flags |= MAIL_INDEX_COMPAT_LITTLE_ENDIAN; |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
417 #endif |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
418 if (file->hdr.compat_flags != compat_flags) { |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
419 /* architecture change */ |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
420 mail_index_set_error(file->log->index, |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
421 "Rebuilding index file %s: " |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
422 "CPU architecture changed", |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
423 file->log->index->filepath); |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
424 return 0; |
612eb505775f
Write CPU endianess to transaction log header and check it's correct when reading.
Timo Sirainen <tss@iki.fi>
parents:
7962
diff
changeset
|
425 } |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
426 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
427 if (file->hdr.hdr_size < MAIL_TRANSACTION_LOG_HEADER_MIN_SIZE) { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
428 mail_transaction_log_file_set_corrupted(file, |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
429 "Header size too small"); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
430 return 0; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
431 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
432 if (file->hdr.hdr_size < sizeof(file->hdr)) { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
433 /* @UNSAFE: smaller than we expected - zero out the fields we |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
434 shouldn't have filled */ |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
435 memset(PTR_OFFSET(&file->hdr, file->hdr.hdr_size), 0, |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
436 sizeof(file->hdr) - file->hdr.hdr_size); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
437 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
438 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
439 if (file->hdr.indexid == 0) { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
440 /* corrupted */ |
5819 | 441 file->corrupted = TRUE; |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
442 mail_index_set_error(file->log->index, |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
443 "Transaction log file %s: marked corrupted", |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
444 file->filepath); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
445 return 0; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
446 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
447 if (file->hdr.indexid != file->log->index->indexid) { |
7573
de08cc81da73
Fixes to handling races in initial index creation.
Timo Sirainen <tss@iki.fi>
parents:
7546
diff
changeset
|
448 if (file->log->index->indexid != 0 && |
de08cc81da73
Fixes to handling races in initial index creation.
Timo Sirainen <tss@iki.fi>
parents:
7546
diff
changeset
|
449 !file->log->index->initial_create) { |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
450 /* index file was probably just rebuilt and we don't |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
451 know about it yet */ |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
452 mail_transaction_log_file_set_corrupted(file, |
5819 | 453 "indexid changed %u -> %u", |
454 file->log->index->indexid, file->hdr.indexid); | |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
455 return 0; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
456 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
457 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
458 /* creating index file. since transaction log is created |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
459 first, use the indexid in it to create the main index |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
460 to avoid races. */ |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
461 file->log->index->indexid = file->hdr.indexid; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
462 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
463 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
464 /* make sure we already don't have a file with the same sequence |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
465 opened. it shouldn't happen unless the old log file was |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
466 corrupted. */ |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
467 for (f = file->log->files; f != NULL; f = f->next) { |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
468 if (f->hdr.file_seq == file->hdr.file_seq) { |
5716
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
469 /* mark the old file corrupted. we can't safely remove |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
470 it from the list however, so return failure. */ |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
471 mail_transaction_log_file_set_corrupted(f, |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
472 "duplicate transaction log sequence (%u)", |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
473 f->hdr.file_seq); |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
474 return 0; |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
475 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
476 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
477 |
7812
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
478 file->sync_highest_modseq = file->hdr.initial_modseq; |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
479 return 1; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
480 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
481 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
482 static int |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
483 mail_transaction_log_file_stat(struct mail_transaction_log_file *file, |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
484 bool ignore_estale) |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
485 { |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
486 struct stat st; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
487 |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
488 if (fstat(file->fd, &st) < 0) { |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
489 if (errno != ESTALE || !ignore_estale) { |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
490 mail_index_file_set_syscall_error(file->log->index, |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
491 file->filepath, "fstat()"); |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
492 } |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
493 return -1; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
494 } |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
495 |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
496 file->st_dev = st.st_dev; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
497 file->st_ino = st.st_ino; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
498 file->last_mtime = st.st_mtime; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
499 file->last_size = st.st_size; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
500 return 0; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
501 } |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
502 |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
503 static bool |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
504 mail_transaction_log_file_is_dupe(struct mail_transaction_log_file *file) |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
505 { |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
506 struct mail_transaction_log_file *tmp; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
507 |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
508 for (tmp = file->log->files; tmp != NULL; tmp = tmp->next) { |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
509 if (tmp->st_ino == file->st_ino && |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
510 CMP_DEV_T(tmp->st_dev, file->st_dev)) |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
511 return TRUE; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
512 } |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
513 return FALSE; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
514 } |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
515 |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
516 static int |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
517 mail_transaction_log_file_create2(struct mail_transaction_log_file *file, |
5849
a9df50952600
Added support for resetting index.
Timo Sirainen <tss@iki.fi>
parents:
5819
diff
changeset
|
518 int new_fd, bool reset, |
a9df50952600
Added support for resetting index.
Timo Sirainen <tss@iki.fi>
parents:
5819
diff
changeset
|
519 struct dotlock **dotlock) |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
520 { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
521 struct mail_index *index = file->log->index; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
522 struct stat st; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
523 const char *path2; |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
524 int fd, ret; |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
525 bool rename_existing; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
526 |
6857 | 527 if (index->nfs_flush) { |
528 /* although we check also mtime and file size below, it's done | |
529 only to fix broken log files. we don't bother flushing | |
530 attribute cache just for that. */ | |
531 nfs_flush_file_handle_cache(file->filepath); | |
532 } | |
5972
9fb9dc4d8df8
Flush NFS caches when needed if MAIL_INDEX_OPEN_FLAG_NFS_FLUSH is enabled.
Timo Sirainen <tss@iki.fi>
parents:
5953
diff
changeset
|
533 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
534 /* log creation is locked now - see if someone already created it. |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
535 note that if we're rotating, we need to keep the log locked until |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
536 the file has been rewritten. and because fcntl() locks are stupid, |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
537 if we go and open()+close() the file and we had it already opened, |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
538 its locks are lost. so we use stat() to check if the file has been |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
539 recreated, although it almost never is. */ |
5849
a9df50952600
Added support for resetting index.
Timo Sirainen <tss@iki.fi>
parents:
5819
diff
changeset
|
540 if (reset) |
a9df50952600
Added support for resetting index.
Timo Sirainen <tss@iki.fi>
parents:
5819
diff
changeset
|
541 rename_existing = FALSE; |
a9df50952600
Added support for resetting index.
Timo Sirainen <tss@iki.fi>
parents:
5819
diff
changeset
|
542 else if (nfs_safe_stat(file->filepath, &st) < 0) { |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
543 if (errno != ENOENT) { |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
544 mail_index_file_set_syscall_error(index, file->filepath, |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
545 "stat()"); |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
546 return -1; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
547 } |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
548 rename_existing = FALSE; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
549 } else if (st.st_ino == file->st_ino && |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
550 CMP_DEV_T(st.st_dev, file->st_dev) && |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
551 /* inode/dev checks are enough when we're rotating the file, |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
552 but not when we're replacing a broken log file */ |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
553 st.st_mtime == file->last_mtime && |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
554 (uoff_t)st.st_size == file->last_size) { |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
555 /* no-one else recreated the file */ |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
556 rename_existing = TRUE; |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
557 } else { |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
558 /* recreated. use the file if its header is ok */ |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
559 fd = nfs_safe_open(file->filepath, O_RDWR); |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
560 if (fd == -1) { |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
561 if (errno != ENOENT) { |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
562 mail_index_file_set_syscall_error(index, |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
563 file->filepath, "open()"); |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
564 return -1; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
565 } |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
566 } else { |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
567 file->fd = fd; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
568 if (mail_transaction_log_file_read_hdr(file, |
5996
00be53d8f076
Fixed "duplicate transaction log sequence" errors when we noticed that log
Timo Sirainen <tss@iki.fi>
parents:
5972
diff
changeset
|
569 FALSE) > 0 && |
00be53d8f076
Fixed "duplicate transaction log sequence" errors when we noticed that log
Timo Sirainen <tss@iki.fi>
parents:
5972
diff
changeset
|
570 mail_transaction_log_file_stat(file, FALSE) == 0) { |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
571 /* yes, it was ok */ |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
572 (void)file_dotlock_delete(dotlock); |
5953 | 573 mail_transaction_log_file_add_to_list(file); |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
574 return 0; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
575 } |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
576 file->fd = -1; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
577 if (close(fd) < 0) { |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
578 mail_index_file_set_syscall_error(index, |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
579 file->filepath, "close()"); |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
580 } |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
581 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
582 rename_existing = FALSE; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
583 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
584 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
585 if (mail_transaction_log_init_hdr(file->log, &file->hdr) < 0) |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
586 return -1; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
587 |
5849
a9df50952600
Added support for resetting index.
Timo Sirainen <tss@iki.fi>
parents:
5819
diff
changeset
|
588 if (reset) { |
a9df50952600
Added support for resetting index.
Timo Sirainen <tss@iki.fi>
parents:
5819
diff
changeset
|
589 file->hdr.prev_file_seq = 0; |
a9df50952600
Added support for resetting index.
Timo Sirainen <tss@iki.fi>
parents:
5819
diff
changeset
|
590 file->hdr.prev_file_offset = 0; |
7931
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
591 file->hdr.initial_modseq = 0; |
5849
a9df50952600
Added support for resetting index.
Timo Sirainen <tss@iki.fi>
parents:
5819
diff
changeset
|
592 } |
a9df50952600
Added support for resetting index.
Timo Sirainen <tss@iki.fi>
parents:
5819
diff
changeset
|
593 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
594 if (write_full(new_fd, &file->hdr, sizeof(file->hdr)) < 0) { |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
595 mail_index_file_set_syscall_error(index, file->filepath, |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
596 "write_full()"); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
597 return -1; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
598 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
599 |
5972
9fb9dc4d8df8
Flush NFS caches when needed if MAIL_INDEX_OPEN_FLAG_NFS_FLUSH is enabled.
Timo Sirainen <tss@iki.fi>
parents:
5953
diff
changeset
|
600 if (index->nfs_flush) { |
9fb9dc4d8df8
Flush NFS caches when needed if MAIL_INDEX_OPEN_FLAG_NFS_FLUSH is enabled.
Timo Sirainen <tss@iki.fi>
parents:
5953
diff
changeset
|
601 /* the header isn't important, so don't bother calling |
9fb9dc4d8df8
Flush NFS caches when needed if MAIL_INDEX_OPEN_FLAG_NFS_FLUSH is enabled.
Timo Sirainen <tss@iki.fi>
parents:
5953
diff
changeset
|
602 fdatasync() unless NFS is used */ |
9fb9dc4d8df8
Flush NFS caches when needed if MAIL_INDEX_OPEN_FLAG_NFS_FLUSH is enabled.
Timo Sirainen <tss@iki.fi>
parents:
5953
diff
changeset
|
603 if (fdatasync(new_fd) < 0) { |
9fb9dc4d8df8
Flush NFS caches when needed if MAIL_INDEX_OPEN_FLAG_NFS_FLUSH is enabled.
Timo Sirainen <tss@iki.fi>
parents:
5953
diff
changeset
|
604 mail_index_file_set_syscall_error(index, file->filepath, |
9fb9dc4d8df8
Flush NFS caches when needed if MAIL_INDEX_OPEN_FLAG_NFS_FLUSH is enabled.
Timo Sirainen <tss@iki.fi>
parents:
5953
diff
changeset
|
605 "fdatasync()"); |
9fb9dc4d8df8
Flush NFS caches when needed if MAIL_INDEX_OPEN_FLAG_NFS_FLUSH is enabled.
Timo Sirainen <tss@iki.fi>
parents:
5953
diff
changeset
|
606 return -1; |
9fb9dc4d8df8
Flush NFS caches when needed if MAIL_INDEX_OPEN_FLAG_NFS_FLUSH is enabled.
Timo Sirainen <tss@iki.fi>
parents:
5953
diff
changeset
|
607 } |
9fb9dc4d8df8
Flush NFS caches when needed if MAIL_INDEX_OPEN_FLAG_NFS_FLUSH is enabled.
Timo Sirainen <tss@iki.fi>
parents:
5953
diff
changeset
|
608 } |
9fb9dc4d8df8
Flush NFS caches when needed if MAIL_INDEX_OPEN_FLAG_NFS_FLUSH is enabled.
Timo Sirainen <tss@iki.fi>
parents:
5953
diff
changeset
|
609 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
610 file->fd = new_fd; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
611 ret = mail_transaction_log_file_stat(file, FALSE); |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
612 |
6981
66b439e24c47
If we're rotating log file while we're locked, lock the newly created file
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
613 if (file->log->head != NULL && file->log->head->locked) { |
66b439e24c47
If we're rotating log file while we're locked, lock the newly created file
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
614 /* we'll need to preserve the lock */ |
66b439e24c47
If we're rotating log file while we're locked, lock the newly created file
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
615 if (mail_transaction_log_file_lock(file) < 0) |
66b439e24c47
If we're rotating log file while we're locked, lock the newly created file
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
616 ret = -1; |
66b439e24c47
If we're rotating log file while we're locked, lock the newly created file
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
617 } |
66b439e24c47
If we're rotating log file while we're locked, lock the newly created file
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
618 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
619 /* if we return -1 the dotlock deletion code closes the fd */ |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
620 file->fd = -1; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
621 if (ret < 0) |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
622 return -1; |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
623 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
624 /* keep two log files */ |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
625 if (rename_existing) { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
626 /* rename() would be nice and easy way to do this, except then |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
627 there's a race condition between the rename and |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
628 file_dotlock_replace(). during that time the log file |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
629 doesn't exist, which could cause problems. */ |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
630 path2 = t_strconcat(file->filepath, ".2", NULL); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
631 if (unlink(path2) < 0 && errno != ENOENT) { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
632 mail_index_set_error(index, "unlink(%s) failed: %m", |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
633 path2); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
634 /* try to link() anyway */ |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
635 } |
6813
575235932194
nfs_safe_link(): Support linking files without original link count=1. Use it
Timo Sirainen <tss@iki.fi>
parents:
6812
diff
changeset
|
636 if (nfs_safe_link(file->filepath, path2, FALSE) < 0 && |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
637 errno != ENOENT && errno != EEXIST) { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
638 mail_index_set_error(index, "link(%s, %s) failed: %m", |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
639 file->filepath, path2); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
640 /* ignore the error. we don't care that much about the |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
641 second log file and we're going to overwrite this |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
642 first one. */ |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
643 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
644 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
645 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
646 if (file_dotlock_replace(dotlock, |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
647 DOTLOCK_REPLACE_FLAG_DONT_CLOSE_FD) <= 0) |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
648 return -1; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
649 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
650 /* success */ |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
651 file->fd = new_fd; |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
652 mail_transaction_log_file_add_to_list(file); |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
653 return 0; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
654 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
655 |
5849
a9df50952600
Added support for resetting index.
Timo Sirainen <tss@iki.fi>
parents:
5819
diff
changeset
|
656 int mail_transaction_log_file_create(struct mail_transaction_log_file *file, |
a9df50952600
Added support for resetting index.
Timo Sirainen <tss@iki.fi>
parents:
5819
diff
changeset
|
657 bool reset) |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
658 { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
659 struct mail_index *index = file->log->index; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
660 struct dotlock *dotlock; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
661 mode_t old_mask; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
662 int fd; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
663 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
664 i_assert(!MAIL_INDEX_IS_IN_MEMORY(index)); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
665 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
666 /* With dotlocking we might already have path.lock created, so this |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
667 filename has to be different. */ |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
668 old_mask = umask(index->mode ^ 0666); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
669 fd = file_dotlock_open(&file->log->new_dotlock_settings, |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
670 file->filepath, 0, &dotlock); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
671 umask(old_mask); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
672 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
673 if (fd == -1) { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
674 mail_index_file_set_syscall_error(index, file->filepath, |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
675 "file_dotlock_open()"); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
676 return -1; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
677 } |
9107
0f2f9e207644
index: Handle better errors where a new file's group can't be changed.
Timo Sirainen <tss@iki.fi>
parents:
8941
diff
changeset
|
678 mail_index_fchown(index, fd, file_dotlock_get_lock_path(dotlock)); |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
679 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
680 /* either fd gets used or the dotlock gets deleted and returned fd |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
681 is for the existing file */ |
5849
a9df50952600
Added support for resetting index.
Timo Sirainen <tss@iki.fi>
parents:
5819
diff
changeset
|
682 if (mail_transaction_log_file_create2(file, fd, reset, &dotlock) < 0) { |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
683 if (dotlock != NULL) |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
684 (void)file_dotlock_delete(&dotlock); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
685 return -1; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
686 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
687 return 0; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
688 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
689 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
690 int mail_transaction_log_file_open(struct mail_transaction_log_file *file, |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
691 bool check_existing) |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
692 { |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
693 unsigned int i; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
694 bool ignore_estale; |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
695 int ret; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
696 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
697 for (i = 0;; i++) { |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
698 file->fd = nfs_safe_open(file->filepath, O_RDWR); |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
699 if (file->fd == -1) { |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
700 if (errno == ENOENT) |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
701 return 0; |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
702 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
703 mail_index_file_set_syscall_error(file->log->index, |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
704 file->filepath, "open()"); |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
705 return -1; |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
706 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
707 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
708 ignore_estale = i < MAIL_INDEX_ESTALE_RETRY_COUNT; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
709 if (mail_transaction_log_file_stat(file, ignore_estale) < 0) |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
710 ret = -1; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
711 else if (check_existing && |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
712 mail_transaction_log_file_is_dupe(file)) |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
713 return 0; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
714 else { |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
715 ret = mail_transaction_log_file_read_hdr(file, |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
716 ignore_estale); |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
717 } |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
718 if (ret > 0) { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
719 /* success */ |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
720 break; |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
721 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
722 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
723 if (ret == 0) { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
724 /* corrupted */ |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
725 if (unlink(file->filepath) < 0 && errno != ENOENT) { |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
726 mail_index_set_error(file->log->index, |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
727 "unlink(%s) failed: %m", |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
728 file->filepath); |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
729 } |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
730 return 0; |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
731 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
732 if (errno != ESTALE || |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
733 i == MAIL_INDEX_ESTALE_RETRY_COUNT) { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
734 /* syscall error */ |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
735 return -1; |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
736 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
737 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
738 /* ESTALE - try again */ |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
739 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
740 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
741 mail_transaction_log_file_add_to_list(file); |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
742 return 1; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
743 } |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
744 |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
745 static int |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
746 log_file_track_mailbox_sync_offset_hdr(struct mail_transaction_log_file *file, |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
747 const void *data, unsigned int size) |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
748 { |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
749 const struct mail_transaction_header_update *u = data; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
750 const struct mail_index_header *ihdr; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
751 const unsigned int offset_pos = |
5749
420a386fa27a
int/ext/mailbox sync offset changes: Combined mailbox and int offsets to
Timo Sirainen <tss@iki.fi>
parents:
5723
diff
changeset
|
752 offsetof(struct mail_index_header, log_file_tail_offset); |
420a386fa27a
int/ext/mailbox sync offset changes: Combined mailbox and int offsets to
Timo Sirainen <tss@iki.fi>
parents:
5723
diff
changeset
|
753 const unsigned int offset_size = sizeof(ihdr->log_file_tail_offset); |
8811
69ddd7c9c585
indexes: Fixes to handling shrinking tail offsets.
Timo Sirainen <tss@iki.fi>
parents:
8809
diff
changeset
|
754 uint32_t tail_offset; |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
755 |
8811
69ddd7c9c585
indexes: Fixes to handling shrinking tail offsets.
Timo Sirainen <tss@iki.fi>
parents:
8809
diff
changeset
|
756 i_assert(offset_size == sizeof(tail_offset)); |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
757 |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
758 if (size < sizeof(*u) || size < sizeof(*u) + u->size) { |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
759 mail_transaction_log_file_set_corrupted(file, |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
760 "header update extends beyond record size"); |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
761 return -1; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
762 } |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
763 |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
764 if (u->offset <= offset_pos && |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
765 u->offset + u->size >= offset_pos + offset_size) { |
8811
69ddd7c9c585
indexes: Fixes to handling shrinking tail offsets.
Timo Sirainen <tss@iki.fi>
parents:
8809
diff
changeset
|
766 memcpy(&tail_offset, |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
767 CONST_PTR_OFFSET(u + 1, offset_pos - u->offset), |
8811
69ddd7c9c585
indexes: Fixes to handling shrinking tail offsets.
Timo Sirainen <tss@iki.fi>
parents:
8809
diff
changeset
|
768 sizeof(tail_offset)); |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
769 |
8811
69ddd7c9c585
indexes: Fixes to handling shrinking tail offsets.
Timo Sirainen <tss@iki.fi>
parents:
8809
diff
changeset
|
770 if (tail_offset < file->saved_tail_offset) { |
8136
285f636884dc
Don't give bogus "log_file_tail_offset shrank" errors.
Timo Sirainen <tss@iki.fi>
parents:
8129
diff
changeset
|
771 if (file->sync_offset < file->saved_tail_sync_offset) { |
285f636884dc
Don't give bogus "log_file_tail_offset shrank" errors.
Timo Sirainen <tss@iki.fi>
parents:
8129
diff
changeset
|
772 /* saved_tail_offset was already set in header, |
285f636884dc
Don't give bogus "log_file_tail_offset shrank" errors.
Timo Sirainen <tss@iki.fi>
parents:
8129
diff
changeset
|
773 but we still had to resync the file to find |
285f636884dc
Don't give bogus "log_file_tail_offset shrank" errors.
Timo Sirainen <tss@iki.fi>
parents:
8129
diff
changeset
|
774 modseqs. ignore this record. */ |
285f636884dc
Don't give bogus "log_file_tail_offset shrank" errors.
Timo Sirainen <tss@iki.fi>
parents:
8129
diff
changeset
|
775 return 1; |
285f636884dc
Don't give bogus "log_file_tail_offset shrank" errors.
Timo Sirainen <tss@iki.fi>
parents:
8129
diff
changeset
|
776 } |
8811
69ddd7c9c585
indexes: Fixes to handling shrinking tail offsets.
Timo Sirainen <tss@iki.fi>
parents:
8809
diff
changeset
|
777 mail_index_set_error(file->log->index, |
69ddd7c9c585
indexes: Fixes to handling shrinking tail offsets.
Timo Sirainen <tss@iki.fi>
parents:
8809
diff
changeset
|
778 "Transaction log file %s seq %u: " |
8805
3feb2afdd81f
indexes: Make sure we don't shrink log_file_tail_offset.
Timo Sirainen <tss@iki.fi>
parents:
8613
diff
changeset
|
779 "log_file_tail_offset update shrank it " |
8811
69ddd7c9c585
indexes: Fixes to handling shrinking tail offsets.
Timo Sirainen <tss@iki.fi>
parents:
8809
diff
changeset
|
780 "(%u vs %"PRIuUOFF_T" " |
69ddd7c9c585
indexes: Fixes to handling shrinking tail offsets.
Timo Sirainen <tss@iki.fi>
parents:
8809
diff
changeset
|
781 "sync_offset=%"PRIuUOFF_T")", |
69ddd7c9c585
indexes: Fixes to handling shrinking tail offsets.
Timo Sirainen <tss@iki.fi>
parents:
8809
diff
changeset
|
782 file->filepath, file->hdr.file_seq, |
69ddd7c9c585
indexes: Fixes to handling shrinking tail offsets.
Timo Sirainen <tss@iki.fi>
parents:
8809
diff
changeset
|
783 tail_offset, file->saved_tail_offset, |
69ddd7c9c585
indexes: Fixes to handling shrinking tail offsets.
Timo Sirainen <tss@iki.fi>
parents:
8809
diff
changeset
|
784 file->sync_offset); |
69ddd7c9c585
indexes: Fixes to handling shrinking tail offsets.
Timo Sirainen <tss@iki.fi>
parents:
8809
diff
changeset
|
785 } else { |
69ddd7c9c585
indexes: Fixes to handling shrinking tail offsets.
Timo Sirainen <tss@iki.fi>
parents:
8809
diff
changeset
|
786 file->saved_tail_offset = tail_offset; |
69ddd7c9c585
indexes: Fixes to handling shrinking tail offsets.
Timo Sirainen <tss@iki.fi>
parents:
8809
diff
changeset
|
787 if (tail_offset > file->max_tail_offset) |
69ddd7c9c585
indexes: Fixes to handling shrinking tail offsets.
Timo Sirainen <tss@iki.fi>
parents:
8809
diff
changeset
|
788 file->max_tail_offset = tail_offset; |
69ddd7c9c585
indexes: Fixes to handling shrinking tail offsets.
Timo Sirainen <tss@iki.fi>
parents:
8809
diff
changeset
|
789 return 1; |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
790 } |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
791 } |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
792 return 0; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
793 } |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
794 |
7812
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
795 bool |
7931
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
796 mail_transaction_header_has_modseq(const struct mail_transaction_header *hdr, |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
797 const void *data, |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
798 uint64_t cur_modseq) |
7812
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
799 { |
7931
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
800 if (cur_modseq != 0) { |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
801 /* tracking modseqs */ |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
802 } else if ((hdr->type & MAIL_TRANSACTION_TYPE_MASK) == |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
803 MAIL_TRANSACTION_EXT_INTRO) { |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
804 /* modseqs not tracked yet. see if this is a modseq |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
805 extension introduction. */ |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
806 const struct mail_transaction_ext_intro *intro = data; |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
807 const unsigned int modseq_ext_len = |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
808 strlen(MAIL_INDEX_MODSEQ_EXT_NAME); |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
809 |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
810 if (intro->name_size == modseq_ext_len && |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
811 memcmp(intro + 1, MAIL_INDEX_MODSEQ_EXT_NAME, |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
812 modseq_ext_len) == 0) { |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
813 /* modseq tracking started */ |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
814 return TRUE; |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
815 } |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
816 } else { |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
817 /* not tracking modseqs */ |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
818 return FALSE; |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
819 } |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
820 |
7812
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
821 switch (hdr->type & MAIL_TRANSACTION_TYPE_MASK) { |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
822 case MAIL_TRANSACTION_EXPUNGE | MAIL_TRANSACTION_EXPUNGE_PROT: |
9318
9445831aebc0
lib-index: Added support for reading new records generated by Dovecot v2.0.
Timo Sirainen <tss@iki.fi>
parents:
9107
diff
changeset
|
823 case MAIL_TRANSACTION_EXPUNGE_GUID | MAIL_TRANSACTION_EXPUNGE_PROT: |
7812
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
824 if ((hdr->type & MAIL_TRANSACTION_EXTERNAL) == 0) { |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
825 /* ignore expunge requests */ |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
826 break; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
827 } |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
828 case MAIL_TRANSACTION_APPEND: |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
829 case MAIL_TRANSACTION_FLAG_UPDATE: |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
830 case MAIL_TRANSACTION_KEYWORD_UPDATE: |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
831 case MAIL_TRANSACTION_KEYWORD_RESET: |
9318
9445831aebc0
lib-index: Added support for reading new records generated by Dovecot v2.0.
Timo Sirainen <tss@iki.fi>
parents:
9107
diff
changeset
|
832 case MAIL_TRANSACTION_UID_UPDATE: |
7812
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
833 /* these changes increase modseq */ |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
834 return TRUE; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
835 } |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
836 return FALSE; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
837 } |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
838 |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
839 static struct modseq_cache * |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
840 modseq_cache_hit(struct mail_transaction_log_file *file, unsigned int idx) |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
841 { |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
842 struct modseq_cache cache; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
843 |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
844 if (idx > 0) { |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
845 /* @UNSAFE: move it to top */ |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
846 cache = file->modseq_cache[idx]; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
847 memmove(file->modseq_cache + 1, file->modseq_cache, |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
848 sizeof(*file->modseq_cache) * idx); |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
849 file->modseq_cache[0] = cache; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
850 } |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
851 return &file->modseq_cache[0]; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
852 } |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
853 |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
854 static struct modseq_cache * |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
855 modseq_cache_get_offset(struct mail_transaction_log_file *file, uoff_t offset) |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
856 { |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
857 unsigned int i, best = -1U; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
858 |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
859 for (i = 0; i < N_ELEMENTS(file->modseq_cache); i++) { |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
860 if (offset < file->modseq_cache[i].offset) |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
861 continue; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
862 |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
863 if (file->modseq_cache[i].offset == 0) |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
864 return NULL; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
865 |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
866 if (offset == file->modseq_cache[i].offset) { |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
867 /* exact cache hit */ |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
868 return modseq_cache_hit(file, i); |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
869 } |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
870 |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
871 if (best == -1U || |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
872 file->modseq_cache[i].offset < |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
873 file->modseq_cache[best].offset) |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
874 best = i; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
875 } |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
876 if (best == -1U) |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
877 return NULL; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
878 return &file->modseq_cache[best]; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
879 } |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
880 |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
881 static struct modseq_cache * |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
882 modseq_cache_get_modseq(struct mail_transaction_log_file *file, uint64_t modseq) |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
883 { |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
884 unsigned int i, best = -1U; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
885 |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
886 for (i = 0; i < N_ELEMENTS(file->modseq_cache); i++) { |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
887 if (modseq < file->modseq_cache[i].highest_modseq) |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
888 continue; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
889 |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
890 if (file->modseq_cache[i].offset == 0) |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
891 return NULL; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
892 |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
893 if (modseq == file->modseq_cache[i].highest_modseq) { |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
894 /* exact cache hit */ |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
895 return modseq_cache_hit(file, i); |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
896 } |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
897 |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
898 if (best == -1U || |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
899 file->modseq_cache[i].highest_modseq < |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
900 file->modseq_cache[best].highest_modseq) |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
901 best = i; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
902 } |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
903 if (best == -1U) |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
904 return NULL; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
905 return &file->modseq_cache[best]; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
906 } |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
907 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
908 static int |
7812
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
909 log_get_synced_record(struct mail_transaction_log_file *file, uoff_t *offset, |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
910 const struct mail_transaction_header **hdr_r) |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
911 { |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
912 const struct mail_transaction_header *hdr; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
913 uint32_t trans_size; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
914 |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
915 hdr = CONST_PTR_OFFSET(file->buffer->data, |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
916 *offset - file->buffer_offset); |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
917 |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
918 /* we've already synced this record at some point. it should |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
919 be valid. */ |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
920 trans_size = mail_index_offset_to_uint32(hdr->size); |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
921 if (trans_size < sizeof(*hdr) || |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
922 *offset - file->buffer_offset + trans_size > file->buffer->used) { |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
923 mail_transaction_log_file_set_corrupted(file, |
8613
37e74d43ff26
Improved "Transaction log corrupted unexpectedly" error message.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
924 "Transaction log corrupted unexpectedly at " |
37e74d43ff26
Improved "Transaction log corrupted unexpectedly" error message.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
925 "%"PRIuUOFF_T": Invalid size %u (type=%x)", |
37e74d43ff26
Improved "Transaction log corrupted unexpectedly" error message.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
926 *offset, trans_size, hdr->type); |
7812
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
927 return -1; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
928 } |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
929 *offset += trans_size; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
930 *hdr_r = hdr; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
931 return 0; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
932 } |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
933 |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
934 int mail_transaction_log_file_get_highest_modseq_at( |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
935 struct mail_transaction_log_file *file, |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
936 uoff_t offset, uint64_t *highest_modseq_r) |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
937 { |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
938 const struct mail_transaction_header *hdr; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
939 struct modseq_cache *cache; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
940 uoff_t cur_offset; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
941 uint64_t cur_modseq; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
942 int ret; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
943 |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
944 i_assert(offset <= file->sync_offset); |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
945 |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
946 if (offset == file->sync_offset) { |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
947 *highest_modseq_r = file->sync_highest_modseq; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
948 return 0; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
949 } |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
950 |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
951 cache = modseq_cache_get_offset(file, offset); |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
952 if (cache == NULL) { |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
953 /* nothing usable in cache - scan from beginning */ |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
954 cur_offset = file->hdr.hdr_size; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
955 cur_modseq = file->hdr.initial_modseq; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
956 } else if (cache->offset == offset) { |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
957 /* exact cache hit */ |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
958 *highest_modseq_r = cache->highest_modseq; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
959 return 0; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
960 } else { |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
961 /* use cache to skip over some records */ |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
962 cur_offset = cache->offset; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
963 cur_modseq = cache->highest_modseq; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
964 } |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
965 |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
966 ret = mail_transaction_log_file_map(file, cur_offset, offset); |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
967 if (ret <= 0) { |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
968 if (ret < 0) |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
969 return -1; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
970 mail_index_set_error(file->log->index, |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
971 "%s: Transaction log corrupted, can't get modseq", |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
972 file->filepath); |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
973 return -1; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
974 } |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
975 |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
976 i_assert(cur_offset >= file->buffer_offset); |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
977 i_assert(cur_offset + file->buffer->used >= offset); |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
978 while (cur_offset < offset) { |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
979 if (log_get_synced_record(file, &cur_offset, &hdr) < 0) |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
980 return- 1; |
7931
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
981 if (mail_transaction_header_has_modseq(hdr, hdr + 1, |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
982 cur_modseq)) |
7812
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
983 cur_modseq++; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
984 } |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
985 |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
986 /* @UNSAFE: cache the value */ |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
987 memmove(file->modseq_cache + 1, file->modseq_cache, |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
988 sizeof(*file->modseq_cache) * |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
989 (N_ELEMENTS(file->modseq_cache) - 1)); |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
990 file->modseq_cache[0].offset = cur_offset; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
991 file->modseq_cache[0].highest_modseq = cur_modseq; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
992 |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
993 *highest_modseq_r = cur_modseq; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
994 return 0; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
995 } |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
996 |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
997 int mail_transaction_log_file_get_modseq_next_offset( |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
998 struct mail_transaction_log_file *file, |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
999 uint64_t modseq, uoff_t *next_offset_r) |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1000 { |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1001 const struct mail_transaction_header *hdr; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1002 struct modseq_cache *cache; |
9359 | 1003 uoff_t cur_offset; |
7812
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1004 uint64_t cur_modseq; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1005 int ret; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1006 |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1007 if (modseq >= file->sync_highest_modseq) { |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1008 *next_offset_r = file->sync_offset; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1009 return 0; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1010 } |
9439
d55146fea954
lib-index: looking up offset for transaction log's initial modseq failed.
Timo Sirainen <tss@iki.fi>
parents:
9359
diff
changeset
|
1011 if (modseq == file->hdr.initial_modseq) { |
d55146fea954
lib-index: looking up offset for transaction log's initial modseq failed.
Timo Sirainen <tss@iki.fi>
parents:
9359
diff
changeset
|
1012 *next_offset_r = file->hdr.hdr_size; |
d55146fea954
lib-index: looking up offset for transaction log's initial modseq failed.
Timo Sirainen <tss@iki.fi>
parents:
9359
diff
changeset
|
1013 return 0; |
d55146fea954
lib-index: looking up offset for transaction log's initial modseq failed.
Timo Sirainen <tss@iki.fi>
parents:
9359
diff
changeset
|
1014 } |
7812
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1015 |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1016 cache = modseq_cache_get_modseq(file, modseq); |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1017 if (cache == NULL) { |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1018 /* nothing usable in cache - scan from beginning */ |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1019 cur_offset = file->hdr.hdr_size; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1020 cur_modseq = file->hdr.initial_modseq; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1021 } else if (cache->highest_modseq == modseq) { |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1022 /* exact cache hit */ |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1023 *next_offset_r = cache->offset; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1024 return 0; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1025 } else { |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1026 /* use cache to skip over some records */ |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1027 cur_offset = cache->offset; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1028 cur_modseq = cache->highest_modseq; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1029 } |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1030 |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1031 ret = mail_transaction_log_file_map(file, cur_offset, |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1032 file->sync_offset); |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1033 if (ret <= 0) { |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1034 if (ret < 0) |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1035 return -1; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1036 mail_index_set_error(file->log->index, |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1037 "%s: Transaction log corrupted, can't get modseq", |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1038 file->filepath); |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1039 return -1; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1040 } |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1041 |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1042 i_assert(cur_offset >= file->buffer_offset); |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1043 while (cur_offset < file->sync_offset) { |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1044 if (log_get_synced_record(file, &cur_offset, &hdr) < 0) |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1045 return -1; |
7931
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
1046 if (mail_transaction_header_has_modseq(hdr, hdr + 1, |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
1047 cur_modseq)) { |
7812
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1048 if (++cur_modseq == modseq) |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1049 break; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1050 } |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1051 } |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1052 if (modseq != cur_modseq) { |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1053 /* if we got to sync_offset, cur_modseq should be |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1054 sync_highest_modseq */ |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1055 mail_index_set_error(file->log->index, |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1056 "%s: Transaction log changed unexpectedly, " |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1057 "can't get modseq", file->filepath); |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1058 return -1; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1059 } |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1060 |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1061 /* @UNSAFE: cache the value */ |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1062 memmove(file->modseq_cache + 1, file->modseq_cache, |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1063 sizeof(*file->modseq_cache) * |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1064 (N_ELEMENTS(file->modseq_cache) - 1)); |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1065 file->modseq_cache[0].offset = cur_offset; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1066 file->modseq_cache[0].highest_modseq = cur_modseq; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1067 |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1068 *next_offset_r = cur_offset; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1069 return 0; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1070 } |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1071 |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1072 static int |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1073 log_file_track_sync(struct mail_transaction_log_file *file, |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1074 const struct mail_transaction_header *hdr, |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1075 unsigned int trans_size) |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
1076 { |
7931
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
1077 const void *data = hdr + 1; |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
1078 int ret; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
1079 |
7931
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
1080 if (mail_transaction_header_has_modseq(hdr, hdr + 1, |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
1081 file->sync_highest_modseq)) |
7812
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1082 file->sync_highest_modseq++; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1083 if ((hdr->type & MAIL_TRANSACTION_EXTERNAL) == 0) |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1084 return 0; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1085 |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1086 /* external transactions: */ |
5723
ad695be143ff
Don't assume that transaction record type is a bitmask in the transaction
Timo Sirainen <tss@iki.fi>
parents:
5716
diff
changeset
|
1087 if ((hdr->type & MAIL_TRANSACTION_TYPE_MASK) == |
ad695be143ff
Don't assume that transaction record type is a bitmask in the transaction
Timo Sirainen <tss@iki.fi>
parents:
5716
diff
changeset
|
1088 MAIL_TRANSACTION_HEADER_UPDATE) { |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
1089 /* see if this updates mailbox_sync_offset */ |
7931
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
1090 ret = log_file_track_mailbox_sync_offset_hdr(file, data, |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
1091 trans_size - |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
1092 sizeof(*hdr)); |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
1093 if (ret != 0) |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
1094 return ret < 0 ? -1 : 0; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
1095 } |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
1096 |
5749
420a386fa27a
int/ext/mailbox sync offset changes: Combined mailbox and int offsets to
Timo Sirainen <tss@iki.fi>
parents:
5723
diff
changeset
|
1097 if (file->max_tail_offset == file->sync_offset) { |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
1098 /* external transactions aren't synced to mailbox. we can |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
1099 update mailbox sync offset to skip this transaction to |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
1100 avoid re-reading it at the next sync. */ |
5749
420a386fa27a
int/ext/mailbox sync offset changes: Combined mailbox and int offsets to
Timo Sirainen <tss@iki.fi>
parents:
5723
diff
changeset
|
1101 file->max_tail_offset += trans_size; |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
1102 } |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
1103 return 0; |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1104 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1105 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1106 static int |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1107 mail_transaction_log_file_sync(struct mail_transaction_log_file *file) |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1108 { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1109 const struct mail_transaction_header *hdr; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1110 const void *data; |
5795
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1111 struct stat st; |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1112 size_t size, avail; |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
1113 uint32_t trans_size = 0; |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1114 |
7812
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1115 i_assert(file->sync_offset >= file->buffer_offset); |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1116 |
7812
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1117 data = buffer_get_data(file->buffer, &size); |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1118 while (file->sync_offset - file->buffer_offset + sizeof(*hdr) <= size) { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1119 hdr = CONST_PTR_OFFSET(data, file->sync_offset - |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1120 file->buffer_offset); |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
1121 trans_size = mail_index_offset_to_uint32(hdr->size); |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
1122 if (trans_size == 0) { |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1123 /* unfinished */ |
5795
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1124 return 1; |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1125 } |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
1126 if (trans_size < sizeof(*hdr)) { |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1127 mail_transaction_log_file_set_corrupted(file, |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
1128 "hdr.size too small (%u)", trans_size); |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1129 return -1; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1130 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1131 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
1132 if (file->sync_offset - file->buffer_offset + trans_size > size) |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1133 break; |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
1134 |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
1135 /* transaction has been fully written */ |
7812
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1136 if (log_file_track_sync(file, hdr, trans_size) < 0) |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1137 return -1; |
d10cb44ab446
Modseqs are no longer calculated from transaction log sequence + offset.
Timo Sirainen <tss@iki.fi>
parents:
7573
diff
changeset
|
1138 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
1139 file->sync_offset += trans_size; |
5791
2a05cff7eca4
Handle partial reads with mmap_disable=no correctly.
Timo Sirainen <tss@iki.fi>
parents:
5787
diff
changeset
|
1140 trans_size = 0; |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1141 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1142 |
5796
e5da155f44c3
Better race condition fix for mmaped log files
Timo Sirainen <tss@iki.fi>
parents:
5795
diff
changeset
|
1143 if (file->mmap_base != NULL && !file->locked) { |
e5da155f44c3
Better race condition fix for mmaped log files
Timo Sirainen <tss@iki.fi>
parents:
5795
diff
changeset
|
1144 /* Now that all the mmaped pages have page faulted, check if |
e5da155f44c3
Better race condition fix for mmaped log files
Timo Sirainen <tss@iki.fi>
parents:
5795
diff
changeset
|
1145 the file had changed while doing that. Only after the last |
e5da155f44c3
Better race condition fix for mmaped log files
Timo Sirainen <tss@iki.fi>
parents:
5795
diff
changeset
|
1146 page has faulted, the size returned by fstat() can be |
e5da155f44c3
Better race condition fix for mmaped log files
Timo Sirainen <tss@iki.fi>
parents:
5795
diff
changeset
|
1147 trusted. Otherwise it might point to a page boundary while |
e5da155f44c3
Better race condition fix for mmaped log files
Timo Sirainen <tss@iki.fi>
parents:
5795
diff
changeset
|
1148 the next page is still being written. |
e5da155f44c3
Better race condition fix for mmaped log files
Timo Sirainen <tss@iki.fi>
parents:
5795
diff
changeset
|
1149 |
e5da155f44c3
Better race condition fix for mmaped log files
Timo Sirainen <tss@iki.fi>
parents:
5795
diff
changeset
|
1150 Without this check we might see partial transactions, |
e5da155f44c3
Better race condition fix for mmaped log files
Timo Sirainen <tss@iki.fi>
parents:
5795
diff
changeset
|
1151 sometimes causing "Extension record updated without intro |
e5da155f44c3
Better race condition fix for mmaped log files
Timo Sirainen <tss@iki.fi>
parents:
5795
diff
changeset
|
1152 prefix" errors. */ |
e5da155f44c3
Better race condition fix for mmaped log files
Timo Sirainen <tss@iki.fi>
parents:
5795
diff
changeset
|
1153 if (fstat(file->fd, &st) < 0) { |
e5da155f44c3
Better race condition fix for mmaped log files
Timo Sirainen <tss@iki.fi>
parents:
5795
diff
changeset
|
1154 mail_index_file_set_syscall_error(file->log->index, |
e5da155f44c3
Better race condition fix for mmaped log files
Timo Sirainen <tss@iki.fi>
parents:
5795
diff
changeset
|
1155 file->filepath, |
e5da155f44c3
Better race condition fix for mmaped log files
Timo Sirainen <tss@iki.fi>
parents:
5795
diff
changeset
|
1156 "fstat()"); |
e5da155f44c3
Better race condition fix for mmaped log files
Timo Sirainen <tss@iki.fi>
parents:
5795
diff
changeset
|
1157 return -1; |
e5da155f44c3
Better race condition fix for mmaped log files
Timo Sirainen <tss@iki.fi>
parents:
5795
diff
changeset
|
1158 } |
e5da155f44c3
Better race condition fix for mmaped log files
Timo Sirainen <tss@iki.fi>
parents:
5795
diff
changeset
|
1159 if ((uoff_t)st.st_size != file->last_size) { |
e5da155f44c3
Better race condition fix for mmaped log files
Timo Sirainen <tss@iki.fi>
parents:
5795
diff
changeset
|
1160 file->last_size = st.st_size; |
e5da155f44c3
Better race condition fix for mmaped log files
Timo Sirainen <tss@iki.fi>
parents:
5795
diff
changeset
|
1161 return 0; |
e5da155f44c3
Better race condition fix for mmaped log files
Timo Sirainen <tss@iki.fi>
parents:
5795
diff
changeset
|
1162 } |
e5da155f44c3
Better race condition fix for mmaped log files
Timo Sirainen <tss@iki.fi>
parents:
5795
diff
changeset
|
1163 } |
e5da155f44c3
Better race condition fix for mmaped log files
Timo Sirainen <tss@iki.fi>
parents:
5795
diff
changeset
|
1164 |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1165 avail = file->sync_offset - file->buffer_offset; |
5791
2a05cff7eca4
Handle partial reads with mmap_disable=no correctly.
Timo Sirainen <tss@iki.fi>
parents:
5787
diff
changeset
|
1166 if (avail != size) { |
2a05cff7eca4
Handle partial reads with mmap_disable=no correctly.
Timo Sirainen <tss@iki.fi>
parents:
5787
diff
changeset
|
1167 /* There's more data than we could sync at the moment. If the |
2a05cff7eca4
Handle partial reads with mmap_disable=no correctly.
Timo Sirainen <tss@iki.fi>
parents:
5787
diff
changeset
|
1168 last record's size wasn't valid, we can't know if it will |
6761 | 1169 be updated unless we've locked the log. */ |
1170 if (trans_size != 0) { | |
1171 /* pread()s or the above fstat() check for mmaps should | |
1172 have guaranteed that this doesn't happen */ | |
1173 mail_transaction_log_file_set_corrupted(file, | |
1174 "hdr.size too large (%u)", trans_size); | |
1175 return -1; | |
1176 } else if (file->locked) { | |
1177 mail_transaction_log_file_set_corrupted(file, | |
1178 "Unexpected garbage at EOF"); | |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1179 return -1; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1180 } |
5972
9fb9dc4d8df8
Flush NFS caches when needed if MAIL_INDEX_OPEN_FLAG_NFS_FLUSH is enabled.
Timo Sirainen <tss@iki.fi>
parents:
5953
diff
changeset
|
1181 |
6829
dbab5e592577
NFS cache flushing APIs changed and backend implements it a bit differently.
Timo Sirainen <tss@iki.fi>
parents:
6819
diff
changeset
|
1182 /* The size field will be updated soon */ |
dbab5e592577
NFS cache flushing APIs changed and backend implements it a bit differently.
Timo Sirainen <tss@iki.fi>
parents:
6819
diff
changeset
|
1183 mail_index_flush_read_cache(file->log->index, file->filepath, |
dbab5e592577
NFS cache flushing APIs changed and backend implements it a bit differently.
Timo Sirainen <tss@iki.fi>
parents:
6819
diff
changeset
|
1184 file->fd, file->locked); |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1185 } |
5792
a250c1a48471
Log an error if non-head log file couldn't be synced to the next file's
Timo Sirainen <tss@iki.fi>
parents:
5791
diff
changeset
|
1186 |
a250c1a48471
Log an error if non-head log file couldn't be synced to the next file's
Timo Sirainen <tss@iki.fi>
parents:
5791
diff
changeset
|
1187 if (file->next != NULL && |
a250c1a48471
Log an error if non-head log file couldn't be synced to the next file's
Timo Sirainen <tss@iki.fi>
parents:
5791
diff
changeset
|
1188 file->hdr.file_seq == file->next->hdr.prev_file_seq && |
a250c1a48471
Log an error if non-head log file couldn't be synced to the next file's
Timo Sirainen <tss@iki.fi>
parents:
5791
diff
changeset
|
1189 file->next->hdr.prev_file_offset != file->sync_offset) { |
8312
963330c3df1e
If we detect that transaction log file size is invalid, mark the log corrupted.
Timo Sirainen <tss@iki.fi>
parents:
8292
diff
changeset
|
1190 mail_transaction_log_file_set_corrupted(file, |
5792
a250c1a48471
Log an error if non-head log file couldn't be synced to the next file's
Timo Sirainen <tss@iki.fi>
parents:
5791
diff
changeset
|
1191 "Invalid transaction log size " |
a250c1a48471
Log an error if non-head log file couldn't be synced to the next file's
Timo Sirainen <tss@iki.fi>
parents:
5791
diff
changeset
|
1192 "(%"PRIuUOFF_T" vs %u): %s", file->sync_offset, |
a250c1a48471
Log an error if non-head log file couldn't be synced to the next file's
Timo Sirainen <tss@iki.fi>
parents:
5791
diff
changeset
|
1193 file->log->head->hdr.prev_file_offset, file->filepath); |
a250c1a48471
Log an error if non-head log file couldn't be synced to the next file's
Timo Sirainen <tss@iki.fi>
parents:
5791
diff
changeset
|
1194 return -1; |
a250c1a48471
Log an error if non-head log file couldn't be synced to the next file's
Timo Sirainen <tss@iki.fi>
parents:
5791
diff
changeset
|
1195 } |
a250c1a48471
Log an error if non-head log file couldn't be synced to the next file's
Timo Sirainen <tss@iki.fi>
parents:
5791
diff
changeset
|
1196 |
5795
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1197 return 1; |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1198 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1199 |
5714
dcf5dbb6a76a
mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents:
5689
diff
changeset
|
1200 static int |
5716
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1201 mail_transaction_log_file_insert_read(struct mail_transaction_log_file *file, |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1202 uoff_t offset) |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1203 { |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1204 void *data; |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1205 size_t size; |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1206 ssize_t ret; |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1207 |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1208 size = file->buffer_offset - offset; |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1209 buffer_copy(file->buffer, size, file->buffer, 0, (size_t)-1); |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1210 |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1211 data = buffer_get_space_unsafe(file->buffer, 0, size); |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1212 ret = pread_full(file->fd, data, size, offset); |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1213 if (ret > 0) { |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1214 /* success */ |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1215 file->buffer_offset -= size; |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1216 return 1; |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1217 } |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1218 |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1219 /* failure. don't leave ourself to inconsistent state */ |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1220 buffer_copy(file->buffer, 0, file->buffer, size, (size_t)-1); |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1221 buffer_set_used_size(file->buffer, file->buffer->used - size); |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1222 |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1223 if (ret == 0) { |
6645 | 1224 mail_transaction_log_file_set_corrupted(file, "file shrank"); |
5716
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1225 return 0; |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1226 } else if (errno == ESTALE) { |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1227 /* log file was deleted in NFS server, fail silently */ |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1228 return 0; |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1229 } else { |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1230 mail_index_file_set_syscall_error(file->log->index, |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1231 file->filepath, "pread()"); |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1232 return -1; |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1233 } |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1234 } |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1235 |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1236 static int |
6002 | 1237 mail_transaction_log_file_read_more(struct mail_transaction_log_file *file) |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1238 { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1239 void *data; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1240 size_t size; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1241 uint32_t read_offset; |
6002 | 1242 ssize_t ret; |
5972
9fb9dc4d8df8
Flush NFS caches when needed if MAIL_INDEX_OPEN_FLAG_NFS_FLUSH is enabled.
Timo Sirainen <tss@iki.fi>
parents:
5953
diff
changeset
|
1243 |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1244 read_offset = file->buffer_offset + buffer_get_used_size(file->buffer); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1245 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1246 do { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1247 data = buffer_append_space_unsafe(file->buffer, LOG_PREFETCH); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1248 ret = pread(file->fd, data, LOG_PREFETCH, read_offset); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1249 if (ret > 0) |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1250 read_offset += ret; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1251 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1252 size = read_offset - file->buffer_offset; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1253 buffer_set_used_size(file->buffer, size); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1254 } while (ret > 0 || (ret < 0 && errno == EINTR)); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1255 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1256 file->last_size = read_offset; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1257 |
5791
2a05cff7eca4
Handle partial reads with mmap_disable=no correctly.
Timo Sirainen <tss@iki.fi>
parents:
5787
diff
changeset
|
1258 if (ret < 0) { |
2a05cff7eca4
Handle partial reads with mmap_disable=no correctly.
Timo Sirainen <tss@iki.fi>
parents:
5787
diff
changeset
|
1259 if (errno == ESTALE) { |
2a05cff7eca4
Handle partial reads with mmap_disable=no correctly.
Timo Sirainen <tss@iki.fi>
parents:
5787
diff
changeset
|
1260 /* log file was deleted in NFS server, fail silently */ |
2a05cff7eca4
Handle partial reads with mmap_disable=no correctly.
Timo Sirainen <tss@iki.fi>
parents:
5787
diff
changeset
|
1261 return 0; |
2a05cff7eca4
Handle partial reads with mmap_disable=no correctly.
Timo Sirainen <tss@iki.fi>
parents:
5787
diff
changeset
|
1262 } |
2a05cff7eca4
Handle partial reads with mmap_disable=no correctly.
Timo Sirainen <tss@iki.fi>
parents:
5787
diff
changeset
|
1263 |
2a05cff7eca4
Handle partial reads with mmap_disable=no correctly.
Timo Sirainen <tss@iki.fi>
parents:
5787
diff
changeset
|
1264 mail_index_file_set_syscall_error(file->log->index, |
2a05cff7eca4
Handle partial reads with mmap_disable=no correctly.
Timo Sirainen <tss@iki.fi>
parents:
5787
diff
changeset
|
1265 file->filepath, "pread()"); |
2a05cff7eca4
Handle partial reads with mmap_disable=no correctly.
Timo Sirainen <tss@iki.fi>
parents:
5787
diff
changeset
|
1266 return -1; |
2a05cff7eca4
Handle partial reads with mmap_disable=no correctly.
Timo Sirainen <tss@iki.fi>
parents:
5787
diff
changeset
|
1267 } |
6002 | 1268 return 1; |
1269 } | |
1270 | |
6802
ba58eaf06763
Keep better track of when we need to flush NFS attribute caches.
Timo Sirainen <tss@iki.fi>
parents:
6798
diff
changeset
|
1271 static bool |
ba58eaf06763
Keep better track of when we need to flush NFS attribute caches.
Timo Sirainen <tss@iki.fi>
parents:
6798
diff
changeset
|
1272 mail_transaction_log_file_need_nfs_flush(struct mail_transaction_log_file *file) |
ba58eaf06763
Keep better track of when we need to flush NFS attribute caches.
Timo Sirainen <tss@iki.fi>
parents:
6798
diff
changeset
|
1273 { |
ba58eaf06763
Keep better track of when we need to flush NFS attribute caches.
Timo Sirainen <tss@iki.fi>
parents:
6798
diff
changeset
|
1274 const struct mail_index_header *hdr = &file->log->index->map->hdr; |
6807
5382964fc01d
Avoid flushing attribute cache when checking to see if there's new data in
Timo Sirainen <tss@iki.fi>
parents:
6802
diff
changeset
|
1275 uoff_t max_offset = file->last_size; |
6802
ba58eaf06763
Keep better track of when we need to flush NFS attribute caches.
Timo Sirainen <tss@iki.fi>
parents:
6798
diff
changeset
|
1276 |
ba58eaf06763
Keep better track of when we need to flush NFS attribute caches.
Timo Sirainen <tss@iki.fi>
parents:
6798
diff
changeset
|
1277 if (file->next != NULL && |
ba58eaf06763
Keep better track of when we need to flush NFS attribute caches.
Timo Sirainen <tss@iki.fi>
parents:
6798
diff
changeset
|
1278 file->hdr.file_seq == file->next->hdr.prev_file_seq && |
6807
5382964fc01d
Avoid flushing attribute cache when checking to see if there's new data in
Timo Sirainen <tss@iki.fi>
parents:
6802
diff
changeset
|
1279 file->next->hdr.prev_file_offset != max_offset) { |
6802
ba58eaf06763
Keep better track of when we need to flush NFS attribute caches.
Timo Sirainen <tss@iki.fi>
parents:
6798
diff
changeset
|
1280 /* we already have a newer log file which says that we haven't |
ba58eaf06763
Keep better track of when we need to flush NFS attribute caches.
Timo Sirainen <tss@iki.fi>
parents:
6798
diff
changeset
|
1281 synced the entire file. */ |
ba58eaf06763
Keep better track of when we need to flush NFS attribute caches.
Timo Sirainen <tss@iki.fi>
parents:
6798
diff
changeset
|
1282 return TRUE; |
ba58eaf06763
Keep better track of when we need to flush NFS attribute caches.
Timo Sirainen <tss@iki.fi>
parents:
6798
diff
changeset
|
1283 } |
ba58eaf06763
Keep better track of when we need to flush NFS attribute caches.
Timo Sirainen <tss@iki.fi>
parents:
6798
diff
changeset
|
1284 |
ba58eaf06763
Keep better track of when we need to flush NFS attribute caches.
Timo Sirainen <tss@iki.fi>
parents:
6798
diff
changeset
|
1285 if (file->hdr.file_seq == hdr->log_file_seq && |
6807
5382964fc01d
Avoid flushing attribute cache when checking to see if there's new data in
Timo Sirainen <tss@iki.fi>
parents:
6802
diff
changeset
|
1286 max_offset < hdr->log_file_head_offset) |
6802
ba58eaf06763
Keep better track of when we need to flush NFS attribute caches.
Timo Sirainen <tss@iki.fi>
parents:
6798
diff
changeset
|
1287 return TRUE; |
ba58eaf06763
Keep better track of when we need to flush NFS attribute caches.
Timo Sirainen <tss@iki.fi>
parents:
6798
diff
changeset
|
1288 |
ba58eaf06763
Keep better track of when we need to flush NFS attribute caches.
Timo Sirainen <tss@iki.fi>
parents:
6798
diff
changeset
|
1289 return FALSE; |
ba58eaf06763
Keep better track of when we need to flush NFS attribute caches.
Timo Sirainen <tss@iki.fi>
parents:
6798
diff
changeset
|
1290 } |
ba58eaf06763
Keep better track of when we need to flush NFS attribute caches.
Timo Sirainen <tss@iki.fi>
parents:
6798
diff
changeset
|
1291 |
6002 | 1292 static int |
1293 mail_transaction_log_file_read(struct mail_transaction_log_file *file, | |
6807
5382964fc01d
Avoid flushing attribute cache when checking to see if there's new data in
Timo Sirainen <tss@iki.fi>
parents:
6802
diff
changeset
|
1294 uoff_t start_offset, bool nfs_flush) |
6002 | 1295 { |
1296 int ret; | |
1297 | |
1298 i_assert(file->mmap_base == NULL); | |
1299 | |
6808
937faba78a68
Don't flush attribute cache twice after locking transaction log.
Timo Sirainen <tss@iki.fi>
parents:
6807
diff
changeset
|
1300 /* NFS: if file isn't locked, we're optimistic that we can read enough |
937faba78a68
Don't flush attribute cache twice after locking transaction log.
Timo Sirainen <tss@iki.fi>
parents:
6807
diff
changeset
|
1301 data without flushing attribute cache. if after reading we notice |
937faba78a68
Don't flush attribute cache twice after locking transaction log.
Timo Sirainen <tss@iki.fi>
parents:
6807
diff
changeset
|
1302 that we really should have read more, flush the cache and try again. |
937faba78a68
Don't flush attribute cache twice after locking transaction log.
Timo Sirainen <tss@iki.fi>
parents:
6807
diff
changeset
|
1303 if file is locked, the attribute cache was already flushed when |
937faba78a68
Don't flush attribute cache twice after locking transaction log.
Timo Sirainen <tss@iki.fi>
parents:
6807
diff
changeset
|
1304 refreshing the log. */ |
6928
fe777302d928
NFS attribute cache flushing fix
Timo Sirainen <tss@iki.fi>
parents:
6921
diff
changeset
|
1305 if (file->log->index->nfs_flush && nfs_flush) { |
fe777302d928
NFS attribute cache flushing fix
Timo Sirainen <tss@iki.fi>
parents:
6921
diff
changeset
|
1306 if (!file->locked) |
fe777302d928
NFS attribute cache flushing fix
Timo Sirainen <tss@iki.fi>
parents:
6921
diff
changeset
|
1307 nfs_flush_attr_cache_unlocked(file->filepath); |
fe777302d928
NFS attribute cache flushing fix
Timo Sirainen <tss@iki.fi>
parents:
6921
diff
changeset
|
1308 else { |
fe777302d928
NFS attribute cache flushing fix
Timo Sirainen <tss@iki.fi>
parents:
6921
diff
changeset
|
1309 nfs_flush_attr_cache_fd_locked(file->filepath, |
fe777302d928
NFS attribute cache flushing fix
Timo Sirainen <tss@iki.fi>
parents:
6921
diff
changeset
|
1310 file->fd); |
fe777302d928
NFS attribute cache flushing fix
Timo Sirainen <tss@iki.fi>
parents:
6921
diff
changeset
|
1311 } |
fe777302d928
NFS attribute cache flushing fix
Timo Sirainen <tss@iki.fi>
parents:
6921
diff
changeset
|
1312 } |
6002 | 1313 |
1314 if (file->buffer != NULL && file->buffer_offset > start_offset) { | |
1315 /* we have to insert missing data to beginning of buffer */ | |
1316 ret = mail_transaction_log_file_insert_read(file, start_offset); | |
1317 if (ret <= 0) | |
1318 return ret; | |
1319 } | |
1320 | |
1321 if (file->buffer == NULL) { | |
1322 file->buffer = | |
1323 buffer_create_dynamic(default_pool, LOG_PREFETCH); | |
1324 file->buffer_offset = start_offset; | |
1325 } | |
1326 | |
1327 if ((ret = mail_transaction_log_file_read_more(file)) <= 0) | |
1328 return ret; | |
5791
2a05cff7eca4
Handle partial reads with mmap_disable=no correctly.
Timo Sirainen <tss@iki.fi>
parents:
5787
diff
changeset
|
1329 |
6807
5382964fc01d
Avoid flushing attribute cache when checking to see if there's new data in
Timo Sirainen <tss@iki.fi>
parents:
6802
diff
changeset
|
1330 if (file->log->index->nfs_flush && !nfs_flush && |
5382964fc01d
Avoid flushing attribute cache when checking to see if there's new data in
Timo Sirainen <tss@iki.fi>
parents:
6802
diff
changeset
|
1331 mail_transaction_log_file_need_nfs_flush(file)) { |
5382964fc01d
Avoid flushing attribute cache when checking to see if there's new data in
Timo Sirainen <tss@iki.fi>
parents:
6802
diff
changeset
|
1332 /* we didn't read enough data. flush and try again. */ |
5382964fc01d
Avoid flushing attribute cache when checking to see if there's new data in
Timo Sirainen <tss@iki.fi>
parents:
6802
diff
changeset
|
1333 return mail_transaction_log_file_read(file, start_offset, TRUE); |
5382964fc01d
Avoid flushing attribute cache when checking to see if there's new data in
Timo Sirainen <tss@iki.fi>
parents:
6802
diff
changeset
|
1334 } |
5382964fc01d
Avoid flushing attribute cache when checking to see if there's new data in
Timo Sirainen <tss@iki.fi>
parents:
6802
diff
changeset
|
1335 |
5795
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1336 if ((ret = mail_transaction_log_file_sync(file)) <= 0) { |
6002 | 1337 i_assert(ret != 0); /* happens only with mmap */ |
1338 return -1; | |
5795
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1339 } |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1340 |
5791
2a05cff7eca4
Handle partial reads with mmap_disable=no correctly.
Timo Sirainen <tss@iki.fi>
parents:
5787
diff
changeset
|
1341 i_assert(file->sync_offset >= file->buffer_offset); |
2a05cff7eca4
Handle partial reads with mmap_disable=no correctly.
Timo Sirainen <tss@iki.fi>
parents:
5787
diff
changeset
|
1342 buffer_set_used_size(file->buffer, |
2a05cff7eca4
Handle partial reads with mmap_disable=no correctly.
Timo Sirainen <tss@iki.fi>
parents:
5787
diff
changeset
|
1343 file->sync_offset - file->buffer_offset); |
2a05cff7eca4
Handle partial reads with mmap_disable=no correctly.
Timo Sirainen <tss@iki.fi>
parents:
5787
diff
changeset
|
1344 return 1; |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1345 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1346 |
5716
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1347 static int |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1348 log_file_map_check_offsets(struct mail_transaction_log_file *file, |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1349 uoff_t start_offset, uoff_t end_offset) |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1350 { |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1351 if (start_offset > file->sync_offset) { |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1352 /* broken start offset */ |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1353 mail_index_set_error(file->log->index, |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1354 "%s: start_offset (%"PRIuUOFF_T") > " |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1355 "current sync_offset (%"PRIuUOFF_T")", |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1356 file->filepath, start_offset, file->sync_offset); |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1357 return 0; |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1358 } |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1359 if (end_offset != (uoff_t)-1 && end_offset > file->sync_offset) { |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1360 mail_index_set_error(file->log->index, |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1361 "%s: end_offset (%"PRIuUOFF_T") > " |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1362 "current sync_offset (%"PRIuUOFF_T")", |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1363 file->filepath, start_offset, file->sync_offset); |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1364 return 0; |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1365 } |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1366 |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1367 return 1; |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1368 } |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1369 |
5795
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1370 static int |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1371 mail_transaction_log_file_mmap(struct mail_transaction_log_file *file) |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1372 { |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1373 if (file->buffer != NULL) { |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1374 /* in case we just switched to mmaping */ |
6414
a6a49d5efc59
Changed buffer_free() and buffer_free_without_data() APIs to take ** pointer
Timo Sirainen <tss@iki.fi>
parents:
6360
diff
changeset
|
1375 buffer_free(&file->buffer); |
5795
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1376 } |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1377 file->mmap_size = file->last_size; |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1378 file->mmap_base = mmap(NULL, file->mmap_size, PROT_READ, MAP_SHARED, |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1379 file->fd, 0); |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1380 if (file->mmap_base == MAP_FAILED) { |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1381 file->mmap_base = NULL; |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1382 file->mmap_size = 0; |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1383 mail_index_file_set_syscall_error(file->log->index, |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1384 file->filepath, "mmap()"); |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1385 return -1; |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1386 } |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1387 |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1388 if (file->mmap_size > mmap_get_page_size()) { |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1389 if (madvise(file->mmap_base, file->mmap_size, |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1390 MADV_SEQUENTIAL) < 0) { |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1391 mail_index_file_set_syscall_error(file->log->index, |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1392 file->filepath, "madvise()"); |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1393 } |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1394 } |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1395 |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1396 file->buffer = buffer_create_const_data(default_pool, |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1397 file->mmap_base, |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1398 file->mmap_size); |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1399 file->buffer_offset = 0; |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1400 return 0; |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1401 } |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1402 |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1403 static void |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1404 mail_transaction_log_file_munmap(struct mail_transaction_log_file *file) |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1405 { |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1406 if (file->mmap_base == NULL) |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1407 return; |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1408 |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1409 if (munmap(file->mmap_base, file->mmap_size) < 0) { |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1410 mail_index_file_set_syscall_error(file->log->index, |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1411 file->filepath, "munmap()"); |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1412 } |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1413 file->mmap_base = NULL; |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1414 file->mmap_size = 0; |
6414
a6a49d5efc59
Changed buffer_free() and buffer_free_without_data() APIs to take ** pointer
Timo Sirainen <tss@iki.fi>
parents:
6360
diff
changeset
|
1415 buffer_free(&file->buffer); |
5795
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1416 } |
0c0a829a9a63
Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents:
5792
diff
changeset
|
1417 |
6921 | 1418 static int |
6929
8c80093fbab4
Don't mmap() transaction log file if we're reading less than a page.
Timo Sirainen <tss@iki.fi>
parents:
6928
diff
changeset
|
1419 mail_transaction_log_file_map_mmap(struct mail_transaction_log_file *file, |
8c80093fbab4
Don't mmap() transaction log file if we're reading less than a page.
Timo Sirainen <tss@iki.fi>
parents:
6928
diff
changeset
|
1420 uoff_t start_offset) |
6921 | 1421 { |
1422 struct stat st; | |
1423 int ret; | |
1424 | |
1425 /* we are going to mmap() this file, but it's not necessarily | |
1426 mmaped currently. */ | |
1427 i_assert(file->buffer_offset == 0 || file->mmap_base == NULL); | |
1428 i_assert(file->mmap_size == 0 || file->mmap_base != NULL); | |
1429 | |
1430 if (fstat(file->fd, &st) < 0) { | |
1431 mail_index_file_set_syscall_error(file->log->index, | |
1432 file->filepath, "fstat()"); | |
1433 return -1; | |
1434 } | |
1435 file->last_size = st.st_size; | |
1436 | |
1437 if ((uoff_t)st.st_size < file->sync_offset) { | |
1438 mail_transaction_log_file_set_corrupted(file, | |
1439 "file size shrank"); | |
1440 return 0; | |
1441 } | |
1442 | |
7439
dc9c098a7d26
Fix to previous optimization: Don't crash if we want to read older data from
Timo Sirainen <tss@iki.fi>
parents:
7435
diff
changeset
|
1443 if (file->buffer != NULL && file->buffer_offset <= start_offset && |
7435
6983dfc231d7
Small optimization: Don't try to pread() log file if we already know we've
Timo Sirainen <tss@iki.fi>
parents:
7359
diff
changeset
|
1444 (uoff_t)st.st_size == file->buffer_offset + file->buffer->used) { |
6983dfc231d7
Small optimization: Don't try to pread() log file if we already know we've
Timo Sirainen <tss@iki.fi>
parents:
7359
diff
changeset
|
1445 /* we already have the whole file mapped */ |
6921 | 1446 if ((ret = mail_transaction_log_file_sync(file)) < 0) |
1447 return 0; | |
1448 if (ret > 0) | |
1449 return 1; | |
1450 /* size changed, re-mmap */ | |
1451 } | |
1452 | |
1453 do { | |
1454 mail_transaction_log_file_munmap(file); | |
1455 | |
6929
8c80093fbab4
Don't mmap() transaction log file if we're reading less than a page.
Timo Sirainen <tss@iki.fi>
parents:
6928
diff
changeset
|
1456 if (file->last_size - start_offset < mmap_get_page_size()) { |
8c80093fbab4
Don't mmap() transaction log file if we're reading less than a page.
Timo Sirainen <tss@iki.fi>
parents:
6928
diff
changeset
|
1457 /* just reading the file is probably faster */ |
8c80093fbab4
Don't mmap() transaction log file if we're reading less than a page.
Timo Sirainen <tss@iki.fi>
parents:
6928
diff
changeset
|
1458 return mail_transaction_log_file_read(file, |
8c80093fbab4
Don't mmap() transaction log file if we're reading less than a page.
Timo Sirainen <tss@iki.fi>
parents:
6928
diff
changeset
|
1459 start_offset, |
8c80093fbab4
Don't mmap() transaction log file if we're reading less than a page.
Timo Sirainen <tss@iki.fi>
parents:
6928
diff
changeset
|
1460 FALSE); |
8c80093fbab4
Don't mmap() transaction log file if we're reading less than a page.
Timo Sirainen <tss@iki.fi>
parents:
6928
diff
changeset
|
1461 } |
8c80093fbab4
Don't mmap() transaction log file if we're reading less than a page.
Timo Sirainen <tss@iki.fi>
parents:
6928
diff
changeset
|
1462 |
6921 | 1463 if (mail_transaction_log_file_mmap(file) < 0) |
1464 return -1; | |
1465 if ((ret = mail_transaction_log_file_sync(file)) < 0) | |
1466 return 0; | |
1467 } while (ret == 0); | |
1468 | |
1469 return 1; | |
1470 } | |
1471 | |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1472 int mail_transaction_log_file_map(struct mail_transaction_log_file *file, |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1473 uoff_t start_offset, uoff_t end_offset) |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1474 { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1475 struct mail_index *index = file->log->index; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1476 size_t size; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1477 int ret; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1478 |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1479 if (file->hdr.indexid == 0) { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1480 /* corrupted */ |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1481 return 0; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1482 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1483 |
5716
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1484 i_assert(start_offset >= file->hdr.hdr_size); |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1485 i_assert(start_offset <= end_offset); |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1486 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
1487 if (index->log_locked && file == file->log->head && |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
1488 end_offset == (uoff_t)-1) { |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
1489 /* we're not interested of going further than sync_offset */ |
5786
b6cf05796f6d
If log offsets are broken, don't assert-crash.
Timo Sirainen <tss@iki.fi>
parents:
5772
diff
changeset
|
1490 if (log_file_map_check_offsets(file, start_offset, |
b6cf05796f6d
If log offsets are broken, don't assert-crash.
Timo Sirainen <tss@iki.fi>
parents:
5772
diff
changeset
|
1491 end_offset) == 0) |
b6cf05796f6d
If log offsets are broken, don't assert-crash.
Timo Sirainen <tss@iki.fi>
parents:
5772
diff
changeset
|
1492 return 0; |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
1493 i_assert(start_offset <= file->sync_offset); |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
1494 end_offset = file->sync_offset; |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
1495 } |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5687
diff
changeset
|
1496 |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1497 if (file->buffer != NULL && file->buffer_offset <= start_offset) { |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1498 /* see if we already have it */ |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1499 size = buffer_get_used_size(file->buffer); |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1500 if (file->buffer_offset + size >= end_offset) |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1501 return 1; |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1502 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1503 |
5716
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1504 if (MAIL_TRANSACTION_LOG_FILE_IN_MEMORY(file)) { |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1505 if (start_offset < file->buffer_offset) { |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1506 /* we had moved the log to memory but failed to read |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1507 the beginning of the log file */ |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1508 mail_index_set_error(index, |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1509 "%s: Beginning of the log isn't available", |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1510 file->filepath); |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1511 return 0; |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1512 } |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1513 return log_file_map_check_offsets(file, start_offset, |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1514 end_offset); |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1515 } |
4a08705e97f5
Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents:
5714
diff
changeset
|
1516 |
7931
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
1517 if (start_offset > file->sync_offset) |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
1518 mail_transaction_log_file_skip_to_head(file); |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
1519 if (start_offset > file->sync_offset) { |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
1520 /* although we could just skip over the unwanted data, we have |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
1521 to sync everything so that modseqs are calculated |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
1522 correctly */ |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
1523 start_offset = file->sync_offset; |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
1524 } |
502cfdcc5650
Keep modseqs as 1 until the first modseq ext intro record enables them.
Timo Sirainen <tss@iki.fi>
parents:
7842
diff
changeset
|
1525 |
6921 | 1526 if (!index->mmap_disable) |
6929
8c80093fbab4
Don't mmap() transaction log file if we're reading less than a page.
Timo Sirainen <tss@iki.fi>
parents:
6928
diff
changeset
|
1527 ret = mail_transaction_log_file_map_mmap(file, start_offset); |
6921 | 1528 else { |
1529 mail_transaction_log_file_munmap(file); | |
1530 ret = mail_transaction_log_file_read(file, start_offset, FALSE); | |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1531 } |
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1532 |
6921 | 1533 return ret <= 0 ? ret : |
1534 log_file_map_check_offsets(file, start_offset, end_offset); | |
5687
d28185a3131a
Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1535 } |
5714
dcf5dbb6a76a
mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents:
5689
diff
changeset
|
1536 |
dcf5dbb6a76a
mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents:
5689
diff
changeset
|
1537 void mail_transaction_log_file_move_to_memory(struct mail_transaction_log_file |
dcf5dbb6a76a
mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents:
5689
diff
changeset
|
1538 *file) |
dcf5dbb6a76a
mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents:
5689
diff
changeset
|
1539 { |
dcf5dbb6a76a
mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents:
5689
diff
changeset
|
1540 buffer_t *buf; |
dcf5dbb6a76a
mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents:
5689
diff
changeset
|
1541 |
dcf5dbb6a76a
mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents:
5689
diff
changeset
|
1542 if (MAIL_TRANSACTION_LOG_FILE_IN_MEMORY(file)) |
dcf5dbb6a76a
mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents:
5689
diff
changeset
|
1543 return; |
dcf5dbb6a76a
mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents:
5689
diff
changeset
|
1544 |
dcf5dbb6a76a
mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents:
5689
diff
changeset
|
1545 if (file->mmap_base != NULL) { |
dcf5dbb6a76a
mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents:
5689
diff
changeset
|
1546 /* just copy to memory */ |
dcf5dbb6a76a
mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents:
5689
diff
changeset
|
1547 i_assert(file->buffer_offset == 0); |
dcf5dbb6a76a
mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents:
5689
diff
changeset
|
1548 |
dcf5dbb6a76a
mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents:
5689
diff
changeset
|
1549 buf = buffer_create_dynamic(default_pool, file->mmap_size); |
dcf5dbb6a76a
mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents:
5689
diff
changeset
|
1550 buffer_append(buf, file->mmap_base, file->mmap_size); |
6414
a6a49d5efc59
Changed buffer_free() and buffer_free_without_data() APIs to take ** pointer
Timo Sirainen <tss@iki.fi>
parents:
6360
diff
changeset
|
1551 buffer_free(&file->buffer); |
5714
dcf5dbb6a76a
mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents:
5689
diff
changeset
|
1552 file->buffer = buf; |
dcf5dbb6a76a
mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents:
5689
diff
changeset
|
1553 |
dcf5dbb6a76a
mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents:
5689
diff
changeset
|
1554 /* and lose the mmap */ |
dcf5dbb6a76a
mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents:
5689
diff
changeset
|
1555 if (munmap(file->mmap_base, file->mmap_size) < 0) { |
dcf5dbb6a76a
mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents:
5689
diff
changeset
|
1556 mail_index_file_set_syscall_error(file->log->index, |
dcf5dbb6a76a
mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents:
5689
diff
changeset
|
1557 file->filepath, |
dcf5dbb6a76a
mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents:
5689
diff
changeset
|
1558 "munmap()"); |
dcf5dbb6a76a
mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents:
5689
diff
changeset
|
1559 } |
dcf5dbb6a76a
mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents:
5689
diff
changeset
|
1560 file->mmap_base = NULL; |
dcf5dbb6a76a
mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents:
5689
diff
changeset
|
1561 } else if (file->buffer_offset != 0) { |
dcf5dbb6a76a
mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents:
5689
diff
changeset
|
1562 /* we don't have the full log in the memory. read it. */ |
6807
5382964fc01d
Avoid flushing attribute cache when checking to see if there's new data in
Timo Sirainen <tss@iki.fi>
parents:
6802
diff
changeset
|
1563 (void)mail_transaction_log_file_read(file, 0, FALSE); |
5714
dcf5dbb6a76a
mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents:
5689
diff
changeset
|
1564 } |
8941 | 1565 file->last_size = 0; |
5714
dcf5dbb6a76a
mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents:
5689
diff
changeset
|
1566 |
dcf5dbb6a76a
mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents:
5689
diff
changeset
|
1567 if (close(file->fd) < 0) { |
dcf5dbb6a76a
mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents:
5689
diff
changeset
|
1568 mail_index_file_set_syscall_error(file->log->index, |
dcf5dbb6a76a
mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents:
5689
diff
changeset
|
1569 file->filepath, "close()"); |
dcf5dbb6a76a
mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents:
5689
diff
changeset
|
1570 } |
dcf5dbb6a76a
mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents:
5689
diff
changeset
|
1571 file->fd = -1; |
8292
9ed4ecd4a866
Fixes to handling "out of disk space/quota" write failures.
Timo Sirainen <tss@iki.fi>
parents:
8136
diff
changeset
|
1572 |
9ed4ecd4a866
Fixes to handling "out of disk space/quota" write failures.
Timo Sirainen <tss@iki.fi>
parents:
8136
diff
changeset
|
1573 i_free(file->filepath); |
9ed4ecd4a866
Fixes to handling "out of disk space/quota" write failures.
Timo Sirainen <tss@iki.fi>
parents:
8136
diff
changeset
|
1574 file->filepath = i_strconcat(file->log->index->filepath, |
9ed4ecd4a866
Fixes to handling "out of disk space/quota" write failures.
Timo Sirainen <tss@iki.fi>
parents:
8136
diff
changeset
|
1575 MAIL_TRANSACTION_LOG_SUFFIX, NULL); |
5714
dcf5dbb6a76a
mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents:
5689
diff
changeset
|
1576 } |