annotate src/lib-index/mail-transaction-log-file.c @ 6857:41911abe6fa7 HEAD

NFS cache flushing updates.
author Timo Sirainen <tss@iki.fi>
date Sun, 25 Nov 2007 15:47:36 +0200
parents dbab5e592577
children 4aa0a3a2d3f8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6429
65c69a53a7be Replaced my Copyright notices. The year range always ends with 2007 now.
Timo Sirainen <tss@iki.fi>
parents: 6414
diff changeset
1 /* Copyright (c) 2003-2007 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"
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #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
13
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 #define LOG_PREFETCH 1024
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
15 #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
16
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 void
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 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
19 const char *fmt, ...)
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 va_list va;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22
5819
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5796
diff changeset
23 file->corrupted = TRUE;
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 file->hdr.indexid = 0;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 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
26 /* 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
27 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
28 sizeof(file->hdr.indexid),
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 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
30 indexid)) < 0) {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 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
32 file->filepath, "pwrite()");
5716
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
33 }
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 }
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 va_start(va, fmt);
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 t_push();
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 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
39 "Corrupted transaction log file %s: %s",
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 file->filepath, t_strdup_vprintf(fmt, va));
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 t_pop();
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 va_end(va);
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 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
46 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
47 const char *path)
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 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
50
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 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
52 file->log = log;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 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
54 file->fd = -1;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 return file;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
58 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
59 {
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
60 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
61 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
62 int old_errno = errno;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
64 *_file = NULL;
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
65
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 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
67
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 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
69 if (*p == file) {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 *p = file->next;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71 break;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 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
76 file->log->head = NULL;
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->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
79 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
80
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 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
82 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
83 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
84 file->filepath,
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 "munmap()");
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 if (file->fd != -1) {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 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
91 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
92 file->filepath,
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93 "close()");
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97 i_free(file->filepath);
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
98 i_free(file);
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 errno = old_errno;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
102
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
103 static void
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104 mail_transaction_log_file_add_to_list(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
105 {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106 struct mail_transaction_log *log = file->log;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107 struct mail_transaction_log_file **p;
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
108 struct mail_index_map *map = log->index->map;
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
109
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
110 if (map != NULL && file->hdr.file_seq == map->hdr.log_file_seq &&
5749
420a386fa27a int/ext/mailbox sync offset changes: Combined mailbox and int offsets to
Timo Sirainen <tss@iki.fi>
parents: 5723
diff changeset
111 map->hdr.log_file_head_offset != 0) {
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112 /* we can get a valid log offset from index file. initialize
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113 sync_offset from it so we don't have to read the whole log
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114 file from beginning. */
5749
420a386fa27a int/ext/mailbox sync offset changes: Combined mailbox and int offsets to
Timo Sirainen <tss@iki.fi>
parents: 5723
diff changeset
115 if (map->hdr.log_file_head_offset >= file->hdr.hdr_size)
420a386fa27a int/ext/mailbox sync offset changes: Combined mailbox and int offsets to
Timo Sirainen <tss@iki.fi>
parents: 5723
diff changeset
116 file->sync_offset = map->hdr.log_file_head_offset;
5716
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
117 else {
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
118 mail_index_set_error(log->index,
5749
420a386fa27a int/ext/mailbox sync offset changes: Combined mailbox and int offsets to
Timo Sirainen <tss@iki.fi>
parents: 5723
diff changeset
119 "%s: log_file_head_offset too small",
5716
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
120 log->index->filepath);
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
121 file->sync_offset = file->hdr.hdr_size;
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
122 }
5749
420a386fa27a int/ext/mailbox sync offset changes: Combined mailbox and int offsets to
Timo Sirainen <tss@iki.fi>
parents: 5723
diff changeset
123 file->saved_tail_offset = map->hdr.log_file_tail_offset;
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124 } else {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125 file->sync_offset = file->hdr.hdr_size;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128 /* insert it to correct position */
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129 for (p = &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
130 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
131 break;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
132 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
133 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
135 file->next = *p;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136 *p = file;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
137 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139 static int
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140 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
141 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
142 {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143 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
144
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 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
146 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
147 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
148 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
149 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
150 hdr->create_stamp = ioloop_time;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
151
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152 if (index->fd != -1) {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153 /* not creating index - make sure we have latest header */
5819
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5796
diff changeset
154 if (!index->mapping) {
5854
eca7e29dce0d Rewrite index lock handling.
Timo Sirainen <tss@iki.fi>
parents: 5849
diff changeset
155 if (mail_index_map(index,
eca7e29dce0d Rewrite index lock handling.
Timo Sirainen <tss@iki.fi>
parents: 5849
diff changeset
156 MAIL_INDEX_SYNC_HANDLER_HEAD) <= 0)
5819
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5796
diff changeset
157 return -1;
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5796
diff changeset
158 } else {
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5796
diff changeset
159 /* if we got here from mapping, the .log file is
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5796
diff changeset
160 corrupted. use whatever values we got from index
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5796
diff changeset
161 file */
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5796
diff changeset
162 }
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163 }
5772
002aa9bbfcb2 Removed index->hdr. Use index->map->hdr instead.
Timo Sirainen <tss@iki.fi>
parents: 5749
diff changeset
164 if (index->map != NULL) {
002aa9bbfcb2 Removed index->hdr. Use index->map->hdr instead.
Timo Sirainen <tss@iki.fi>
parents: 5749
diff changeset
165 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
166 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
167 hdr->file_seq = index->map->hdr.log_file_seq + 1;
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
168 } else {
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
169 hdr->file_seq = 1;
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
170 }
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
171
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
172 if (log->head != NULL && hdr->file_seq <= log->head->hdr.file_seq) {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173 /* make sure the sequence grows */
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174 hdr->file_seq = log->head->hdr.file_seq+1;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
175 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
176 return 0;
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 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
180 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
181 {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182 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
183
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
184 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
185 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
186 i_free(file);
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187 return NULL;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
189
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
190 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
191 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
192
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193 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
194 return file;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
196
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
197 static int
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198 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
199 {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200 int ret;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202 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
203 ret = 1;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204 else {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205 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
206 file->filepath, 0,
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207 &file->log->dotlock);
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209 if (ret > 0) {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210 file->log->dotlock_count++;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
211 file->locked = TRUE;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
212 return 0;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
213 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214 if (ret < 0) {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215 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
216 file->filepath,
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
217 "file_dotlock_create()");
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218 return -1;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
219 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
220
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221 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
222 "Timeout while waiting for release of "
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
223 "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
224 file->filepath);
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
225 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
226 return -1;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227 }
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 static int
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
230 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
231 {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
232 int ret;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
234 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
235 return 0;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
236
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237 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
238 if (ret < 0) {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 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
240 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
241 return -1;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242 }
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 if (ret == 0) {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
245 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
246 "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
247 file->filepath);
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
248 return -1;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
249 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
250 return 0;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
251 }
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 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
254 {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
255 int ret;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
256
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
257 if (file->locked)
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
258 return 0;
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 (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
261 file->locked = TRUE;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
262 return 0;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
263 }
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 (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
266 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
267
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268 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
269 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
270 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
271 &file->file_lock);
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
272 if (ret > 0) {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
273 file->locked = TRUE;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
274 return 0;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
275 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
276 if (ret < 0) {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
277 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
278 file->filepath,
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
279 "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
280 return -1;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
281 }
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 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
284 "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
285 file->filepath);
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
286 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
287 return -1;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
288 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
289
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
290 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
291 {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
292 if (!file->locked)
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
293 return;
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 file->locked = FALSE;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
296
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
297 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
298 return;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
299
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
300 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
301 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
302 return;
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
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
305 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
306 }
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 static int
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
309 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
310 bool ignore_estale)
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
311 {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
312 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
313 int ret;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
314
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
315 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
316
5819
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5796
diff changeset
317 if (file->corrupted)
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5796
diff changeset
318 return 0;
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5796
diff changeset
319
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
320 ret = pread_full(file->fd, &file->hdr, sizeof(file->hdr), 0);
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
321 if (ret < 0) {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
322 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
323 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
324 file->filepath,
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
325 "pread_full()");
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 return -1;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
328 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
329 if (ret == 0) {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
330 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
331 "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
332 return 0;
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
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
335 if (file->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
336 /* incompatible version - fix silently */
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
337 return 0;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
338 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
339 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
340 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
341 "Header size too small");
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
342 return 0;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
343 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
344 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
345 /* @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
346 shouldn't have filled */
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
347 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
348 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
349 }
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->hdr.indexid == 0) {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
352 /* corrupted */
5819
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5796
diff changeset
353 file->corrupted = TRUE;
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
354 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
355 "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
356 file->filepath);
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
357 return 0;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
358 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
359 if (file->hdr.indexid != file->log->index->indexid) {
5819
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5796
diff changeset
360 if (file->log->index->indexid != 0) {
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
361 /* 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
362 know about it yet */
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
363 mail_transaction_log_file_set_corrupted(file,
5819
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5796
diff changeset
364 "indexid changed %u -> %u",
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5796
diff changeset
365 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
366 return 0;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
367 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
368
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
369 /* 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
370 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
371 to avoid races. */
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
372 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
373 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
374
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
375 /* 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
376 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
377 corrupted. */
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
378 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
379 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
380 /* 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
381 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
382 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
383 "duplicate transaction log sequence (%u)",
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
384 f->hdr.file_seq);
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
385 return 0;
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
386 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
387 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
388
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
389 return 1;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
390 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
391
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
392 static int
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
393 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
394 bool ignore_estale)
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
395 {
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
396 struct stat st;
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
397
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
398 if (fstat(file->fd, &st) < 0) {
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
399 if (errno != ESTALE || !ignore_estale) {
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
400 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
401 file->filepath, "fstat()");
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
402 }
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
403 return -1;
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
404 }
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
405
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
406 file->st_dev = st.st_dev;
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
407 file->st_ino = st.st_ino;
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
408 file->last_mtime = st.st_mtime;
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
409 file->last_size = st.st_size;
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
410 return 0;
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
411 }
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
412
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
413 static bool
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
414 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
415 {
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
416 struct mail_transaction_log_file *tmp;
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
417
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
418 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
419 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
420 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
421 return TRUE;
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
422 }
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
423 return FALSE;
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
424 }
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
425
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
426 static int
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
427 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
428 int new_fd, bool reset,
a9df50952600 Added support for resetting index.
Timo Sirainen <tss@iki.fi>
parents: 5819
diff changeset
429 struct dotlock **dotlock)
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
430 {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
431 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
432 struct stat st;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
433 const char *path2;
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
434 int fd, ret;
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
435 bool rename_existing;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
436
6857
41911abe6fa7 NFS cache flushing updates.
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
437 if (index->nfs_flush) {
41911abe6fa7 NFS cache flushing updates.
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
438 /* 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
439 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
440 attribute cache just for that. */
41911abe6fa7 NFS cache flushing updates.
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
441 nfs_flush_file_handle_cache(file->filepath);
41911abe6fa7 NFS cache flushing updates.
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
442 }
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
443
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
444 /* 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
445 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
446 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
447 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
448 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
449 recreated, although it almost never is. */
5849
a9df50952600 Added support for resetting index.
Timo Sirainen <tss@iki.fi>
parents: 5819
diff changeset
450 if (reset)
a9df50952600 Added support for resetting index.
Timo Sirainen <tss@iki.fi>
parents: 5819
diff changeset
451 rename_existing = FALSE;
a9df50952600 Added support for resetting index.
Timo Sirainen <tss@iki.fi>
parents: 5819
diff changeset
452 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
453 if (errno != ENOENT) {
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
454 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
455 "stat()");
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
456 return -1;
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
457 }
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
458 rename_existing = FALSE;
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
459 } 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
460 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
461 /* 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
462 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
463 st.st_mtime == file->last_mtime &&
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
464 (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
465 /* 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
466 rename_existing = TRUE;
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
467 } else {
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
468 /* 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
469 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
470 if (fd == -1) {
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
471 if (errno != ENOENT) {
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
472 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
473 file->filepath, "open()");
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
474 return -1;
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
475 }
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
476 } else {
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
477 file->fd = fd;
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
478 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
479 FALSE) > 0 &&
00be53d8f076 Fixed "duplicate transaction log sequence" errors when we noticed that log
Timo Sirainen <tss@iki.fi>
parents: 5972
diff changeset
480 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
481 /* yes, it was ok */
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
482 (void)file_dotlock_delete(dotlock);
5953
Timo Sirainen <tss@iki.fi>
parents: 5867
diff changeset
483 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
484 return 0;
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 file->fd = -1;
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
487 if (close(fd) < 0) {
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
488 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
489 file->filepath, "close()");
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
490 }
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
491 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
492 rename_existing = FALSE;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
493 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
494
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
495 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
496 return -1;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
497
5849
a9df50952600 Added support for resetting index.
Timo Sirainen <tss@iki.fi>
parents: 5819
diff changeset
498 if (reset) {
a9df50952600 Added support for resetting index.
Timo Sirainen <tss@iki.fi>
parents: 5819
diff changeset
499 file->hdr.prev_file_seq = 0;
a9df50952600 Added support for resetting index.
Timo Sirainen <tss@iki.fi>
parents: 5819
diff changeset
500 file->hdr.prev_file_offset = 0;
a9df50952600 Added support for resetting index.
Timo Sirainen <tss@iki.fi>
parents: 5819
diff changeset
501 }
a9df50952600 Added support for resetting index.
Timo Sirainen <tss@iki.fi>
parents: 5819
diff changeset
502
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
503 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
504 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
505 "write_full()");
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
506 return -1;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
507 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
508
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
509 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
510 /* 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
511 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
512 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
513 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
514 "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
515 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
516 }
9fb9dc4d8df8 Flush NFS caches when needed if MAIL_INDEX_OPEN_FLAG_NFS_FLUSH is enabled.
Timo Sirainen <tss@iki.fi>
parents: 5953
diff changeset
517 }
9fb9dc4d8df8 Flush NFS caches when needed if MAIL_INDEX_OPEN_FLAG_NFS_FLUSH is enabled.
Timo Sirainen <tss@iki.fi>
parents: 5953
diff changeset
518
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
519 file->fd = new_fd;
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
520 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
521
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
522 /* 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
523 file->fd = -1;
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
524 if (ret < 0)
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
525 return -1;
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
526
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
527 /* keep two log files */
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
528 if (rename_existing) {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
529 /* 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
530 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
531 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
532 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
533 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
534 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
535 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
536 path2);
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
537 /* try to link() anyway */
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
538 }
6813
575235932194 nfs_safe_link(): Support linking files without original link count=1. Use it
Timo Sirainen <tss@iki.fi>
parents: 6812
diff changeset
539 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
540 errno != ENOENT && errno != EEXIST) {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
541 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
542 file->filepath, path2);
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
543 /* 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
544 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
545 first one. */
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
546 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
547 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
548
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
549 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
550 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
551 return -1;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
552
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
553 /* success */
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
554 file->fd = new_fd;
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
555 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
556 return 0;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
557 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
558
5849
a9df50952600 Added support for resetting index.
Timo Sirainen <tss@iki.fi>
parents: 5819
diff changeset
559 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
560 bool reset)
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
561 {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
562 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
563 struct dotlock *dotlock;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
564 mode_t old_mask;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
565 int fd;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
566
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
567 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
568
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
569 /* 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
570 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
571 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
572 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
573 file->filepath, 0, &dotlock);
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
574 umask(old_mask);
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
575
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
576 if (fd == -1) {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
577 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
578 "file_dotlock_open()");
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
579 return -1;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
580 }
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 if (index->gid != (gid_t)-1 &&
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
583 fchown(fd, (uid_t)-1, index->gid) < 0) {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
584 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
585 "fchown()");
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
586 (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
587 return -1;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
588 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
589
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
590 /* 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
591 is for the existing file */
5849
a9df50952600 Added support for resetting index.
Timo Sirainen <tss@iki.fi>
parents: 5819
diff changeset
592 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
593 if (dotlock != NULL)
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
594 (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
595 return -1;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
596 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
597 return 0;
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
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
600 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
601 bool check_existing)
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
602 {
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
603 unsigned int i;
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
604 bool ignore_estale;
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
605 int ret;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
606
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
607 for (i = 0;; i++) {
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
608 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
609 if (file->fd == -1) {
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
610 if (errno == ENOENT)
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
611 return 0;
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
612
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
613 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
614 file->filepath, "open()");
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
615 return -1;
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
616 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
617
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
618 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
619 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
620 ret = -1;
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
621 else if (check_existing &&
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
622 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
623 return 0;
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
624 else {
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
625 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
626 ignore_estale);
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
627 }
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
628 if (ret > 0) {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
629 /* success */
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
630 break;
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
631 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
632
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
633 if (ret == 0) {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
634 /* corrupted */
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
635 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
636 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
637 "unlink(%s) failed: %m",
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
638 file->filepath);
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
639 }
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
640 return 0;
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
641 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
642 if (errno != ESTALE ||
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
643 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
644 /* syscall error */
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
645 return -1;
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
646 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
647
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
648 /* ESTALE - try again */
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
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
651 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
652 return 1;
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
653 }
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
654
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
655 static int
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
656 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
657 const void *data, unsigned int size)
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
658 {
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
659 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
660 const struct mail_index_header *ihdr;
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
661 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
662 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
663 const unsigned int offset_size = sizeof(ihdr->log_file_tail_offset);
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
664 uint32_t sync_offset;
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
665
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
666 i_assert(offset_size == sizeof(sync_offset));
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
667
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
668 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
669 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
670 "header update extends beyond record size");
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
671 return -1;
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
672 }
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
673
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
674 if (u->offset <= offset_pos &&
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
675 u->offset + u->size >= offset_pos + offset_size) {
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
676 memcpy(&sync_offset,
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
677 CONST_PTR_OFFSET(u + 1, offset_pos - u->offset),
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
678 sizeof(sync_offset));
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
679
5749
420a386fa27a int/ext/mailbox sync offset changes: Combined mailbox and int offsets to
Timo Sirainen <tss@iki.fi>
parents: 5723
diff changeset
680 if (sync_offset < file->saved_tail_offset) {
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
681 mail_transaction_log_file_set_corrupted(file,
6645
ce7f9d33d566 s/shrinked/shrank/
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
682 "log_file_tail_offset shrank");
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
683 return -1;
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
684 }
5749
420a386fa27a int/ext/mailbox sync offset changes: Combined mailbox and int offsets to
Timo Sirainen <tss@iki.fi>
parents: 5723
diff changeset
685 file->saved_tail_offset = sync_offset;
420a386fa27a int/ext/mailbox sync offset changes: Combined mailbox and int offsets to
Timo Sirainen <tss@iki.fi>
parents: 5723
diff changeset
686 if (sync_offset > file->max_tail_offset)
420a386fa27a int/ext/mailbox sync offset changes: Combined mailbox and int offsets to
Timo Sirainen <tss@iki.fi>
parents: 5723
diff changeset
687 file->max_tail_offset = sync_offset;
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
688 return 1;
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
689 }
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
690 return 0;
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
691 }
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
692
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
693 static int
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
694 log_file_track_mailbox_sync_offset(struct mail_transaction_log_file *file,
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
695 const struct mail_transaction_header *hdr,
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
696 unsigned int trans_size)
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
697 {
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
698 int ret;
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
699
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
700 i_assert((hdr->type & MAIL_TRANSACTION_EXTERNAL) != 0);
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
701
5723
ad695be143ff Don't assume that transaction record type is a bitmask in the transaction
Timo Sirainen <tss@iki.fi>
parents: 5716
diff changeset
702 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
703 MAIL_TRANSACTION_HEADER_UPDATE) {
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
704 /* see if this updates mailbox_sync_offset */
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
705 ret = log_file_track_mailbox_sync_offset_hdr(file, hdr + 1,
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
706 trans_size -
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
707 sizeof(*hdr));
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
708 if (ret != 0)
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
709 return ret < 0 ? -1 : 0;
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
710 }
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
711
5749
420a386fa27a int/ext/mailbox sync offset changes: Combined mailbox and int offsets to
Timo Sirainen <tss@iki.fi>
parents: 5723
diff changeset
712 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
713 /* 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
714 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
715 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
716 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
717 }
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
718 return 0;
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
719 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
720
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
721 static int
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
722 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
723 {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
724 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
725 const void *data;
5795
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
726 struct stat st;
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
727 size_t size, avail;
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
728 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
729
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
730 data = buffer_get_data(file->buffer, &size);
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 (file->sync_offset < file->buffer_offset)
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
733 file->sync_offset = file->buffer_offset;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
734
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
735 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
736 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
737 file->buffer_offset);
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
738 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
739 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
740 /* unfinished */
5795
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
741 return 1;
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
742 }
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
743 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
744 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
745 "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
746 return -1;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
747 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
748
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
749 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
750 break;
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
751
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
752 /* transaction has been fully written */
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
753 if ((hdr->type & MAIL_TRANSACTION_EXTERNAL) != 0) {
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
754 if (log_file_track_mailbox_sync_offset(file, hdr,
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
755 trans_size) < 0)
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
756 return -1;
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 file->sync_offset += trans_size;
5791
2a05cff7eca4 Handle partial reads with mmap_disable=no correctly.
Timo Sirainen <tss@iki.fi>
parents: 5787
diff changeset
759 trans_size = 0;
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
760 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
761
5796
e5da155f44c3 Better race condition fix for mmaped log files
Timo Sirainen <tss@iki.fi>
parents: 5795
diff changeset
762 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
763 /* 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
764 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
765 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
766 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
767 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
768
e5da155f44c3 Better race condition fix for mmaped log files
Timo Sirainen <tss@iki.fi>
parents: 5795
diff changeset
769 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
770 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
771 prefix" errors. */
e5da155f44c3 Better race condition fix for mmaped log files
Timo Sirainen <tss@iki.fi>
parents: 5795
diff changeset
772 if (fstat(file->fd, &st) < 0) {
e5da155f44c3 Better race condition fix for mmaped log files
Timo Sirainen <tss@iki.fi>
parents: 5795
diff changeset
773 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
774 file->filepath,
e5da155f44c3 Better race condition fix for mmaped log files
Timo Sirainen <tss@iki.fi>
parents: 5795
diff changeset
775 "fstat()");
e5da155f44c3 Better race condition fix for mmaped log files
Timo Sirainen <tss@iki.fi>
parents: 5795
diff changeset
776 return -1;
e5da155f44c3 Better race condition fix for mmaped log files
Timo Sirainen <tss@iki.fi>
parents: 5795
diff changeset
777 }
e5da155f44c3 Better race condition fix for mmaped log files
Timo Sirainen <tss@iki.fi>
parents: 5795
diff changeset
778 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
779 file->last_size = st.st_size;
e5da155f44c3 Better race condition fix for mmaped log files
Timo Sirainen <tss@iki.fi>
parents: 5795
diff changeset
780 return 0;
e5da155f44c3 Better race condition fix for mmaped log files
Timo Sirainen <tss@iki.fi>
parents: 5795
diff changeset
781 }
e5da155f44c3 Better race condition fix for mmaped log files
Timo Sirainen <tss@iki.fi>
parents: 5795
diff changeset
782 }
e5da155f44c3 Better race condition fix for mmaped log files
Timo Sirainen <tss@iki.fi>
parents: 5795
diff changeset
783
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
784 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
785 if (avail != size) {
2a05cff7eca4 Handle partial reads with mmap_disable=no correctly.
Timo Sirainen <tss@iki.fi>
parents: 5787
diff changeset
786 /* 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
787 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
788 be updated unless we've locked the log. */
d0a2e137f044 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6645
diff changeset
789 if (trans_size != 0) {
d0a2e137f044 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6645
diff changeset
790 /* pread()s or the above fstat() check for mmaps should
d0a2e137f044 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6645
diff changeset
791 have guaranteed that this doesn't happen */
d0a2e137f044 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6645
diff changeset
792 mail_transaction_log_file_set_corrupted(file,
d0a2e137f044 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6645
diff changeset
793 "hdr.size too large (%u)", trans_size);
d0a2e137f044 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6645
diff changeset
794 return -1;
d0a2e137f044 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6645
diff changeset
795 } else if (file->locked) {
d0a2e137f044 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6645
diff changeset
796 mail_transaction_log_file_set_corrupted(file,
d0a2e137f044 Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 6645
diff changeset
797 "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
798 return -1;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
799 }
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
800
6829
dbab5e592577 NFS cache flushing APIs changed and backend implements it a bit differently.
Timo Sirainen <tss@iki.fi>
parents: 6819
diff changeset
801 /* 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
802 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
803 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
804 }
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
805
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
806 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
807 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
808 file->next->hdr.prev_file_offset != 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
809 mail_index_set_error(file->log->index,
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
810 "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
811 "(%"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
812 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
813 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
814 }
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
815
5795
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
816 return 1;
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
817 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
818
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
819 static int
5716
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
820 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
821 uoff_t offset)
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
822 {
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
823 void *data;
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
824 size_t size;
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
825 ssize_t ret;
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
826
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
827 size = file->buffer_offset - offset;
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
828 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
829
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
830 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
831 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
832 if (ret > 0) {
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
833 /* success */
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
834 file->buffer_offset -= size;
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
835 return 1;
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
836 }
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
837
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
838 /* 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
839 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
840 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
841
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
842 if (ret == 0) {
6645
ce7f9d33d566 s/shrinked/shrank/
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
843 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
844 return 0;
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
845 } else if (errno == ESTALE) {
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
846 /* 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
847 return 0;
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
848 } else {
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
849 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
850 file->filepath, "pread()");
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
851 return -1;
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
852 }
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
853 }
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
854
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
855 static int
6002
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
856 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
857 {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
858 void *data;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
859 size_t size;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
860 uint32_t read_offset;
6002
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
861 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
862
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
863 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
864
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
865 do {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
866 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
867 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
868 if (ret > 0)
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
869 read_offset += ret;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
870
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
871 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
872 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
873 } 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
874
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
875 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
876
5791
2a05cff7eca4 Handle partial reads with mmap_disable=no correctly.
Timo Sirainen <tss@iki.fi>
parents: 5787
diff changeset
877 if (ret < 0) {
2a05cff7eca4 Handle partial reads with mmap_disable=no correctly.
Timo Sirainen <tss@iki.fi>
parents: 5787
diff changeset
878 if (errno == ESTALE) {
2a05cff7eca4 Handle partial reads with mmap_disable=no correctly.
Timo Sirainen <tss@iki.fi>
parents: 5787
diff changeset
879 /* 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
880 return 0;
2a05cff7eca4 Handle partial reads with mmap_disable=no correctly.
Timo Sirainen <tss@iki.fi>
parents: 5787
diff changeset
881 }
2a05cff7eca4 Handle partial reads with mmap_disable=no correctly.
Timo Sirainen <tss@iki.fi>
parents: 5787
diff changeset
882
2a05cff7eca4 Handle partial reads with mmap_disable=no correctly.
Timo Sirainen <tss@iki.fi>
parents: 5787
diff changeset
883 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
884 file->filepath, "pread()");
2a05cff7eca4 Handle partial reads with mmap_disable=no correctly.
Timo Sirainen <tss@iki.fi>
parents: 5787
diff changeset
885 return -1;
2a05cff7eca4 Handle partial reads with mmap_disable=no correctly.
Timo Sirainen <tss@iki.fi>
parents: 5787
diff changeset
886 }
6002
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
887 return 1;
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
888 }
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
889
6802
ba58eaf06763 Keep better track of when we need to flush NFS attribute caches.
Timo Sirainen <tss@iki.fi>
parents: 6798
diff changeset
890 static bool
ba58eaf06763 Keep better track of when we need to flush NFS attribute caches.
Timo Sirainen <tss@iki.fi>
parents: 6798
diff changeset
891 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
892 {
ba58eaf06763 Keep better track of when we need to flush NFS attribute caches.
Timo Sirainen <tss@iki.fi>
parents: 6798
diff changeset
893 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
894 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
895
ba58eaf06763 Keep better track of when we need to flush NFS attribute caches.
Timo Sirainen <tss@iki.fi>
parents: 6798
diff changeset
896 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
897 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
898 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
899 /* 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
900 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
901 return TRUE;
ba58eaf06763 Keep better track of when we need to flush NFS attribute caches.
Timo Sirainen <tss@iki.fi>
parents: 6798
diff changeset
902 }
ba58eaf06763 Keep better track of when we need to flush NFS attribute caches.
Timo Sirainen <tss@iki.fi>
parents: 6798
diff changeset
903
ba58eaf06763 Keep better track of when we need to flush NFS attribute caches.
Timo Sirainen <tss@iki.fi>
parents: 6798
diff changeset
904 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
905 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
906 return TRUE;
ba58eaf06763 Keep better track of when we need to flush NFS attribute caches.
Timo Sirainen <tss@iki.fi>
parents: 6798
diff changeset
907
ba58eaf06763 Keep better track of when we need to flush NFS attribute caches.
Timo Sirainen <tss@iki.fi>
parents: 6798
diff changeset
908 return FALSE;
ba58eaf06763 Keep better track of when we need to flush NFS attribute caches.
Timo Sirainen <tss@iki.fi>
parents: 6798
diff changeset
909 }
ba58eaf06763 Keep better track of when we need to flush NFS attribute caches.
Timo Sirainen <tss@iki.fi>
parents: 6798
diff changeset
910
6002
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
911 static int
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
912 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
913 uoff_t start_offset, bool nfs_flush)
6002
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
914 {
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
915 int ret;
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
916
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
917 i_assert(file->mmap_base == NULL);
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
918
6808
937faba78a68 Don't flush attribute cache twice after locking transaction log.
Timo Sirainen <tss@iki.fi>
parents: 6807
diff changeset
919 /* 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
920 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
921 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
922 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
923 refreshing the log. */
937faba78a68 Don't flush attribute cache twice after locking transaction log.
Timo Sirainen <tss@iki.fi>
parents: 6807
diff changeset
924 if (file->log->index->nfs_flush && nfs_flush)
6829
dbab5e592577 NFS cache flushing APIs changed and backend implements it a bit differently.
Timo Sirainen <tss@iki.fi>
parents: 6819
diff changeset
925 nfs_flush_attr_cache_fd_locked(file->filepath, file->fd);
6002
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
926
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
927 if (file->buffer != NULL && file->buffer_offset > start_offset) {
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
928 /* we have to insert missing data to beginning of buffer */
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
929 ret = mail_transaction_log_file_insert_read(file, start_offset);
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
930 if (ret <= 0)
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
931 return ret;
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
932 }
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
933
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
934 if (file->buffer == NULL) {
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
935 file->buffer =
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
936 buffer_create_dynamic(default_pool, LOG_PREFETCH);
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
937 file->buffer_offset = start_offset;
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
938 }
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
939
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
940 if ((ret = mail_transaction_log_file_read_more(file)) <= 0)
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
941 return ret;
5791
2a05cff7eca4 Handle partial reads with mmap_disable=no correctly.
Timo Sirainen <tss@iki.fi>
parents: 5787
diff changeset
942
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
943 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
944 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
945 /* 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
946 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
947 }
5382964fc01d Avoid flushing attribute cache when checking to see if there's new data in
Timo Sirainen <tss@iki.fi>
parents: 6802
diff changeset
948
5795
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
949 if ((ret = mail_transaction_log_file_sync(file)) <= 0) {
6002
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
950 i_assert(ret != 0); /* happens only with mmap */
16f91815c7ed Code cleanup
Timo Sirainen <tss@iki.fi>
parents: 5996
diff changeset
951 return -1;
5795
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
952 }
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
953
5791
2a05cff7eca4 Handle partial reads with mmap_disable=no correctly.
Timo Sirainen <tss@iki.fi>
parents: 5787
diff changeset
954 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
955 buffer_set_used_size(file->buffer,
2a05cff7eca4 Handle partial reads with mmap_disable=no correctly.
Timo Sirainen <tss@iki.fi>
parents: 5787
diff changeset
956 file->sync_offset - file->buffer_offset);
2a05cff7eca4 Handle partial reads with mmap_disable=no correctly.
Timo Sirainen <tss@iki.fi>
parents: 5787
diff changeset
957 return 1;
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
958 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
959
5716
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
960 static int
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
961 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
962 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
963 {
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
964 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
965 /* broken start offset */
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
966 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
967 "%s: start_offset (%"PRIuUOFF_T") > "
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
968 "current sync_offset (%"PRIuUOFF_T")",
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
969 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
970 return 0;
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
971 }
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
972 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
973 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
974 "%s: end_offset (%"PRIuUOFF_T") > "
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
975 "current sync_offset (%"PRIuUOFF_T")",
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
976 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
977 return 0;
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
978 }
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
979
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
980 return 1;
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
981 }
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
982
5795
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
983 static int
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
984 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
985 {
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
986 if (file->buffer != NULL) {
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
987 /* 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
988 buffer_free(&file->buffer);
5795
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
989 }
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
990 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
991 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
992 file->fd, 0);
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
993 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
994 file->mmap_base = NULL;
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
995 file->mmap_size = 0;
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
996 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
997 file->filepath, "mmap()");
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
998 return -1;
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
999 }
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1000
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1001 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
1002 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
1003 MADV_SEQUENTIAL) < 0) {
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1004 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
1005 file->filepath, "madvise()");
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1006 }
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1007 }
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1008
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1009 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
1010 file->mmap_base,
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1011 file->mmap_size);
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1012 file->buffer_offset = 0;
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1013 return 0;
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1014 }
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1015
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1016 static void
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1017 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
1018 {
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1019 if (file->mmap_base == NULL)
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1020 return;
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1021
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1022 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
1023 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
1024 file->filepath, "munmap()");
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1025 }
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1026 file->mmap_base = NULL;
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1027 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
1028 buffer_free(&file->buffer);
5795
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1029 }
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1030
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1031 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
1032 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
1033 {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1034 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
1035 size_t size;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1036 struct stat st;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1037 int ret;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1038
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1039 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
1040 /* corrupted */
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1041 return 0;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1042 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1043
5716
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
1044 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
1045 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
1046
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
1047 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
1048 end_offset == (uoff_t)-1) {
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
1049 /* 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
1050 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
1051 end_offset) == 0)
b6cf05796f6d If log offsets are broken, don't assert-crash.
Timo Sirainen <tss@iki.fi>
parents: 5772
diff changeset
1052 return 0;
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
1053 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
1054 end_offset = file->sync_offset;
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
1055 }
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5687
diff changeset
1056
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1057 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
1058 /* 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
1059 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
1060 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
1061 return 1;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1062 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1063
5716
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
1064 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
1065 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
1066 /* 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
1067 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
1068 mail_index_set_error(index,
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
1069 "%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
1070 file->filepath);
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
1071 return 0;
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
1072 }
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
1073 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
1074 end_offset);
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
1075 }
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
1076
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1077 if (!index->mmap_disable) {
5716
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
1078 /* we are going to mmap() this file, but it's not necessarily
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
1079 mmaped currently. */
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
1080 i_assert(file->buffer_offset == 0 || file->mmap_base == NULL);
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
1081 i_assert(file->mmap_size == 0 || file->mmap_base != NULL);
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
1082
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1083 if (fstat(file->fd, &st) < 0) {
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1084 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
1085 "fstat()");
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1086 return -1;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1087 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1088 file->last_size = st.st_size;
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1089
5716
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
1090 if ((uoff_t)st.st_size < file->sync_offset) {
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1091 mail_transaction_log_file_set_corrupted(file,
6645
ce7f9d33d566 s/shrinked/shrank/
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1092 "file size shrank");
5716
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
1093 return 0;
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1094 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1095
5716
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
1096 if ((uoff_t)st.st_size == file->mmap_size) {
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
1097 /* we already have the whole file mmaped */
5795
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1098 if ((ret = mail_transaction_log_file_sync(file)) < 0)
5716
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
1099 return 0;
5795
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1100 if (ret > 0) {
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1101 return log_file_map_check_offsets(file,
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1102 start_offset,
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1103 end_offset);
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1104 }
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1105 /* size changed, re-mmap */
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1106 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1107 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1108
5795
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1109 if (index->mmap_disable) {
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1110 mail_transaction_log_file_munmap(file);
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1111
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
1112 ret = mail_transaction_log_file_read(file, start_offset, FALSE);
5716
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
1113 if (ret <= 0)
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1114 return ret;
5716
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
1115 } else {
5795
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1116 do {
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1117 mail_transaction_log_file_munmap(file);
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1118
5795
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1119 if (mail_transaction_log_file_mmap(file) < 0)
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1120 return -1;
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1121 if ((ret = mail_transaction_log_file_sync(file)) < 0)
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1122 return 0;
0c0a829a9a63 Handle race conditions in mmap()ed transaction logs better.
Timo Sirainen <tss@iki.fi>
parents: 5792
diff changeset
1123 } while (ret == 0);
5687
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1124 }
d28185a3131a Moved mail transaction log file related code to its own file.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1125
5716
4a08705e97f5 Fixes to mail_transaction_log_file_map() error handling.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
1126 return 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
1127 }
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
1128
dcf5dbb6a76a mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents: 5689
diff changeset
1129 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
1130 *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
1131 {
dcf5dbb6a76a mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents: 5689
diff changeset
1132 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
1133
dcf5dbb6a76a mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents: 5689
diff changeset
1134 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
1135 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
1136
dcf5dbb6a76a mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents: 5689
diff changeset
1137 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
1138 /* 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
1139 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
1140
dcf5dbb6a76a mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents: 5689
diff changeset
1141 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
1142 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
1143 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
1144 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
1145
dcf5dbb6a76a mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents: 5689
diff changeset
1146 /* 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
1147 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
1148 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
1149 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
1150 "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
1151 }
dcf5dbb6a76a mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents: 5689
diff changeset
1152 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
1153 } 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
1154 /* 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
1155 (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
1156 }
dcf5dbb6a76a mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents: 5689
diff changeset
1157
dcf5dbb6a76a mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents: 5689
diff changeset
1158 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
1159 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
1160 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
1161 }
dcf5dbb6a76a mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents: 5689
diff changeset
1162 file->fd = -1;
dcf5dbb6a76a mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents: 5689
diff changeset
1163 }