Mercurial > dovecot > original-hg > dovecot-1.2
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 |
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 | 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 | 154 if (!index->mapping) { |
5854 | 155 if (mail_index_map(index, |
156 MAIL_INDEX_SYNC_HANDLER_HEAD) <= 0) | |
5819 | 157 return -1; |
158 } else { | |
159 /* if we got here from mapping, the .log file is | |
160 corrupted. use whatever values we got from index | |
161 file */ | |
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 | 317 if (file->corrupted) |
318 return 0; | |
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 | 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 | 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 | 364 "indexid changed %u -> %u", |
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 | 437 if (index->nfs_flush) { |
438 /* although we check also mtime and file size below, it's done | |
439 only to fix broken log files. we don't bother flushing | |
440 attribute cache just for that. */ | |
441 nfs_flush_file_handle_cache(file->filepath); | |
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 | 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 | 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 | 788 be updated unless we've locked the log. */ |
789 if (trans_size != 0) { | |
790 /* pread()s or the above fstat() check for mmaps should | |
791 have guaranteed that this doesn't happen */ | |
792 mail_transaction_log_file_set_corrupted(file, | |
793 "hdr.size too large (%u)", trans_size); | |
794 return -1; | |
795 } else if (file->locked) { | |
796 mail_transaction_log_file_set_corrupted(file, | |
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 | 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 | 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 | 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 | 887 return 1; |
888 } | |
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 | 911 static int |
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 | 914 { |
915 int ret; | |
916 | |
917 i_assert(file->mmap_base == NULL); | |
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 | 926 |
927 if (file->buffer != NULL && file->buffer_offset > start_offset) { | |
928 /* we have to insert missing data to beginning of buffer */ | |
929 ret = mail_transaction_log_file_insert_read(file, start_offset); | |
930 if (ret <= 0) | |
931 return ret; | |
932 } | |
933 | |
934 if (file->buffer == NULL) { | |
935 file->buffer = | |
936 buffer_create_dynamic(default_pool, LOG_PREFETCH); | |
937 file->buffer_offset = start_offset; | |
938 } | |
939 | |
940 if ((ret = mail_transaction_log_file_read_more(file)) <= 0) | |
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 | 950 i_assert(ret != 0); /* happens only with mmap */ |
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 | 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 } |