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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5796
diff changeset
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
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5796
diff changeset
197 if (!index->mapping) {
5854
eca7e29dce0d Rewrite index lock handling.
Timo Sirainen <tss@iki.fi>
parents: 5849
diff changeset
198 if (mail_index_map(index,
eca7e29dce0d Rewrite index lock handling.
Timo Sirainen <tss@iki.fi>
parents: 5849
diff changeset
199 MAIL_INDEX_SYNC_HANDLER_HEAD) <= 0)
5819
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5796
diff changeset
200 return -1;
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5796
diff changeset
201 } else {
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5796
diff changeset
202 /* if we got here from mapping, the .log file is
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5796
diff changeset
203 corrupted. use whatever values we got from index
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5796
diff changeset
204 file */
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5796
diff changeset
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
b747eb6e1ca1 Error message fix.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
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
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5796
diff changeset
389 if (file->corrupted)
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5796
diff changeset
390 return 0;
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5796
diff changeset
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
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5796
diff changeset
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
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5796
diff changeset
453 "indexid changed %u -> %u",
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5796
diff changeset
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
41911abe6fa7 NFS cache flushing updates.
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
527 if (index->nfs_flush) {
41911abe6fa7 NFS cache flushing updates.
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
528 /* although we check also mtime and file size below, it's done
41911abe6fa7 NFS cache flushing updates.
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
529 only to fix broken log files. we don't bother flushing
41911abe6fa7 NFS cache flushing updates.
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
530 attribute cache just for that. */
41911abe6fa7 NFS cache flushing updates.
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
531 nfs_flush_file_handle_cache(file->filepath);
41911abe6fa7 NFS cache flushing updates.
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
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
Timo Sirainen <tss@iki.fi>
parents: 5867
diff changeset
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
6debbb31df39 lib-index: Minor code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9318
diff changeset
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
d0a2e137f044 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6645
diff changeset
1169 be updated unless we've locked the log. */
d0a2e137f044 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6645
diff changeset
1170 if (trans_size != 0) {
d0a2e137f044 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6645
diff changeset
1171 /* pread()s or the above fstat() check for mmaps should
d0a2e137f044 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6645
diff changeset
1172 have guaranteed that this doesn't happen */
d0a2e137f044 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6645
diff changeset
1173 mail_transaction_log_file_set_corrupted(file,
d0a2e137f044 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6645
diff changeset
1174 "hdr.size too large (%u)", trans_size);
d0a2e137f044 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6645
diff changeset
1175 return -1;
d0a2e137f044 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6645
diff changeset
1176 } else if (file->locked) {
d0a2e137f044 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6645
diff changeset
1177 mail_transaction_log_file_set_corrupted(file,
d0a2e137f044 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6645
diff changeset
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
ce7f9d33d566 s/shrinked/shrank/
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
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
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
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
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
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
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
1268 return 1;
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
1269 }
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
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
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
1292 static int
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
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
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
1295 {
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
1296 int ret;
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
1297
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
1298 i_assert(file->mmap_base == NULL);
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
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
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
1313
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
1314 if (file->buffer != NULL && file->buffer_offset > start_offset) {
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
1315 /* we have to insert missing data to beginning of buffer */
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
1316 ret = mail_transaction_log_file_insert_read(file, start_offset);
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
1317 if (ret <= 0)
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
1318 return ret;
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
1319 }
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
1320
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
1321 if (file->buffer == NULL) {
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
1322 file->buffer =
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
1323 buffer_create_dynamic(default_pool, LOG_PREFETCH);
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
1324 file->buffer_offset = start_offset;
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
1325 }
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
1326
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
1327 if ((ret = mail_transaction_log_file_read_more(file)) <= 0)
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
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
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
1337 i_assert(ret != 0); /* happens only with mmap */
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
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
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
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
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1421 {
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1422 struct stat st;
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1423 int ret;
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1424
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1425 /* we are going to mmap() this file, but it's not necessarily
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1426 mmaped currently. */
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1427 i_assert(file->buffer_offset == 0 || file->mmap_base == NULL);
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1428 i_assert(file->mmap_size == 0 || file->mmap_base != NULL);
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1429
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1430 if (fstat(file->fd, &st) < 0) {
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1431 mail_index_file_set_syscall_error(file->log->index,
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1432 file->filepath, "fstat()");
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1433 return -1;
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1434 }
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1435 file->last_size = st.st_size;
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1436
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1437 if ((uoff_t)st.st_size < file->sync_offset) {
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1438 mail_transaction_log_file_set_corrupted(file,
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1439 "file size shrank");
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1440 return 0;
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1441 }
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
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
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1446 if ((ret = mail_transaction_log_file_sync(file)) < 0)
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1447 return 0;
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1448 if (ret > 0)
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1449 return 1;
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1450 /* size changed, re-mmap */
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1451 }
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1452
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1453 do {
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1454 mail_transaction_log_file_munmap(file);
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
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
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1463 if (mail_transaction_log_file_mmap(file) < 0)
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1464 return -1;
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1465 if ((ret = mail_transaction_log_file_sync(file)) < 0)
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1466 return 0;
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1467 } while (ret == 0);
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1468
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1469 return 1;
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1470 }
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
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
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
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
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1528 else {
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1529 mail_transaction_log_file_munmap(file);
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
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
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
1533 return ret <= 0 ? ret :
4aa0a3a2d3f8 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
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
eb9e5ab575a9 indexes: Error handling fixes.
Timo Sirainen <tss@iki.fi>
parents: 8811
diff changeset
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 }