annotate src/lib-index/mail-modifylog.c @ 259:cdf38b5cc2b7 HEAD

still wrong..
author Timo Sirainen <tss@iki.fi>
date Mon, 16 Sep 2002 12:52:58 +0300
parents 0a45c4744f51
children 51eea5cbb075
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1 /* Copyright (C) 2002 Timo Sirainen */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
222
cf4d065f2f85 lots of cleanups. also index/datafile is now capable of staying in memory,
Timo Sirainen <tss@iki.fi>
parents: 221
diff changeset
4 #include "file-lock.h"
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
5 #include "file-set-size.h"
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "mmap-util.h"
29
e9375147c0cb Added write_full() which is a simple wrapper around write() meant for
Timo Sirainen <tss@iki.fi>
parents: 5
diff changeset
7 #include "write-full.h"
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "mail-index.h"
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "mail-index-util.h"
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include "mail-modifylog.h"
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #include <stdlib.h>
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include <fcntl.h>
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 /* Maximum size for modify log (isn't exact) */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 #define MAX_MODIFYLOG_SIZE 10240
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
18 #define MODIFYLOG_GROW_SIZE (sizeof(ModifyLogRecord) * 128)
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
19
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
20 #define MODIFY_LOG_INITIAL_SIZE (sizeof(ModifyLogHeader) + MODIFYLOG_GROW_SIZE)
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
21
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 #define MODIFYLOG_FILE_POSITION(log, ptr) \
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 ((int) ((char *) (ptr) - (char *) (log)->mmap_base))
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 struct _MailModifyLog {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 MailIndex *index;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 int fd;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 char *filepath;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 void *mmap_base;
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
32 size_t mmap_used_length;
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
33 size_t mmap_full_length;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 ModifyLogHeader *header;
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
36 uoff_t synced_position;
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
37 unsigned int synced_id;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
39 unsigned int anon_mmap:1;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 unsigned int modified:1;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 unsigned int second_log:1;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 };
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43
222
cf4d065f2f85 lots of cleanups. also index/datafile is now capable of staying in memory,
Timo Sirainen <tss@iki.fi>
parents: 221
diff changeset
44 static const unsigned int no_expunges[] = { 0 };
cf4d065f2f85 lots of cleanups. also index/datafile is now capable of staying in memory,
Timo Sirainen <tss@iki.fi>
parents: 221
diff changeset
45
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
46 static int modifylog_set_syscall_error(MailModifyLog *log,
231
bbd248788571 we shouldn't crash anymore when modify log gets full
Timo Sirainen <tss@iki.fi>
parents: 223
diff changeset
47 const char *function)
221
ed0d5b17c7a4 Added extra functions for easier printing of error messages. Moved
Timo Sirainen <tss@iki.fi>
parents: 199
diff changeset
48 {
ed0d5b17c7a4 Added extra functions for easier printing of error messages. Moved
Timo Sirainen <tss@iki.fi>
parents: 199
diff changeset
49 i_assert(function != NULL);
ed0d5b17c7a4 Added extra functions for easier printing of error messages. Moved
Timo Sirainen <tss@iki.fi>
parents: 199
diff changeset
50
ed0d5b17c7a4 Added extra functions for easier printing of error messages. Moved
Timo Sirainen <tss@iki.fi>
parents: 199
diff changeset
51 index_set_error(log->index, "%s failed with modify log file %s: %m",
ed0d5b17c7a4 Added extra functions for easier printing of error messages. Moved
Timo Sirainen <tss@iki.fi>
parents: 199
diff changeset
52 function, log->filepath);
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
53 return FALSE;
221
ed0d5b17c7a4 Added extra functions for easier printing of error messages. Moved
Timo Sirainen <tss@iki.fi>
parents: 199
diff changeset
54 }
ed0d5b17c7a4 Added extra functions for easier printing of error messages. Moved
Timo Sirainen <tss@iki.fi>
parents: 199
diff changeset
55
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
56 static int modifylog_set_corrupted(MailModifyLog *log, const char *fmt, ...)
221
ed0d5b17c7a4 Added extra functions for easier printing of error messages. Moved
Timo Sirainen <tss@iki.fi>
parents: 199
diff changeset
57 {
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
58 va_list va;
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
59
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
60 va_start(va, fmt);
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
61 t_push();
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
62
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
63 index_set_error(log->index, "Corrupted modify log file %s: %s",
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
64 log->filepath, t_strdup_vprintf(fmt, va));
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
65
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
66 t_pop();
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
67 va_end(va);
221
ed0d5b17c7a4 Added extra functions for easier printing of error messages. Moved
Timo Sirainen <tss@iki.fi>
parents: 199
diff changeset
68
ed0d5b17c7a4 Added extra functions for easier printing of error messages. Moved
Timo Sirainen <tss@iki.fi>
parents: 199
diff changeset
69 /* make sure we don't get back here */
ed0d5b17c7a4 Added extra functions for easier printing of error messages. Moved
Timo Sirainen <tss@iki.fi>
parents: 199
diff changeset
70 log->index->inconsistent = TRUE;
ed0d5b17c7a4 Added extra functions for easier printing of error messages. Moved
Timo Sirainen <tss@iki.fi>
parents: 199
diff changeset
71 (void)unlink(log->filepath);
ed0d5b17c7a4 Added extra functions for easier printing of error messages. Moved
Timo Sirainen <tss@iki.fi>
parents: 199
diff changeset
72
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
73 return FALSE;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 /* returns 1 = yes, 0 = no, -1 = error */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 static int mail_modifylog_have_other_users(MailModifyLog *log)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 int ret;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
81 if (log->anon_mmap)
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
82 return 0;
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
83
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 /* try grabbing exclusive lock */
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
85 ret = file_try_lock(log->fd, F_WRLCK);
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
86 if (ret <= 0) {
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
87 if (ret < 0)
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
88 modifylog_set_syscall_error(log, "file_try_lock()");
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
89 return ret < 0 ? -1 : 1;
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
90 }
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92 /* revert back to shared lock */
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
93 ret = file_try_lock(log->fd, F_RDLCK);
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
94 if (ret < 0) {
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
95 modifylog_set_syscall_error(log, "file_try_lock()");
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
96 return -1;
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
97 }
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
98
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
99 if (ret == 0) {
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100 /* shouldn't happen */
222
cf4d065f2f85 lots of cleanups. also index/datafile is now capable of staying in memory,
Timo Sirainen <tss@iki.fi>
parents: 221
diff changeset
101 index_set_error(log->index, "file_lock(F_WRLCK -> F_RDLCK) "
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
102 "failed with file %s", log->filepath);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103 return -1;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
106 return 0;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
108
240
Timo Sirainen <tss@iki.fi>
parents: 237
diff changeset
109 static int mmap_update(MailModifyLog *log, int forced)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110 {
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
111 ModifyLogHeader *hdr;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112 unsigned int extra;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113
240
Timo Sirainen <tss@iki.fi>
parents: 237
diff changeset
114 if (!forced && log->header != NULL &&
237
06d6eca0a45f Fixes for no diskspace handling. seems to work now.
Timo Sirainen <tss@iki.fi>
parents: 234
diff changeset
115 log->mmap_full_length >= log->header->used_file_size)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116 return TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
117
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
118 i_assert(!log->anon_mmap);
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
119
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
120 if (log->mmap_base != NULL) {
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
121 /* make sure we're synced before munmap() */
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
122 if (log->modified &&
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
123 msync(log->mmap_base, log->mmap_used_length, MS_SYNC) < 0)
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
124 return modifylog_set_syscall_error(log, "msync()");
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
125
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
126 if (munmap(log->mmap_base, log->mmap_full_length) < 0)
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
127 modifylog_set_syscall_error(log, "munmap()");
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
128 }
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
129
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
130 log->mmap_used_length = 0;
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
131 log->header = NULL;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
132
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
133 log->mmap_base = mmap_rw_file(log->fd, &log->mmap_full_length);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134 if (log->mmap_base == MAP_FAILED) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
135 log->mmap_base = NULL;
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
136 return modifylog_set_syscall_error(log, "mmap()");
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
137 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
139 if (log->mmap_full_length < sizeof(ModifyLogHeader)) {
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
140 index_set_error(log->index, "Too small modify log %s",
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
141 log->filepath);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
142 (void)unlink(log->filepath);
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
143 return FALSE;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
144 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
146 extra = (log->mmap_full_length - sizeof(ModifyLogHeader)) %
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147 sizeof(ModifyLogRecord);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
148
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
149 if (extra != 0) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
150 /* partial write or corrupted -
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
151 truncate the file to valid length */
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
152 log->mmap_full_length -= extra;
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
153 if (ftruncate(log->fd, (off_t)log->mmap_full_length) < 0)
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
154 modifylog_set_syscall_error(log, "ftruncate()");
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
157 hdr = log->mmap_base;
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
158 if (hdr->used_file_size > log->mmap_full_length) {
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
159 modifylog_set_corrupted(log,
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
160 "used_file_size larger than real file size "
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
161 "(%"PRIuUOFF_T" vs %"PRIuSIZE_T")",
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
162 hdr->used_file_size, log->mmap_full_length);
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
163 return FALSE;
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
164 }
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
165
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
166 if ((hdr->used_file_size - sizeof(ModifyLogHeader)) %
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
167 sizeof(ModifyLogRecord) != 0) {
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
168 modifylog_set_corrupted(log,
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
169 "Invalid used_file_size in header (%"PRIuUOFF_T")",
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
170 hdr->used_file_size);
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
171 return FALSE;
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
172 }
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
173
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174 log->header = log->mmap_base;
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
175 log->mmap_used_length = log->header->used_file_size;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
176 return TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
179 static MailModifyLog *mail_modifylog_new(MailIndex *index)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
181 MailModifyLog *log;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183 log = i_new(MailModifyLog, 1);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
184 log->fd = -1;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
185 log->index = index;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187 index->modifylog = log;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188 return log;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
189 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
190
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
191 static void mail_modifylog_close(MailModifyLog *log)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
192 {
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
193 if (log->anon_mmap) {
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
194 if (munmap_anon(log->mmap_base, log->mmap_full_length) < 0)
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
195 modifylog_set_syscall_error(log, "munmap_anon()");
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
196 } else if (log->mmap_base != NULL) {
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
197 if (munmap(log->mmap_base, log->mmap_full_length) < 0)
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
198 modifylog_set_syscall_error(log, "munmap()");
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199 }
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
200 log->mmap_base = NULL;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202 if (log->fd != -1) {
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
203 if (close(log->fd) < 0)
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
204 modifylog_set_syscall_error(log, "close()");
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205 log->fd = -1;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208 i_free(log->filepath);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
211 static void mail_modifylog_init_header(MailModifyLog *log, ModifyLogHeader *hdr)
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
212 {
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
213 memset(hdr, 0, sizeof(ModifyLogHeader));
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
214 hdr->indexid = log->index->indexid;
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
215 hdr->used_file_size = sizeof(ModifyLogHeader);
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
216 }
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
217
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218 static int mail_modifylog_init_fd(MailModifyLog *log, int fd,
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
219 const char *path)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
220 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221 ModifyLogHeader hdr;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
223 mail_modifylog_init_header(log, &hdr);
29
e9375147c0cb Added write_full() which is a simple wrapper around write() meant for
Timo Sirainen <tss@iki.fi>
parents: 5
diff changeset
224 if (write_full(fd, &hdr, sizeof(hdr)) < 0) {
237
06d6eca0a45f Fixes for no diskspace handling. seems to work now.
Timo Sirainen <tss@iki.fi>
parents: 234
diff changeset
225 if (errno == ENOSPC)
06d6eca0a45f Fixes for no diskspace handling. seems to work now.
Timo Sirainen <tss@iki.fi>
parents: 234
diff changeset
226 log->index->nodiskspace = TRUE;
06d6eca0a45f Fixes for no diskspace handling. seems to work now.
Timo Sirainen <tss@iki.fi>
parents: 234
diff changeset
227
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
228 index_file_set_syscall_error(log->index, path, "write_full()");
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
230 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
231
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
232 if (file_set_size(fd, MODIFY_LOG_INITIAL_SIZE) < 0) {
237
06d6eca0a45f Fixes for no diskspace handling. seems to work now.
Timo Sirainen <tss@iki.fi>
parents: 234
diff changeset
233 if (errno == ENOSPC)
06d6eca0a45f Fixes for no diskspace handling. seems to work now.
Timo Sirainen <tss@iki.fi>
parents: 234
diff changeset
234 log->index->nodiskspace = TRUE;
06d6eca0a45f Fixes for no diskspace handling. seems to work now.
Timo Sirainen <tss@iki.fi>
parents: 234
diff changeset
235
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
236 index_file_set_syscall_error(log->index, path,
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
237 "file_set_size()");
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
238 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241 return TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243
231
bbd248788571 we shouldn't crash anymore when modify log gets full
Timo Sirainen <tss@iki.fi>
parents: 223
diff changeset
244 static int modifylog_mark_full(MailModifyLog *log)
bbd248788571 we shouldn't crash anymore when modify log gets full
Timo Sirainen <tss@iki.fi>
parents: 223
diff changeset
245 {
bbd248788571 we shouldn't crash anymore when modify log gets full
Timo Sirainen <tss@iki.fi>
parents: 223
diff changeset
246 log->header->sync_id = SYNC_ID_FULL;
bbd248788571 we shouldn't crash anymore when modify log gets full
Timo Sirainen <tss@iki.fi>
parents: 223
diff changeset
247
bbd248788571 we shouldn't crash anymore when modify log gets full
Timo Sirainen <tss@iki.fi>
parents: 223
diff changeset
248 if (msync(log->mmap_base, sizeof(ModifyLogHeader), MS_SYNC) < 0)
bbd248788571 we shouldn't crash anymore when modify log gets full
Timo Sirainen <tss@iki.fi>
parents: 223
diff changeset
249 return modifylog_set_syscall_error(log, "msync()");
bbd248788571 we shouldn't crash anymore when modify log gets full
Timo Sirainen <tss@iki.fi>
parents: 223
diff changeset
250
bbd248788571 we shouldn't crash anymore when modify log gets full
Timo Sirainen <tss@iki.fi>
parents: 223
diff changeset
251 return TRUE;
bbd248788571 we shouldn't crash anymore when modify log gets full
Timo Sirainen <tss@iki.fi>
parents: 223
diff changeset
252 }
bbd248788571 we shouldn't crash anymore when modify log gets full
Timo Sirainen <tss@iki.fi>
parents: 223
diff changeset
253
bbd248788571 we shouldn't crash anymore when modify log gets full
Timo Sirainen <tss@iki.fi>
parents: 223
diff changeset
254 static int modifylog_open_and_init_file(MailModifyLog *log, const char *path)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
255 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
256 int fd, ret;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
257
237
06d6eca0a45f Fixes for no diskspace handling. seems to work now.
Timo Sirainen <tss@iki.fi>
parents: 234
diff changeset
258 if (log->index->nodiskspace)
06d6eca0a45f Fixes for no diskspace handling. seems to work now.
Timo Sirainen <tss@iki.fi>
parents: 234
diff changeset
259 return FALSE;
06d6eca0a45f Fixes for no diskspace handling. seems to work now.
Timo Sirainen <tss@iki.fi>
parents: 234
diff changeset
260
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
261 fd = open(path, O_RDWR | O_CREAT, 0660);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
262 if (fd == -1) {
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
263 if (errno == ENOSPC)
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
264 log->index->nodiskspace = TRUE;
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
265
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
266 return index_file_set_syscall_error(log->index, path, "open()");
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
267 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268
257
90abe1af4c72 fixed some locking issues
Timo Sirainen <tss@iki.fi>
parents: 240
diff changeset
269 /* if we can't get the lock, we fail. it shouldn't happen. */
90abe1af4c72 fixed some locking issues
Timo Sirainen <tss@iki.fi>
parents: 240
diff changeset
270 ret = file_try_lock(fd, F_WRLCK);
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
271 if (ret < 0) {
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
272 index_file_set_syscall_error(log->index, path,
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
273 "file_wait_lock()");
257
90abe1af4c72 fixed some locking issues
Timo Sirainen <tss@iki.fi>
parents: 240
diff changeset
274 } else if (ret == 0) {
90abe1af4c72 fixed some locking issues
Timo Sirainen <tss@iki.fi>
parents: 240
diff changeset
275 index_set_error(log->index, "Couldn't get exclusive lock for "
90abe1af4c72 fixed some locking issues
Timo Sirainen <tss@iki.fi>
parents: 240
diff changeset
276 "created modify log %s", path);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
277 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
278
257
90abe1af4c72 fixed some locking issues
Timo Sirainen <tss@iki.fi>
parents: 240
diff changeset
279 if (ret > 0 && mail_modifylog_init_fd(log, fd, path)) {
90abe1af4c72 fixed some locking issues
Timo Sirainen <tss@iki.fi>
parents: 240
diff changeset
280 /* drop back to read lock */
90abe1af4c72 fixed some locking issues
Timo Sirainen <tss@iki.fi>
parents: 240
diff changeset
281 if (file_wait_lock(fd, F_RDLCK) < 0) {
90abe1af4c72 fixed some locking issues
Timo Sirainen <tss@iki.fi>
parents: 240
diff changeset
282 modifylog_set_syscall_error(log, "file_wait_lock()");
90abe1af4c72 fixed some locking issues
Timo Sirainen <tss@iki.fi>
parents: 240
diff changeset
283 ret = -1;
90abe1af4c72 fixed some locking issues
Timo Sirainen <tss@iki.fi>
parents: 240
diff changeset
284 }
90abe1af4c72 fixed some locking issues
Timo Sirainen <tss@iki.fi>
parents: 240
diff changeset
285
259
cdf38b5cc2b7 still wrong..
Timo Sirainen <tss@iki.fi>
parents: 258
diff changeset
286 if (ret > 0 && (log->header == NULL ||
cdf38b5cc2b7 still wrong..
Timo Sirainen <tss@iki.fi>
parents: 258
diff changeset
287 modifylog_mark_full(log))) {
231
bbd248788571 we shouldn't crash anymore when modify log gets full
Timo Sirainen <tss@iki.fi>
parents: 223
diff changeset
288 mail_modifylog_close(log);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
289
231
bbd248788571 we shouldn't crash anymore when modify log gets full
Timo Sirainen <tss@iki.fi>
parents: 223
diff changeset
290 log->fd = fd;
bbd248788571 we shouldn't crash anymore when modify log gets full
Timo Sirainen <tss@iki.fi>
parents: 223
diff changeset
291 log->filepath = i_strdup(path);
bbd248788571 we shouldn't crash anymore when modify log gets full
Timo Sirainen <tss@iki.fi>
parents: 223
diff changeset
292 return TRUE;
bbd248788571 we shouldn't crash anymore when modify log gets full
Timo Sirainen <tss@iki.fi>
parents: 223
diff changeset
293 }
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
294 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
295
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
296 if (close(fd) < 0)
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
297 index_file_set_syscall_error(log->index, path, "close()");
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
298 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
299 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
300
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
301 int mail_modifylog_create(MailIndex *index)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
302 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
303 MailModifyLog *log;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
304 const char *path;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
305
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
306 i_assert(index->lock_type == MAIL_LOCK_EXCLUSIVE);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
307
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
308 log = mail_modifylog_new(index);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
309
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
310 if (index->nodiskspace) {
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
311 log->mmap_full_length = MODIFY_LOG_INITIAL_SIZE;
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
312 log->mmap_base = mmap_anon(log->mmap_full_length);
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
313
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
314 mail_modifylog_init_header(log, log->mmap_base);
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
315 log->header = log->mmap_base;
237
06d6eca0a45f Fixes for no diskspace handling. seems to work now.
Timo Sirainen <tss@iki.fi>
parents: 234
diff changeset
316 log->mmap_used_length = log->header->used_file_size;
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
317
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
318 log->anon_mmap = TRUE;
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
319 log->filepath = i_strdup("(in-memory modify log)");
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
320 } else {
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
321 path = t_strconcat(log->index->filepath, ".log", NULL);
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
322
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
323 if (!modifylog_open_and_init_file(log, path) ||
240
Timo Sirainen <tss@iki.fi>
parents: 237
diff changeset
324 !mmap_update(log, TRUE)) {
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
325 /* fatal failure */
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
326 mail_modifylog_free(log);
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
327 return FALSE;
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
328 }
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
329 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
330
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
331 log->synced_id = log->header->sync_id;
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
332 log->synced_position = log->mmap_used_length;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
333 return TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
334 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
335
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
336 /* Returns 1 = ok, 0 = full, -1 = error */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
337 static int mail_modifylog_open_and_verify(MailModifyLog *log, const char *path)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
338 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
339 ModifyLogHeader hdr;
237
06d6eca0a45f Fixes for no diskspace handling. seems to work now.
Timo Sirainen <tss@iki.fi>
parents: 234
diff changeset
340 ssize_t ret;
06d6eca0a45f Fixes for no diskspace handling. seems to work now.
Timo Sirainen <tss@iki.fi>
parents: 234
diff changeset
341 int fd;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
342
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
343 fd = open(path, O_RDWR);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
344 if (fd == -1) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
345 if (errno != ENOENT) {
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
346 index_file_set_syscall_error(log->index, path,
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
347 "open()");
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
348 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
349 return -1;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
350 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
351
257
90abe1af4c72 fixed some locking issues
Timo Sirainen <tss@iki.fi>
parents: 240
diff changeset
352 if (file_wait_lock(fd, F_RDLCK) < 0) {
90abe1af4c72 fixed some locking issues
Timo Sirainen <tss@iki.fi>
parents: 240
diff changeset
353 modifylog_set_syscall_error(log, "file_wait_lock()");
90abe1af4c72 fixed some locking issues
Timo Sirainen <tss@iki.fi>
parents: 240
diff changeset
354 (void)close(fd);
90abe1af4c72 fixed some locking issues
Timo Sirainen <tss@iki.fi>
parents: 240
diff changeset
355 return -1;
90abe1af4c72 fixed some locking issues
Timo Sirainen <tss@iki.fi>
parents: 240
diff changeset
356 }
90abe1af4c72 fixed some locking issues
Timo Sirainen <tss@iki.fi>
parents: 240
diff changeset
357
237
06d6eca0a45f Fixes for no diskspace handling. seems to work now.
Timo Sirainen <tss@iki.fi>
parents: 234
diff changeset
358 ret = read(fd, &hdr, sizeof(hdr));
06d6eca0a45f Fixes for no diskspace handling. seems to work now.
Timo Sirainen <tss@iki.fi>
parents: 234
diff changeset
359 if (ret < 0)
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
360 index_file_set_syscall_error(log->index, path, "read()");
237
06d6eca0a45f Fixes for no diskspace handling. seems to work now.
Timo Sirainen <tss@iki.fi>
parents: 234
diff changeset
361 else if (ret != sizeof(hdr)) {
06d6eca0a45f Fixes for no diskspace handling. seems to work now.
Timo Sirainen <tss@iki.fi>
parents: 234
diff changeset
362 index_set_error(log->index, "Corrupted modify log %s ", path);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
363 ret = -1;
237
06d6eca0a45f Fixes for no diskspace handling. seems to work now.
Timo Sirainen <tss@iki.fi>
parents: 234
diff changeset
364
06d6eca0a45f Fixes for no diskspace handling. seems to work now.
Timo Sirainen <tss@iki.fi>
parents: 234
diff changeset
365 (void)unlink(path);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
366 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
367
258
0a45c4744f51 modifylog opening was buggy
Timo Sirainen <tss@iki.fi>
parents: 257
diff changeset
368 if (ret > 0 && hdr.indexid != log->index->indexid) {
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
369 index_set_error(log->index, "IndexID mismatch for modify log "
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
370 "file %s", path);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
371 ret = -1;
115
91e5141f994c fixes for modifylog opening
Timo Sirainen <tss@iki.fi>
parents: 90
diff changeset
372
91e5141f994c fixes for modifylog opening
Timo Sirainen <tss@iki.fi>
parents: 90
diff changeset
373 /* we have to rebuild it, make sure it's deleted. */
91e5141f994c fixes for modifylog opening
Timo Sirainen <tss@iki.fi>
parents: 90
diff changeset
374 (void)unlink(path);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
375 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
376
258
0a45c4744f51 modifylog opening was buggy
Timo Sirainen <tss@iki.fi>
parents: 257
diff changeset
377 if (ret > 0 && hdr.sync_id == SYNC_ID_FULL) {
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
378 /* full */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
379 ret = 0;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
380 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
381
258
0a45c4744f51 modifylog opening was buggy
Timo Sirainen <tss@iki.fi>
parents: 257
diff changeset
382 if (ret > 0) {
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
383 log->fd = fd;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
384 log->filepath = i_strdup(path);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
385 } else {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
386 (void)close(fd);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
387 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
388
259
cdf38b5cc2b7 still wrong..
Timo Sirainen <tss@iki.fi>
parents: 258
diff changeset
389 return ret > 0;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
390 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
391
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
392 static int mail_modifylog_find_or_create(MailModifyLog *log)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
393 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
394 const char *path1, *path2;
115
91e5141f994c fixes for modifylog opening
Timo Sirainen <tss@iki.fi>
parents: 90
diff changeset
395 int i, ret;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
396
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
397 for (i = 0; i < 2; i++) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
398 /* first try <index>.log */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
399 path1 = t_strconcat(log->index->filepath, ".log", NULL);
115
91e5141f994c fixes for modifylog opening
Timo Sirainen <tss@iki.fi>
parents: 90
diff changeset
400 path2 = t_strconcat(log->index->filepath, ".log.2", NULL);
91e5141f994c fixes for modifylog opening
Timo Sirainen <tss@iki.fi>
parents: 90
diff changeset
401
91e5141f994c fixes for modifylog opening
Timo Sirainen <tss@iki.fi>
parents: 90
diff changeset
402 ret = mail_modifylog_open_and_verify(log, path1);
91e5141f994c fixes for modifylog opening
Timo Sirainen <tss@iki.fi>
parents: 90
diff changeset
403 if (ret == 1)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
404 return TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
405
115
91e5141f994c fixes for modifylog opening
Timo Sirainen <tss@iki.fi>
parents: 90
diff changeset
406 if (ret == 0) {
91e5141f994c fixes for modifylog opening
Timo Sirainen <tss@iki.fi>
parents: 90
diff changeset
407 /* then <index>.log.2 */
91e5141f994c fixes for modifylog opening
Timo Sirainen <tss@iki.fi>
parents: 90
diff changeset
408 if (mail_modifylog_open_and_verify(log, path2) == 1)
91e5141f994c fixes for modifylog opening
Timo Sirainen <tss@iki.fi>
parents: 90
diff changeset
409 return TRUE;
91e5141f994c fixes for modifylog opening
Timo Sirainen <tss@iki.fi>
parents: 90
diff changeset
410 }
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
411
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
412 /* try creating/reusing them */
231
bbd248788571 we shouldn't crash anymore when modify log gets full
Timo Sirainen <tss@iki.fi>
parents: 223
diff changeset
413 if (modifylog_open_and_init_file(log, path1))
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
414 return TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
415
231
bbd248788571 we shouldn't crash anymore when modify log gets full
Timo Sirainen <tss@iki.fi>
parents: 223
diff changeset
416 if (modifylog_open_and_init_file(log, path2))
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
417 return TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
418
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
419 /* maybe the file was just switched, check the logs again */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
420 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
421
237
06d6eca0a45f Fixes for no diskspace handling. seems to work now.
Timo Sirainen <tss@iki.fi>
parents: 234
diff changeset
422 if (!log->index->nodiskspace) {
06d6eca0a45f Fixes for no diskspace handling. seems to work now.
Timo Sirainen <tss@iki.fi>
parents: 234
diff changeset
423 index_set_error(log->index, "We could neither use nor create "
06d6eca0a45f Fixes for no diskspace handling. seems to work now.
Timo Sirainen <tss@iki.fi>
parents: 234
diff changeset
424 "the modify log for index %s",
06d6eca0a45f Fixes for no diskspace handling. seems to work now.
Timo Sirainen <tss@iki.fi>
parents: 234
diff changeset
425 log->index->filepath);
06d6eca0a45f Fixes for no diskspace handling. seems to work now.
Timo Sirainen <tss@iki.fi>
parents: 234
diff changeset
426 }
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
427 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
428 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
429
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
430 int mail_modifylog_open_or_create(MailIndex *index)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
431 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
432 MailModifyLog *log;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
433
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
434 log = mail_modifylog_new(index);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
435
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
436 if (!mail_modifylog_find_or_create(log) ||
240
Timo Sirainen <tss@iki.fi>
parents: 237
diff changeset
437 !mmap_update(log, TRUE)) {
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
438 /* fatal failure */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
439 mail_modifylog_free(log);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
440 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
441 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
442
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
443 log->synced_id = log->header->sync_id;
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
444 log->synced_position = log->mmap_used_length;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
445 return TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
446 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
447
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
448 void mail_modifylog_free(MailModifyLog *log)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
449 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
450 log->index->modifylog = NULL;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
451
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
452 mail_modifylog_close(log);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
453 i_free(log);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
454 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
455
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
456 int mail_modifylog_sync_file(MailModifyLog *log)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
457 {
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
458 if (!log->modified || log->anon_mmap)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
459 return TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
460
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
461 if (log->mmap_base != NULL) {
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
462 if (msync(log->mmap_base, log->mmap_used_length, MS_SYNC) < 0)
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
463 return modifylog_set_syscall_error(log, "msync()");
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
464 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
465
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
466 if (fsync(log->fd) < 0)
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
467 return modifylog_set_syscall_error(log, "fsync()");
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
468
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
469 log->modified = FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
470 return TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
471 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
472
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
473 static int mail_modifylog_grow(MailModifyLog *log)
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
474 {
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
475 uoff_t new_fsize;
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
476 void *base;
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
477
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
478 new_fsize = (uoff_t)log->mmap_full_length + MODIFYLOG_GROW_SIZE;
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
479 i_assert(new_fsize < OFF_T_MAX);
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
480
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
481 if (log->anon_mmap) {
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
482 i_assert(new_fsize < SSIZE_T_MAX);
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
483
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
484 base = mremap_anon(log->mmap_base, log->mmap_full_length,
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
485 (size_t)new_fsize, MREMAP_MAYMOVE);
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
486 if (base == MAP_FAILED) {
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
487 modifylog_set_syscall_error(log, "mremap_anon()");
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
488 return FALSE;
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
489 }
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
490
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
491 log->mmap_base = base;
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
492 log->mmap_full_length = (size_t)new_fsize;
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
493 return TRUE;
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
494 }
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
495
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
496 if (file_set_size(log->fd, (off_t)new_fsize) < 0) {
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
497 if (errno == ENOSPC)
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
498 log->index->nodiskspace = TRUE;
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
499 return modifylog_set_syscall_error(log, "file_set_size()");
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
500 }
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
501
240
Timo Sirainen <tss@iki.fi>
parents: 237
diff changeset
502 if (!mmap_update(log, TRUE))
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
503 return FALSE;
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
504
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
505 return TRUE;
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
506 }
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
507
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
508 static int mail_modifylog_append(MailModifyLog *log, ModifyLogRecord *rec,
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
509 int external_change)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
510 {
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
511 ModifyLogRecord *destrec;
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
512
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
513 i_assert(log->index->lock_type == MAIL_LOCK_EXCLUSIVE);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
514 i_assert(rec->seq != 0);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
515 i_assert(rec->uid != 0);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
516
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
517 if (!external_change) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
518 switch (mail_modifylog_have_other_users(log)) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
519 case 0:
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
520 /* we're the only one having this log open,
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
521 no need for modify log. */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
522 return TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
523 case -1:
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
524 return FALSE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
525 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
526 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
527
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
528 if (log->mmap_used_length == log->mmap_full_length) {
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
529 if (!mail_modifylog_grow(log))
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
530 return FALSE;
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
531 }
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
532
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
533 i_assert(log->header->used_file_size == log->mmap_used_length);
240
Timo Sirainen <tss@iki.fi>
parents: 237
diff changeset
534 i_assert(log->mmap_used_length + sizeof(ModifyLogRecord) <=
Timo Sirainen <tss@iki.fi>
parents: 237
diff changeset
535 log->mmap_full_length);
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
536
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
537 destrec = (ModifyLogRecord *) ((char *) log->mmap_base +
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
538 log->mmap_used_length);
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
539 memcpy(destrec, rec, sizeof(ModifyLogRecord));
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
540
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
541 if (!external_change && log->header->sync_id == log->synced_id) {
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
542 log->synced_position += sizeof(ModifyLogRecord);
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
543 log->synced_id++;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
544 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
545
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
546 log->header->used_file_size += sizeof(ModifyLogRecord);
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
547 log->mmap_used_length += sizeof(ModifyLogRecord);
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
548
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
549 log->header->sync_id++;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
550 log->modified = TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
551
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
552 return TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
553 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
554
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
555 int mail_modifylog_add_expunge(MailModifyLog *log, unsigned int seq,
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
556 unsigned int uid, int external_change)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
557 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
558 ModifyLogRecord rec;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
559
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
560 /* expunges must not be added when log isn't synced */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
561 i_assert(external_change || log->synced_id == log->header->sync_id);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
562
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
563 rec.type = RECORD_TYPE_EXPUNGE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
564 rec.seq = seq;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
565 rec.uid = uid;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
566 return mail_modifylog_append(log, &rec, external_change);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
567 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
568
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
569 int mail_modifylog_add_flags(MailModifyLog *log, unsigned int seq,
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
570 unsigned int uid, int external_change)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
571 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
572 ModifyLogRecord rec;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
573
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
574 rec.type = RECORD_TYPE_FLAGS_CHANGED;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
575 rec.seq = seq;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
576 rec.uid = uid;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
577 return mail_modifylog_append(log, &rec, external_change);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
578 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
579
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
580 ModifyLogRecord *mail_modifylog_get_nonsynced(MailModifyLog *log,
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
581 unsigned int *count)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
582 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
583 ModifyLogRecord *rec, *end_rec;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
584
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
585 i_assert(log->index->lock_type != MAIL_LOCK_UNLOCK);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
586
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
587 *count = 0;
240
Timo Sirainen <tss@iki.fi>
parents: 237
diff changeset
588 if (!mmap_update(log, FALSE))
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
589 return NULL;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
590
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
591 i_assert(log->synced_position <= log->mmap_used_length);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
592 i_assert(log->synced_position >= sizeof(ModifyLogHeader));
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
593
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
594 rec = (ModifyLogRecord *) ((char *) log->mmap_base +
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
595 log->synced_position);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
596 end_rec = (ModifyLogRecord *) ((char *) log->mmap_base +
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
597 log->mmap_used_length);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
598 *count = (unsigned int) (end_rec - rec);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
599 return rec;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
600 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
601
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
602 static int mail_modifylog_switch_file(MailModifyLog *log)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
603 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
604 MailIndex *index = log->index;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
605
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
606 mail_modifylog_free(log);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
607 return mail_modifylog_open_or_create(index);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
608 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
609
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
610 static void mail_modifylog_try_switch_file(MailModifyLog *log)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
611 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
612 const char *path;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
613
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
614 path = t_strconcat(log->index->filepath,
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
615 log->second_log ? ".log" : ".log.2", NULL);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
616
231
bbd248788571 we shouldn't crash anymore when modify log gets full
Timo Sirainen <tss@iki.fi>
parents: 223
diff changeset
617 (void)modifylog_open_and_init_file(log, path);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
618 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
619
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
620 int mail_modifylog_mark_synced(MailModifyLog *log)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
621 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
622 i_assert(log->index->lock_type != MAIL_LOCK_UNLOCK);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
623
240
Timo Sirainen <tss@iki.fi>
parents: 237
diff changeset
624 if (!mmap_update(log, FALSE))
90
ccb155c2c93f mail_modifylog_mark_synced() didn't update mmap
Timo Sirainen <tss@iki.fi>
parents: 50
diff changeset
625 return FALSE;
ccb155c2c93f mail_modifylog_mark_synced() didn't update mmap
Timo Sirainen <tss@iki.fi>
parents: 50
diff changeset
626
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
627 if (log->header->sync_id == SYNC_ID_FULL) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
628 /* log file is full, switch to next one */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
629 return mail_modifylog_switch_file(log);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
630 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
631
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
632 if (log->synced_id == log->header->sync_id) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
633 /* we are already synced */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
634 return TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
635 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
636
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
637 log->synced_id = log->header->sync_id;
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
638 log->synced_position = log->mmap_used_length;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
639
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
640 log->modified = TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
641
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
642 if (log->mmap_used_length > MAX_MODIFYLOG_SIZE) {
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
643 /* if the other file isn't locked, switch to it */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
644 mail_modifylog_try_switch_file(log);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
645 return TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
646 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
647
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
648 return TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
649 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
650
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
651 static int compare_uint(const void *p1, const void *p2)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
652 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
653 const unsigned int *u1 = p1;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
654 const unsigned int *u2 = p2;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
655
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
656 return *u1 < *u2 ? -1 : *u1 > *u2 ? 1 : 0;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
657 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
658
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
659 const unsigned int *
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
660 mail_modifylog_seq_get_expunges(MailModifyLog *log,
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
661 unsigned int first_seq,
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
662 unsigned int last_seq,
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
663 unsigned int *expunges_before)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
664 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
665 ModifyLogRecord *rec, *end_rec;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
666 unsigned int last_pos_seq, before, max_records, *arr, *expunges;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
667
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
668 i_assert(log->index->lock_type != MAIL_LOCK_UNLOCK);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
669
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
670 *expunges_before = 0;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
671
240
Timo Sirainen <tss@iki.fi>
parents: 237
diff changeset
672 if (!mmap_update(log, FALSE))
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
673 return NULL;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
674
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
675 /* find the first expunged message that affects our range */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
676 rec = (ModifyLogRecord *) ((char *) log->mmap_base +
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
677 log->synced_position);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
678 end_rec = (ModifyLogRecord *) ((char *) log->mmap_base +
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
679 log->mmap_used_length);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
680
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
681 while (rec < end_rec) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
682 if (rec->type == RECORD_TYPE_EXPUNGE && rec->seq <= last_seq)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
683 break;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
684 rec++;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
685 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
686
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
687 if (rec >= end_rec) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
688 /* none found */
222
cf4d065f2f85 lots of cleanups. also index/datafile is now capable of staying in memory,
Timo Sirainen <tss@iki.fi>
parents: 221
diff changeset
689 return no_expunges;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
690 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
691
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
692 /* allocate memory for the returned array. the file size - synced
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
693 position should be quite near the amount of memory we need, unless
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
694 there's lots of FLAGS_CHANGED records which is why there's the
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
695 second check to make sure it's not unneededly large. */
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
696 max_records = (log->mmap_used_length -
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
697 MODIFYLOG_FILE_POSITION(log, rec)) /
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
698 sizeof(ModifyLogRecord);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
699 if (max_records > last_seq - first_seq + 1)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
700 max_records = last_seq - first_seq + 1;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
701
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
702 expunges = arr = t_malloc((max_records+1) * sizeof(unsigned int));
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
703
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
704 /* last_pos_seq is updated all the time to contain the last_seq
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
705 comparable to current record's seq. number */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
706 last_pos_seq = last_seq;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
707
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
708 before = 0;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
709 for (; rec < end_rec; rec++) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
710 if (rec->type != RECORD_TYPE_EXPUNGE)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
711 continue;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
712
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
713 if (rec->seq + before < first_seq) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
714 /* before our range */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
715 before++;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
716 last_pos_seq--;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
717 } else if (rec->seq <= last_pos_seq) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
718 /* within our range */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
719 last_pos_seq--;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
720
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
721 if (max_records-- == 0) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
722 /* log contains more data than it should
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
723 have - must be corrupted. */
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
724 modifylog_set_corrupted(log,
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
725 "Contains more data than expected");
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
726 return NULL;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
727 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
728
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
729 *arr++ = rec->uid;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
730 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
731 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
732 *arr = 0;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
733
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
734 /* sort the UID array, not including the terminating 0 */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
735 qsort(expunges, (unsigned int) (arr - expunges), sizeof(unsigned int),
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
736 compare_uint);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
737
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
738 *expunges_before = before;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
739 return expunges;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
740 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
741
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
742 const unsigned int *
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
743 mail_modifylog_uid_get_expunges(MailModifyLog *log,
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
744 unsigned int first_uid,
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
745 unsigned int last_uid)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
746 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
747 /* pretty much copy&pasted from sequence code above ..
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
748 kind of annoying */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
749 ModifyLogRecord *rec, *end_rec;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
750 unsigned int before, max_records, *arr, *expunges;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
751
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
752 i_assert(log->index->lock_type != MAIL_LOCK_UNLOCK);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
753
240
Timo Sirainen <tss@iki.fi>
parents: 237
diff changeset
754 if (!mmap_update(log, FALSE))
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
755 return NULL;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
756
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
757 /* find the first expunged message that affects our range */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
758 rec = (ModifyLogRecord *) ((char *) log->mmap_base +
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
759 log->synced_position);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
760 end_rec = (ModifyLogRecord *) ((char *) log->mmap_base +
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
761 log->mmap_used_length);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
762
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
763 while (rec < end_rec) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
764 if (rec->type == RECORD_TYPE_EXPUNGE && rec->uid <= last_uid)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
765 break;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
766 rec++;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
767 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
768
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
769 if (rec >= end_rec) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
770 /* none found */
222
cf4d065f2f85 lots of cleanups. also index/datafile is now capable of staying in memory,
Timo Sirainen <tss@iki.fi>
parents: 221
diff changeset
771 return no_expunges;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
772 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
773
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
774 /* allocate memory for the returned array. the file size - synced
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
775 position should be quite near the amount of memory we need, unless
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
776 there's lots of FLAGS_CHANGED records which is why there's the
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
777 second check to make sure it's not unneededly large. */
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
778 max_records = (log->mmap_used_length -
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
779 MODIFYLOG_FILE_POSITION(log, rec)) /
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
780 sizeof(ModifyLogRecord);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
781 if (max_records > last_uid - first_uid + 1)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
782 max_records = last_uid - first_uid + 1;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
783
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
784 expunges = arr = t_malloc((max_records+1) * sizeof(unsigned int));
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
785
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
786 before = 0;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
787 while (rec < end_rec) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
788 if (rec->type == RECORD_TYPE_EXPUNGE &&
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
789 rec->uid >= first_uid && rec->uid <= last_uid) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
790 /* within our range */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
791 if (max_records-- == 0) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
792 /* log contains more data than it should
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
793 have - must be corrupted. */
234
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
794 modifylog_set_corrupted(log,
aef7c7a8f691 Modify log is now able to stay in memory. Some other fixes/cleanups.
Timo Sirainen <tss@iki.fi>
parents: 231
diff changeset
795 "Contains more data than expected");
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
796 return NULL;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
797 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
798 *arr++ = rec->uid;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
799 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
800 rec++;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
801 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
802 *arr = 0;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
803
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
804 /* sort the UID array, not including the terminating 0 */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
805 qsort(expunges, (unsigned int) (arr - expunges), sizeof(unsigned int),
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
806 compare_uint);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
807
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
808 return expunges;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
809 }