annotate src/lib-storage/index/dbox/dbox-uidlist.c @ 4233:dd22380b0fc0 HEAD

Fixes
author Timo Sirainen <tss@iki.fi>
date Thu, 27 Apr 2006 15:44:19 +0300
parents 81ec8a2fbea9
children be915546ce49
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1 /* Copyright (C) 2005 Timo Sirainen */
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "hex-dec.h"
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "array.h"
3758
Timo Sirainen <tss@iki.fi>
parents: 3756
diff changeset
6 #include "bsearch-insert-pos.h"
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "seq-range-array.h"
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "str.h"
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "istream.h"
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include "ostream.h"
3858
2e5c34fe9634 Small (compiling) fixes
Timo Sirainen <tss@iki.fi>
parents: 3846
diff changeset
11 #include "ostream-crlf.h"
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #include "write-full.h"
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include "dbox-file.h"
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 #include "dbox-storage.h"
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 #include "dbox-uidlist.h"
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 #include <stddef.h>
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 #include <stdio.h>
3758
Timo Sirainen <tss@iki.fi>
parents: 3756
diff changeset
19 #include <stdlib.h>
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 #include <fcntl.h>
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 #include <unistd.h>
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 #include <utime.h>
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 #include <sys/stat.h>
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 #define DBOX_APPEND_MAX_OPEN_FDS 64
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 #define DBOX_UIDLIST_VERSION 1
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 #define DBOX_UIDLIST_FILENAME "index"
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 struct dbox_save_file {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 struct dbox_file *file;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 dev_t dev;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 ino_t ino;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 struct dotlock *dotlock;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 array_t ARRAY_DEFINE(seqs, unsigned int);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 /* append offset for the first mail we've saved */
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 uoff_t append_offset;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 };
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 struct dbox_uidlist {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 struct dbox_mailbox *mbox;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 char *path;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 int fd;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 struct dotlock *dotlock;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 int lock_fd;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 unsigned int version;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 uint32_t uid_validity, last_uid, last_file_seq;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 ino_t ino;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 time_t mtime;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 uint32_t file_seq_highwater;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 pool_t entry_pool;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 array_t ARRAY_DEFINE(entries, struct dbox_uidlist_entry *);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 unsigned int appending:1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 unsigned int need_full_rewrite:1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 };
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 struct dbox_uidlist_append_ctx {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 pool_t pool;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 struct dbox_uidlist *uidlist;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
70 time_t min_usable_timestamp;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71 unsigned int mail_count;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 array_t ARRAY_DEFINE(files, struct dbox_save_file *);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 unsigned int open_fds;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 unsigned int locked:1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 };
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 struct dbox_uidlist_sync_ctx {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 struct dbox_uidlist *uidlist;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 unsigned int modified:1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 };
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 const struct dotlock_settings uidlist_dotlock_settings = {
3985
38c352bb7bb7 Dotlock fixes
Timo Sirainen <tss@iki.fi>
parents: 3957
diff changeset
85 MEMBER(temp_prefix) NULL,
38c352bb7bb7 Dotlock fixes
Timo Sirainen <tss@iki.fi>
parents: 3957
diff changeset
86 MEMBER(lock_suffix) NULL,
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87
3985
38c352bb7bb7 Dotlock fixes
Timo Sirainen <tss@iki.fi>
parents: 3957
diff changeset
88 MEMBER(timeout) 120,
38c352bb7bb7 Dotlock fixes
Timo Sirainen <tss@iki.fi>
parents: 3957
diff changeset
89 MEMBER(stale_timeout) 60,
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90
3985
38c352bb7bb7 Dotlock fixes
Timo Sirainen <tss@iki.fi>
parents: 3957
diff changeset
91 MEMBER(callback) NULL,
38c352bb7bb7 Dotlock fixes
Timo Sirainen <tss@iki.fi>
parents: 3957
diff changeset
92 MEMBER(context) NULL,
38c352bb7bb7 Dotlock fixes
Timo Sirainen <tss@iki.fi>
parents: 3957
diff changeset
93
38c352bb7bb7 Dotlock fixes
Timo Sirainen <tss@iki.fi>
parents: 3957
diff changeset
94 MEMBER(use_excl_lock) FALSE
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95 };
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97 const struct dotlock_settings dbox_file_dotlock_set = {
3985
38c352bb7bb7 Dotlock fixes
Timo Sirainen <tss@iki.fi>
parents: 3957
diff changeset
98 MEMBER(temp_prefix) NULL,
38c352bb7bb7 Dotlock fixes
Timo Sirainen <tss@iki.fi>
parents: 3957
diff changeset
99 MEMBER(lock_suffix) NULL,
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100
3985
38c352bb7bb7 Dotlock fixes
Timo Sirainen <tss@iki.fi>
parents: 3957
diff changeset
101 MEMBER(timeout) 120,
38c352bb7bb7 Dotlock fixes
Timo Sirainen <tss@iki.fi>
parents: 3957
diff changeset
102 MEMBER(stale_timeout) 60,
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103
3985
38c352bb7bb7 Dotlock fixes
Timo Sirainen <tss@iki.fi>
parents: 3957
diff changeset
104 MEMBER(callback) NULL,
38c352bb7bb7 Dotlock fixes
Timo Sirainen <tss@iki.fi>
parents: 3957
diff changeset
105 MEMBER(context) NULL,
38c352bb7bb7 Dotlock fixes
Timo Sirainen <tss@iki.fi>
parents: 3957
diff changeset
106
38c352bb7bb7 Dotlock fixes
Timo Sirainen <tss@iki.fi>
parents: 3957
diff changeset
107 MEMBER(use_excl_lock) FALSE
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
108 };
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
109
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110 struct dbox_uidlist *dbox_uidlist_init(struct dbox_mailbox *mbox)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112 struct dbox_uidlist *uidlist;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114 uidlist = i_new(struct dbox_uidlist, 1);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
115 uidlist->mbox = mbox;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116 uidlist->fd = -1;
3957
8f0ff62befd3 When appending, update sync_stamp in index so that dbox won't get a full
Timo Sirainen <tss@iki.fi>
parents: 3956
diff changeset
117 uidlist->mtime = -1;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
118 uidlist->lock_fd = -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
119 uidlist->entry_pool =
4056
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
120 pool_alloconly_create("uidlist entry pool", 1024*32);
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
121 uidlist->path =
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
122 i_strconcat(mbox->path, "/"DBOX_MAILDIR_NAME"/"
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
123 DBOX_UIDLIST_FILENAME, NULL);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124 ARRAY_CREATE(&uidlist->entries, default_pool,
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125 struct dbox_uidlist_entry *, 64);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126 return uidlist;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129 void dbox_uidlist_deinit(struct dbox_uidlist *uidlist)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
130 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
131 i_assert(!uidlist->appending);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
132
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133 array_free(&uidlist->entries);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134 pool_unref(uidlist->entry_pool);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
135 i_free(uidlist->path);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136 i_free(uidlist);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
137 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139 static int uidlist_merge(array_t *uid_list, const struct seq_range *seqs)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
141 ARRAY_SET_TYPE(uid_list, struct seq_range);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
142 struct seq_range *range;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143 unsigned int count;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
144
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 range = array_get_modifyable(uid_list, &count);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146 i_assert(count > 0);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
148 if (seqs->seq1 <= range[count-1].seq2)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
149 return FALSE;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
150
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
151 if (seqs->seq1-1 == range[count-1].seq2) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152 /* we can just continue the existing range */
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153 range[count-1].seq2 = seqs->seq2;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154 } else {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155 array_append(uid_list, seqs, 1);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157 return TRUE;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159
3756
5fcf8e16ba8c Use binary search for finding entries
Timo Sirainen <tss@iki.fi>
parents: 3755
diff changeset
160 static int dbox_uidlist_entry_cmp(const void *key, const void *p)
5fcf8e16ba8c Use binary search for finding entries
Timo Sirainen <tss@iki.fi>
parents: 3755
diff changeset
161 {
5fcf8e16ba8c Use binary search for finding entries
Timo Sirainen <tss@iki.fi>
parents: 3755
diff changeset
162 const unsigned int *file_seq = key;
3758
Timo Sirainen <tss@iki.fi>
parents: 3756
diff changeset
163 struct dbox_uidlist_entry *const *entry = p;
3756
5fcf8e16ba8c Use binary search for finding entries
Timo Sirainen <tss@iki.fi>
parents: 3755
diff changeset
164
3761
ef482c909771 When index files (dovecot.index and dbox index) aren't synced with each
Timo Sirainen <tss@iki.fi>
parents: 3758
diff changeset
165 return (int)*file_seq - (int)(*entry)->file_seq;
3756
5fcf8e16ba8c Use binary search for finding entries
Timo Sirainen <tss@iki.fi>
parents: 3755
diff changeset
166 }
5fcf8e16ba8c Use binary search for finding entries
Timo Sirainen <tss@iki.fi>
parents: 3755
diff changeset
167
4233
Timo Sirainen <tss@iki.fi>
parents: 4232
diff changeset
168 static void dbox_uidlist_update_last_uid(struct dbox_uidlist *uidlist,
Timo Sirainen <tss@iki.fi>
parents: 4232
diff changeset
169 const struct dbox_uidlist_entry *entry)
Timo Sirainen <tss@iki.fi>
parents: 4232
diff changeset
170 {
Timo Sirainen <tss@iki.fi>
parents: 4232
diff changeset
171 const struct seq_range *range;
Timo Sirainen <tss@iki.fi>
parents: 4232
diff changeset
172 unsigned int count;
Timo Sirainen <tss@iki.fi>
parents: 4232
diff changeset
173
Timo Sirainen <tss@iki.fi>
parents: 4232
diff changeset
174 range = array_get(&entry->uid_list, &count);
Timo Sirainen <tss@iki.fi>
parents: 4232
diff changeset
175 if (range[count-1].seq2 > uidlist->last_uid)
Timo Sirainen <tss@iki.fi>
parents: 4232
diff changeset
176 uidlist->last_uid = range[count-1].seq2;
Timo Sirainen <tss@iki.fi>
parents: 4232
diff changeset
177 }
Timo Sirainen <tss@iki.fi>
parents: 4232
diff changeset
178
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3859
diff changeset
179 static bool dbox_uidlist_add_entry(struct dbox_uidlist *uidlist,
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3859
diff changeset
180 const struct dbox_uidlist_entry *src_entry)
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
181 {
3756
5fcf8e16ba8c Use binary search for finding entries
Timo Sirainen <tss@iki.fi>
parents: 3755
diff changeset
182 struct dbox_uidlist_entry *dest_entry, **entries, **pos;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183 const struct seq_range *range;
4056
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
184 unsigned int i, idx, count;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
185
4233
Timo Sirainen <tss@iki.fi>
parents: 4232
diff changeset
186 dbox_uidlist_update_last_uid(uidlist, src_entry);
Timo Sirainen <tss@iki.fi>
parents: 4232
diff changeset
187
4056
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
188 entries = array_get_modifyable(&uidlist->entries, &count);
4226
83322a523c91 More fixes.
Timo Sirainen <tss@iki.fi>
parents: 4208
diff changeset
189 if (count == 0 || src_entry->file_seq > entries[count-1]->file_seq) {
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
190 /* append new file sequence */
4056
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
191 idx = count;
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
192 } else {
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
193 pos = bsearch_insert_pos(&src_entry->file_seq, entries, count,
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
194 sizeof(*entries),
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
195 dbox_uidlist_entry_cmp);
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
196 idx = pos - entries;
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
197 }
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
198
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
199 if (idx == count || entries[idx]->file_seq != src_entry->file_seq) {
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
200 /* new entry */
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201 dest_entry = p_new(uidlist->entry_pool,
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202 struct dbox_uidlist_entry, 1);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203 *dest_entry = *src_entry;
4226
83322a523c91 More fixes.
Timo Sirainen <tss@iki.fi>
parents: 4208
diff changeset
204 i_assert(idx < count || idx == 0 ||
83322a523c91 More fixes.
Timo Sirainen <tss@iki.fi>
parents: 4208
diff changeset
205 src_entry->file_seq > entries[idx-1]->file_seq);
83322a523c91 More fixes.
Timo Sirainen <tss@iki.fi>
parents: 4208
diff changeset
206 i_assert(idx == count ||
83322a523c91 More fixes.
Timo Sirainen <tss@iki.fi>
parents: 4208
diff changeset
207 src_entry->file_seq < entries[idx]->file_seq);
4056
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
208 array_insert(&uidlist->entries, idx, &dest_entry, 1);
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210 if (src_entry->file_seq > uidlist->last_file_seq)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
211 uidlist->last_file_seq = src_entry->file_seq;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
212 } else {
4056
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
213 /* merge to existing entry. UIDs must be growing since only
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
214 new mails are appended */
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
215 dest_entry = entries[idx];
3812
2881f7e79098 Added rotation by number of days since file was created.
Timo Sirainen <tss@iki.fi>
parents: 3761
diff changeset
216 if (src_entry->create_time > dest_entry->create_time)
2881f7e79098 Added rotation by number of days since file was created.
Timo Sirainen <tss@iki.fi>
parents: 3761
diff changeset
217 dest_entry->create_time = src_entry->create_time;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218 if (src_entry->file_size > dest_entry->file_size)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
219 dest_entry->file_size = src_entry->file_size;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
220
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221 range = array_get(&src_entry->uid_list, &count);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222 for (i = 0; i < count; i++) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
223 if (!uidlist_merge(&dest_entry->uid_list, &range[i])) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224 mail_storage_set_critical(
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
225 STORAGE(uidlist->mbox->storage),
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
226 "%s: UIDs not ordered (file_seq=%u)",
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227 uidlist->path, src_entry->file_seq);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228 return FALSE;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
230 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
231 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
232 return TRUE;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
234
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3859
diff changeset
235 static bool dbox_uidlist_next(struct dbox_uidlist *uidlist, const char *line)
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
236 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237 struct dbox_uidlist_entry *entry;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
238 struct seq_range range;
4208
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
239 const char *error = NULL;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240 uint32_t digit;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241 int ret;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243 /* <uid list> <file seq> [<last write timestamp> <file size>] */
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
244 t_push();
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
245 entry = t_new(struct dbox_uidlist_entry, 1);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
246 ARRAY_CREATE(&entry->uid_list, uidlist->entry_pool,
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
247 struct seq_range, 8);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
248
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
249 /* get uid list */
4056
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
250 range.seq1 = range.seq2 = 0;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
251 for (digit = 0; *line != '\0'; line++) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
252 if (*line >= '0' && *line <= '9')
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
253 digit = digit * 10 + *line-'0';
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
254 else {
4056
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
255 if (range.seq1 == 0) {
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
256 if (digit <= range.seq2) {
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
257 /* broken */
4208
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
258 error = t_strdup_printf("UID %u <= %u",
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
259 digit,
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
260 range.seq2);
4056
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
261 break;
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
262 }
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
263 range.seq1 = digit;
4056
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
264 }
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
265 if (*line == ',' || *line == ' ') {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
266 if (range.seq1 > digit) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
267 /* broken */
4208
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
268 error = t_strdup_printf("UID %u > %u",
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
269 range.seq1,
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
270 digit);
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
271 break;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
272 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
273 range.seq2 = digit;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
274 array_append(&entry->uid_list, &range, 1);
4056
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
275 range.seq1 = 0;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
276
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
277 if (digit > uidlist->last_uid) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
278 /* last_uid isn't up to date */
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
279 uidlist->last_uid = digit;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
280 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
281
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
282 if (*line == ' ')
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
283 break;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
284 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
285 digit = 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
286 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
287 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
288
4208
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
289 if (error == NULL) {
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
290 if (*line != ' ') {
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
291 error = *line == '\0' ? "File sequence missing" :
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
292 "Expecting space after UID list";
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
293 } else if (array_count(&entry->uid_list) == 0)
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
294 error = "UID list missing";
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
295 }
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
296
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
297 if (error != NULL) {
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
298 mail_storage_set_critical(STORAGE(uidlist->mbox->storage),
4208
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
299 "%s: Corrupted entry: %s", uidlist->path, error);
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
300 t_pop();
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
301 return FALSE;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
302 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
303
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
304 /* get file seq */
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
305 for (digit = 0, line++; *line >= '0' && *line <= '9'; line++)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
306 digit = digit * 10 + *line-'0';
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
307 entry->file_seq = digit;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
308
3812
2881f7e79098 Added rotation by number of days since file was created.
Timo Sirainen <tss@iki.fi>
parents: 3761
diff changeset
309 /* get create timestamp */
2881f7e79098 Added rotation by number of days since file was created.
Timo Sirainen <tss@iki.fi>
parents: 3761
diff changeset
310 line++;
2881f7e79098 Added rotation by number of days since file was created.
Timo Sirainen <tss@iki.fi>
parents: 3761
diff changeset
311 for (; *line >= '0' && *line <= '9'; line++)
2881f7e79098 Added rotation by number of days since file was created.
Timo Sirainen <tss@iki.fi>
parents: 3761
diff changeset
312 entry->create_time = entry->create_time * 10 + *line-'0';
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
313
3812
2881f7e79098 Added rotation by number of days since file was created.
Timo Sirainen <tss@iki.fi>
parents: 3761
diff changeset
314 if (*line != ' ') {
2881f7e79098 Added rotation by number of days since file was created.
Timo Sirainen <tss@iki.fi>
parents: 3761
diff changeset
315 mail_storage_set_critical(STORAGE(uidlist->mbox->storage),
4208
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
316 "%s: Corrupted entry: Expecting space after timestamp",
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
317 uidlist->path);
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
318
3812
2881f7e79098 Added rotation by number of days since file was created.
Timo Sirainen <tss@iki.fi>
parents: 3761
diff changeset
319 t_pop();
2881f7e79098 Added rotation by number of days since file was created.
Timo Sirainen <tss@iki.fi>
parents: 3761
diff changeset
320 return FALSE;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
321 }
3812
2881f7e79098 Added rotation by number of days since file was created.
Timo Sirainen <tss@iki.fi>
parents: 3761
diff changeset
322 /* get file size */
2881f7e79098 Added rotation by number of days since file was created.
Timo Sirainen <tss@iki.fi>
parents: 3761
diff changeset
323 for (; *line >= '0' && *line <= '9'; line++)
2881f7e79098 Added rotation by number of days since file was created.
Timo Sirainen <tss@iki.fi>
parents: 3761
diff changeset
324 entry->file_size = entry->file_size * 10 + *line-'0';
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
325
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
326 ret = dbox_uidlist_add_entry(uidlist, entry);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
327 t_pop();
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
328 return ret;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
329 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
330
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
331 static int dbox_uidlist_read(struct dbox_uidlist *uidlist)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
332 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
333 struct mail_storage *storage = STORAGE(uidlist->mbox->storage);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
334 const char *line;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
335 unsigned int uid_validity, last_uid, last_file_seq;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
336 struct istream *input;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
337 struct stat st;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
338 int ret;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
339
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
340 if (uidlist->fd != -1) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
341 if (stat(uidlist->path, &st) < 0) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
342 if (errno != ENOENT) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
343 mail_storage_set_critical(storage,
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
344 "stat(%s) failed: %m", uidlist->path);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
345 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
346 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
347 return 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
348 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
349
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
350 if (st.st_ino == uidlist->ino &&
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
351 st.st_mtime == uidlist->mtime) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
352 /* unchanged */
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
353 return 1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
354 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
355 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
356
3957
8f0ff62befd3 When appending, update sync_stamp in index so that dbox won't get a full
Timo Sirainen <tss@iki.fi>
parents: 3956
diff changeset
357 uidlist->mtime = -1;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
358 if (uidlist->fd != -1) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
359 if (close(uidlist->fd) < 0)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
360 i_error("close(%s) failed: %m", uidlist->path);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
361 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
362
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
363 uidlist->fd = open(uidlist->path, O_RDWR);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
364 if (uidlist->fd == -1) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
365 if (errno == ENOENT)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
366 return 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
367
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
368 mail_storage_set_critical(storage,
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
369 "open(%s) failed: %m", uidlist->path);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
370 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
371 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
372
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
373 if (fstat(uidlist->fd, &st) < 0) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
374 mail_storage_set_critical(storage,
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
375 "fstat(%s) failed: %m", uidlist->path);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
376 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
377 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
378 uidlist->ino = st.st_ino;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
379 uidlist->mtime = st.st_mtime;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
380
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
381 input = i_stream_create_file(uidlist->fd, default_pool, 65536, FALSE);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
382
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
383 /* read header: <version> <uidvalidity> <next-uid>.
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
384 Note that <next-uid> may be updated by UID lines, so it can't be
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
385 used directly. */
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
386 line = i_stream_read_next_line(input);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
387 if (line == NULL || sscanf(line, "%u %u %u %u", &uidlist->version,
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
388 &uid_validity, &last_uid,
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
389 &last_file_seq) != 4 ||
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
390 uidlist->version != DBOX_UIDLIST_VERSION) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
391 mail_storage_set_critical(storage,
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
392 "Corrupted header in file %s (version = %u)",
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
393 uidlist->path, uidlist->version);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
394 ret = 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
395 } else {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
396 uint32_t old_last_uid, old_last_file_seq;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
397
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
398 old_last_uid = uidlist->uid_validity == uid_validity ?
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
399 uidlist->last_uid : 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
400 old_last_file_seq = uidlist->uid_validity == uid_validity ?
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
401 uidlist->last_file_seq : 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
402
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
403 uidlist->uid_validity = uid_validity;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
404 uidlist->last_uid = last_uid;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
405 uidlist->last_file_seq = last_file_seq;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
406 p_clear(uidlist->entry_pool);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
407 array_clear(&uidlist->entries);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
408
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
409 ret = 1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
410 while ((line = i_stream_read_next_line(input)) != NULL) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
411 if (!dbox_uidlist_next(uidlist, line)) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
412 ret = 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
413 break;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
414 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
415 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
416
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
417 if (ret > 0 && uidlist->last_uid < old_last_uid) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
418 mail_storage_set_critical(storage,
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
419 "%s: last_uid was lowered (%u -> %u)",
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
420 uidlist->path, old_last_uid, uidlist->last_uid);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
421 ret = 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
422 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
423 if (ret > 0 && uidlist->last_file_seq < old_last_file_seq) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
424 mail_storage_set_critical(storage,
4232
81ec8a2fbea9 Error message fixes
Timo Sirainen <tss@iki.fi>
parents: 4228
diff changeset
425 "%s: last_file_seq was lowered (%u -> %u)",
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
426 uidlist->path, old_last_file_seq,
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
427 uidlist->last_file_seq);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
428 ret = 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
429 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
430
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
431 if (uidlist->file_seq_highwater < uidlist->last_file_seq)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
432 uidlist->file_seq_highwater = uidlist->last_file_seq;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
433 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
434
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
435 if (ret == 0) {
3957
8f0ff62befd3 When appending, update sync_stamp in index so that dbox won't get a full
Timo Sirainen <tss@iki.fi>
parents: 3956
diff changeset
436 /* broken file */
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
437 (void)unlink(uidlist->path);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
438
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
439 if (close(uidlist->fd) < 0)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
440 i_error("close(%s) failed: %m", uidlist->path);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
441 uidlist->fd = -1;
3957
8f0ff62befd3 When appending, update sync_stamp in index so that dbox won't get a full
Timo Sirainen <tss@iki.fi>
parents: 3956
diff changeset
442 uidlist->mtime = -1;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
443 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
444
4070
71b8faa84ec6 Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents: 4056
diff changeset
445 i_stream_destroy(&input);
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
446 return ret;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
447 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
448
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
449 static int dbox_uidlist_lock(struct dbox_uidlist *uidlist)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
450 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
451 i_assert(uidlist->lock_fd == -1);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
452
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
453 uidlist->lock_fd = file_dotlock_open(&uidlist_dotlock_settings,
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
454 uidlist->path, 0,
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
455 &uidlist->dotlock);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
456 if (uidlist->lock_fd == -1) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
457 mail_storage_set_critical(STORAGE(uidlist->mbox->storage),
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
458 "file_dotlock_open(%s) failed: %m", uidlist->path);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
459 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
460 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
461
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
462 return 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
463 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
464
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
465 static void dbox_uidlist_unlock(struct dbox_uidlist *uidlist)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
466 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
467 i_assert(uidlist->lock_fd != -1);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
468
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
469 (void)file_dotlock_delete(&uidlist->dotlock);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
470 uidlist->lock_fd = -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
471 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
472
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
473 static struct dbox_uidlist_entry *
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
474 dbox_uidlist_entry_lookup_int(struct dbox_uidlist *uidlist, uint32_t file_seq,
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
475 unsigned int *idx_r)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
476 {
3756
5fcf8e16ba8c Use binary search for finding entries
Timo Sirainen <tss@iki.fi>
parents: 3755
diff changeset
477 struct dbox_uidlist_entry *const *entries, **entry;
3758
Timo Sirainen <tss@iki.fi>
parents: 3756
diff changeset
478 unsigned int count;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
479
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
480 entries = array_get(&uidlist->entries, &count);
3758
Timo Sirainen <tss@iki.fi>
parents: 3756
diff changeset
481 entry = bsearch(&file_seq, entries, count, sizeof(*entries),
3756
5fcf8e16ba8c Use binary search for finding entries
Timo Sirainen <tss@iki.fi>
parents: 3755
diff changeset
482 dbox_uidlist_entry_cmp);
5fcf8e16ba8c Use binary search for finding entries
Timo Sirainen <tss@iki.fi>
parents: 3755
diff changeset
483 if (entry == NULL)
5fcf8e16ba8c Use binary search for finding entries
Timo Sirainen <tss@iki.fi>
parents: 3755
diff changeset
484 return NULL;
5fcf8e16ba8c Use binary search for finding entries
Timo Sirainen <tss@iki.fi>
parents: 3755
diff changeset
485
5fcf8e16ba8c Use binary search for finding entries
Timo Sirainen <tss@iki.fi>
parents: 3755
diff changeset
486 *idx_r = entry - entries;
3758
Timo Sirainen <tss@iki.fi>
parents: 3756
diff changeset
487 return *entry;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
488 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
489
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
490 struct dbox_uidlist_entry *
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
491 dbox_uidlist_entry_lookup(struct dbox_uidlist *uidlist, uint32_t file_seq)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
492 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
493 unsigned int idx;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
494
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
495 return dbox_uidlist_entry_lookup_int(uidlist, file_seq, &idx);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
496 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
497
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
498 static time_t get_min_timestamp(unsigned int days)
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
499 {
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
500 struct tm tm;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
501 time_t stamp;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
502
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
503 if (days == 0)
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
504 return 0;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
505
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
506 /* get beginning of today */
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
507 tm = *localtime(&ioloop_time);
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
508 tm.tm_hour = 0;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
509 tm.tm_min = 0;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
510 tm.tm_sec = 0;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
511 stamp = mktime(&tm);
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
512 if (stamp == (time_t)-1)
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
513 i_panic("mktime(today) failed");
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
514
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
515 return stamp - (3600*24 * (days-1));
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
516 }
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
517
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
518 struct dbox_uidlist_append_ctx *
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
519 dbox_uidlist_append_init(struct dbox_uidlist *uidlist)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
520 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
521 struct dbox_uidlist_append_ctx *ctx;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
522 pool_t pool;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
523
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
524 i_assert(!uidlist->appending);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
525
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
526 pool = pool_alloconly_create("dbox uidlist append context", 4096);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
527 ctx = p_new(pool, struct dbox_uidlist_append_ctx, 1);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
528 ctx->pool = pool;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
529 ctx->uidlist = uidlist;
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
530 ctx->min_usable_timestamp =
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
531 get_min_timestamp(uidlist->mbox->rotate_days);
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
532 ARRAY_CREATE(&ctx->files, pool, struct dbox_save_file *, 16);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
533 return ctx;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
534 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
535
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
536 static int dbox_uidlist_full_rewrite(struct dbox_uidlist *uidlist)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
537 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
538 struct dbox_uidlist_entry *const *entries;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
539 struct ostream *output;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
540 struct stat st, st2;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
541 const char *lock_path;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
542 const struct seq_range *range;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
543 string_t *str;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
544 unsigned int i, count, ui, range_count;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
545 int ret = 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
546
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
547 i_assert(uidlist->lock_fd != -1);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
548
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
549 output = o_stream_create_file(uidlist->lock_fd, default_pool, 0, FALSE);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
550
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
551 t_push();
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
552 str = t_str_new(256);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
553
4228
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
554 /* header: <version> <uidvalidity> <next-uid> <last-file-seq>. */
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
555 str_printfa(str, "%u %u %u %u\n", DBOX_UIDLIST_VERSION,
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
556 uidlist->uid_validity, uidlist->last_uid,
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
557 uidlist->last_file_seq);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
558 o_stream_send(output, str_data(str), str_len(str));
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
559
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
560 entries = array_get(&uidlist->entries, &count);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
561 for (i = 0; i < count; i++) {
4233
Timo Sirainen <tss@iki.fi>
parents: 4232
diff changeset
562 i_assert(entries[i]->file_seq <= uidlist->last_file_seq);
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
563 str_truncate(str, 0);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
564
4226
83322a523c91 More fixes.
Timo Sirainen <tss@iki.fi>
parents: 4208
diff changeset
565 i_assert(i == 0 ||
83322a523c91 More fixes.
Timo Sirainen <tss@iki.fi>
parents: 4208
diff changeset
566 entries[i]->file_seq > entries[i-1]->file_seq);
83322a523c91 More fixes.
Timo Sirainen <tss@iki.fi>
parents: 4208
diff changeset
567
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
568 /* <uid list> <file seq> [<last write timestamp> <file size>] */
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
569 range = array_get(&entries[i]->uid_list, &range_count);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
570 i_assert(range_count != 0);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
571 for (ui = 0; ui < range_count; ui++) {
4233
Timo Sirainen <tss@iki.fi>
parents: 4232
diff changeset
572 i_assert(range[ui].seq2 <= uidlist->last_uid);
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
573 if (str_len(str) > 0)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
574 str_append_c(str, ',');
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
575 if (range[ui].seq1 == range[ui].seq2)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
576 str_printfa(str, "%u", range[ui].seq1);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
577 else {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
578 str_printfa(str, "%u-%u",
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
579 range[ui].seq1, range[ui].seq2);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
580 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
581 }
4176
513aa0df39ee dbox fixes
Timo Sirainen <tss@iki.fi>
parents: 4152
diff changeset
582 str_printfa(str, " %u %lu %"PRIuUOFF_T, entries[i]->file_seq,
513aa0df39ee dbox fixes
Timo Sirainen <tss@iki.fi>
parents: 4152
diff changeset
583 (unsigned long)entries[i]->create_time,
3812
2881f7e79098 Added rotation by number of days since file was created.
Timo Sirainen <tss@iki.fi>
parents: 3761
diff changeset
584 entries[i]->file_size);
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
585 str_append_c(str, '\n');
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
586 if (o_stream_send(output, str_data(str), str_len(str)) < 0)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
587 break;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
588 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
589 t_pop();
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
590
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
591 if (output->stream_errno != 0) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
592 mail_storage_set_critical(STORAGE(uidlist->mbox->storage),
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
593 "write(%s) failed: %m", uidlist->path);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
594 ret = -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
595 }
4070
71b8faa84ec6 Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents: 4056
diff changeset
596 o_stream_destroy(&output);
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
597
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
598 if (ret < 0)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
599 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
600
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
601 /* grow mtime by one if needed to make sure the last write is noticed */
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
602 lock_path = file_dotlock_get_lock_path(uidlist->dotlock);
3761
ef482c909771 When index files (dovecot.index and dbox index) aren't synced with each
Timo Sirainen <tss@iki.fi>
parents: 3758
diff changeset
603 if (stat(uidlist->path, &st) < 0) {
ef482c909771 When index files (dovecot.index and dbox index) aren't synced with each
Timo Sirainen <tss@iki.fi>
parents: 3758
diff changeset
604 if (errno != ENOENT) {
ef482c909771 When index files (dovecot.index and dbox index) aren't synced with each
Timo Sirainen <tss@iki.fi>
parents: 3758
diff changeset
605 mail_storage_set_critical(
ef482c909771 When index files (dovecot.index and dbox index) aren't synced with each
Timo Sirainen <tss@iki.fi>
parents: 3758
diff changeset
606 STORAGE(uidlist->mbox->storage),
ef482c909771 When index files (dovecot.index and dbox index) aren't synced with each
Timo Sirainen <tss@iki.fi>
parents: 3758
diff changeset
607 "stat(%s) failed: %m", uidlist->path);
ef482c909771 When index files (dovecot.index and dbox index) aren't synced with each
Timo Sirainen <tss@iki.fi>
parents: 3758
diff changeset
608 return -1;
ef482c909771 When index files (dovecot.index and dbox index) aren't synced with each
Timo Sirainen <tss@iki.fi>
parents: 3758
diff changeset
609 }
ef482c909771 When index files (dovecot.index and dbox index) aren't synced with each
Timo Sirainen <tss@iki.fi>
parents: 3758
diff changeset
610 st.st_mtime = 0;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
611 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
612 if (fstat(uidlist->lock_fd, &st2) < 0) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
613 mail_storage_set_critical(STORAGE(uidlist->mbox->storage),
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
614 "fstat(%s) failed: %m", lock_path);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
615 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
616 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
617
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
618 if (st2.st_mtime <= st.st_mtime) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
619 struct utimbuf ut;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
620
4056
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
621 st2.st_mtime = st.st_mtime + 1;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
622 ut.actime = ioloop_time;
3761
ef482c909771 When index files (dovecot.index and dbox index) aren't synced with each
Timo Sirainen <tss@iki.fi>
parents: 3758
diff changeset
623 ut.modtime = st2.st_mtime;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
624
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
625 if (utime(lock_path, &ut) < 0) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
626 mail_storage_set_critical(
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
627 STORAGE(uidlist->mbox->storage),
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
628 "utime(%s) failed: %m", lock_path);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
629 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
630 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
631 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
632
3761
ef482c909771 When index files (dovecot.index and dbox index) aren't synced with each
Timo Sirainen <tss@iki.fi>
parents: 3758
diff changeset
633 uidlist->ino = st2.st_ino;
ef482c909771 When index files (dovecot.index and dbox index) aren't synced with each
Timo Sirainen <tss@iki.fi>
parents: 3758
diff changeset
634 uidlist->mtime = st2.st_mtime;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
635
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
636 /* now, finish the uidlist update by renaming the lock file to
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
637 uidlist */
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
638 uidlist->lock_fd = -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
639 if (file_dotlock_replace(&uidlist->dotlock, 0) < 0)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
640 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
641
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
642 uidlist->need_full_rewrite = FALSE;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
643 return 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
644 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
645
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
646 static void dbox_uidlist_build_update_line(struct dbox_save_file *save_file,
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
647 string_t *str, uint32_t uid_start)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
648 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
649 const unsigned int *seqs;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
650 unsigned int seq, seq_count, start;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
651
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
652 str_truncate(str, 0);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
653
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
654 /* build uidlist string */
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
655 seqs = array_get(&save_file->seqs, &seq_count);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
656 start = 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
657 for (seq = 0; seq < seq_count; seq++) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
658 if (seq != seq_count-1) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
659 if (seq == 0 || seqs[seq-1]+1 == seqs[seq])
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
660 continue;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
661 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
662
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
663 if (str_len(str) > 0)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
664 str_append_c(str, ',');
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
665 str_printfa(str, "%u", uid_start + seqs[start] - 1);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
666 if (seq != start)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
667 str_printfa(str, "-%u", uid_start + seqs[seq] - 1);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
668 start = seq + 1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
669 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
670 str_printfa(str, " %u", save_file->file->file_seq);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
671
3812
2881f7e79098 Added rotation by number of days since file was created.
Timo Sirainen <tss@iki.fi>
parents: 3761
diff changeset
672 /* add creation time and file size */
2881f7e79098 Added rotation by number of days since file was created.
Timo Sirainen <tss@iki.fi>
parents: 3761
diff changeset
673 str_printfa(str, " %s %s", dec2str(save_file->file->create_time),
2881f7e79098 Added rotation by number of days since file was created.
Timo Sirainen <tss@iki.fi>
parents: 3761
diff changeset
674 dec2str(save_file->append_offset));
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
675 str_append_c(str, '\n');
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
676 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
677
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
678 static void dbox_uidlist_update_changes(struct dbox_uidlist_append_ctx *ctx)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
679 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
680 struct dbox_save_file *const *files;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
681 string_t *str;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
682 unsigned int i, count;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
683 uint32_t uid_start;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
684
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
685 uid_start = ctx->uidlist->last_uid + 1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
686
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
687 t_push();
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
688 str = t_str_new(256);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
689 files = array_get(&ctx->files, &count);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
690 for (i = 0; i < count; i++) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
691 dbox_uidlist_build_update_line(files[i], str, uid_start);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
692 if (!dbox_uidlist_next(ctx->uidlist, str_c(str)))
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
693 i_panic("dbox_uidlist_next() internal update failed");
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
694 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
695 t_pop();
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
696 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
697
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
698 static int dbox_uidlist_append_changes(struct dbox_uidlist_append_ctx *ctx)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
699 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
700 struct dbox_save_file *const *files;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
701 struct ostream *output;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
702 struct utimbuf ut;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
703 struct stat st;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
704 unsigned int i, count;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
705 uint32_t uid_start;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
706 string_t *str;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
707 int ret = 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
708
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
709 i_assert(ctx->uidlist->fd != -1);
4056
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
710 i_assert(ctx->uidlist->lock_fd != -1);
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
711
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
712 if (lseek(ctx->uidlist->fd, 0, SEEK_END) < 0) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
713 mail_storage_set_critical(STORAGE(ctx->uidlist->mbox->storage),
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
714 "lseek(%s) failed: %m", ctx->uidlist->path);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
715 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
716 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
717 output = o_stream_create_file(ctx->uidlist->fd, default_pool, 0, FALSE);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
718
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
719 uid_start = ctx->uidlist->last_uid + 1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
721 /* simply append the change-lines to the index file. if someone's
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
722 reading the file at the same time, it doesn't matter. the entries
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
723 are complete only after the LF has been written. */
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
724 t_push();
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
725 str = t_str_new(256);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
726 files = array_get(&ctx->files, &count);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
727 for (i = 0; i < count; i++) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
728 dbox_uidlist_build_update_line(files[i], str, uid_start);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
729 if (!dbox_uidlist_next(ctx->uidlist, str_c(str)))
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
730 i_panic("dbox_uidlist_next() internal update failed");
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
731 o_stream_send(output, str_data(str), str_len(str));
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
732 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
733 t_pop();
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
734
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
735 if (output->stream_errno != 0) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
736 mail_storage_set_critical(STORAGE(ctx->uidlist->mbox->storage),
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
737 "write(%s) failed: %m", ctx->uidlist->path);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
738 ret = -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
739 }
4070
71b8faa84ec6 Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents: 4056
diff changeset
740 o_stream_destroy(&output);
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
741
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
742 if (ret < 0)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
743 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
744
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
745 /* grow mtime by one to make sure the last write is noticed */
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
746 if (fstat(ctx->uidlist->fd, &st) < 0) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
747 mail_storage_set_critical(STORAGE(ctx->uidlist->mbox->storage),
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
748 "fstat(%s) failed: %m", ctx->uidlist->path);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
749 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
750 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
751
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
752 ut.actime = ioloop_time;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
753 ut.modtime = st.st_mtime + 1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
754 if (utime(ctx->uidlist->path, &ut) < 0) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
755 mail_storage_set_critical(STORAGE(ctx->uidlist->mbox->storage),
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
756 "utime(%s) failed: %m", ctx->uidlist->path);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
757 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
758 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
759
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
760 ctx->uidlist->ino = st.st_ino;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
761 ctx->uidlist->mtime = ut.modtime;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
762 return 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
763 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
764
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
765 static int
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
766 dbox_uidlist_write_append_offsets(struct dbox_uidlist_append_ctx *ctx)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
767 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
768 struct dbox_save_file *const *files;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
769 struct dbox_file_header hdr;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
770 unsigned int i, count;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
771 int ret = 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
772
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
773 files = array_get(&ctx->files, &count);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
774 for (i = 0; i < count; i++) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
775 DEC2HEX(hdr.append_offset_hex,
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
776 files[i]->file->output->offset);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
777
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
778 if (pwrite_full(files[i]->file->fd, hdr.append_offset_hex,
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
779 sizeof(hdr.append_offset_hex),
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
780 offsetof(struct dbox_file_header,
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
781 append_offset_hex)) < 0) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
782 mail_storage_set_critical(
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
783 STORAGE(ctx->uidlist->mbox->storage),
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
784 "pwrite_full(%s) failed: %m",
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
785 files[i]->file->path);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
786 ret = -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
787 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
788 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
789 return ret;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
790 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
791
3957
8f0ff62befd3 When appending, update sync_stamp in index so that dbox won't get a full
Timo Sirainen <tss@iki.fi>
parents: 3956
diff changeset
792 int dbox_uidlist_append_commit(struct dbox_uidlist_append_ctx *ctx,
8f0ff62befd3 When appending, update sync_stamp in index so that dbox won't get a full
Timo Sirainen <tss@iki.fi>
parents: 3956
diff changeset
793 time_t *mtime_r)
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
794 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
795 int ret;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
796
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
797 if (ctx->mail_count == 0) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
798 /* nothing actually appended */
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
799 dbox_uidlist_append_rollback(ctx);
3957
8f0ff62befd3 When appending, update sync_stamp in index so that dbox won't get a full
Timo Sirainen <tss@iki.fi>
parents: 3956
diff changeset
800 *mtime_r = ctx->uidlist->mtime;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
801 return 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
802 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
803
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
804 i_assert(ctx->locked);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
805
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
806 if (dbox_uidlist_write_append_offsets(ctx) < 0)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
807 ret = -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
808 else {
4056
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
809 ctx->uidlist->need_full_rewrite = TRUE; // FIXME
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
810 if (ctx->uidlist->need_full_rewrite) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
811 dbox_uidlist_update_changes(ctx);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
812 ret = dbox_uidlist_full_rewrite(ctx->uidlist);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
813 if (ctx->uidlist->dotlock == NULL)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
814 ctx->locked = FALSE;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
815 } else {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
816 ret = dbox_uidlist_append_changes(ctx);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
817 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
818 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
819
3957
8f0ff62befd3 When appending, update sync_stamp in index so that dbox won't get a full
Timo Sirainen <tss@iki.fi>
parents: 3956
diff changeset
820 *mtime_r = ctx->uidlist->mtime;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
821 dbox_uidlist_append_rollback(ctx);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
822 return ret;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
823 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
824
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
825 void dbox_uidlist_append_rollback(struct dbox_uidlist_append_ctx *ctx)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
826 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
827 struct dbox_save_file *const *files;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
828 unsigned int i, count;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
829
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
830 /* unlock files */
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
831 files = array_get(&ctx->files, &count);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
832 for (i = 0; i < count; i++)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
833 file_dotlock_delete(&files[i]->dotlock);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
834
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
835 if (ctx->locked)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
836 dbox_uidlist_unlock(ctx->uidlist);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
837 ctx->uidlist->appending = FALSE;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
838 pool_unref(ctx->pool);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
839 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
840
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
841 static int dbox_reopen_file(struct dbox_uidlist_append_ctx *ctx,
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
842 struct dbox_save_file *save_file)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
843 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
844 struct dbox_file *file = save_file->file;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
845 struct stat st;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
846
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
847 if (file->fd != -1)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
848 return 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
849
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
850 /* open the file and make sure it's the same as expected,
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
851 since we have it locked */
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
852 file->fd = open(file->path, O_RDWR);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
853 if (file->fd == -1) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
854 mail_storage_set_critical(STORAGE(ctx->uidlist->mbox->storage),
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
855 "open(%s) failed: %m", file->path);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
856 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
857 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
858
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
859 if (fstat(file->fd, &st) < 0) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
860 mail_storage_set_critical(STORAGE(ctx->uidlist->mbox->storage),
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
861 "fstat(%s) failed: %m", file->path);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
862 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
863 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
864
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
865 if (st.st_ino != save_file->ino ||
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
866 !CMP_DEV_T(st.st_dev, save_file->dev)) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
867 mail_storage_set_critical(STORAGE(ctx->uidlist->mbox->storage),
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
868 "Appended file changed unexpectedly: %s", file->path);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
869 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
870 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
871 return 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
872 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
873
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
874 static int dbox_uidlist_files_lookup(struct dbox_uidlist_append_ctx *ctx,
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
875 uint32_t file_seq)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
876 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
877 struct dbox_save_file *const *files;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
878 unsigned int i, count;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
879
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
880 files = array_get(&ctx->files, &count);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
881 for (i = 0; i < count; i++) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
882 if (files[i]->file->file_seq == file_seq)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
883 return TRUE;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
884 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
885 return FALSE;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
886 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
887
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
888 #define DBOX_CAN_APPEND(ctx, create_time, file_size) \
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
889 (((create_time) >= (ctx)->min_usable_timestamp && \
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
890 (file_size) < (ctx)->uidlist->mbox->rotate_size) || \
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
891 (file_size) < (ctx)->uidlist->mbox->rotate_min_size)
3812
2881f7e79098 Added rotation by number of days since file was created.
Timo Sirainen <tss@iki.fi>
parents: 3761
diff changeset
892
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
893 static int
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
894 dbox_file_append(struct dbox_uidlist_append_ctx *ctx,
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
895 const char *path, struct dbox_uidlist_entry *entry,
4208
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
896 struct stat *st, struct dbox_file **file_r, bool existing)
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
897 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
898 struct dbox_mailbox *mbox = ctx->uidlist->mbox;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
899 struct dbox_file *file;
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
900 int fd;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
901
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
902 *file_r = NULL;
3812
2881f7e79098 Added rotation by number of days since file was created.
Timo Sirainen <tss@iki.fi>
parents: 3761
diff changeset
903
4208
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
904 fd = open(path, O_RDWR | (existing ? 0 : O_CREAT), 0600);
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
905 if (fd == -1) {
4208
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
906 if (errno == ENOENT && existing) {
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
907 /* the file was unlinked just now, update its size
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
908 so that we don't get back here. */
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
909 entry->file_size = (uoff_t)-1;
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
910 return 0;
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
911 }
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
912 mail_storage_set_critical(STORAGE(mbox->storage),
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
913 "open(%s) failed: %m", path);
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
914 return -1;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
915 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
916
4152
e2edd333c473 Added MAILBOX_OPEN_KEEP_LOCKED flag to mailbox opening and implemented it
Timo Sirainen <tss@iki.fi>
parents: 4114
diff changeset
917 if (fstat(fd, st) < 0) {
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
918 mail_storage_set_critical(STORAGE(mbox->storage),
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
919 "fstat(%s) failed: %m", path);
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
920 (void)close(fd);
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
921 return -1;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
922 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
923
4109
988a8ef1deea Some fixes to get dbox code working better. Still needs some work though..
Timo Sirainen <tss@iki.fi>
parents: 4070
diff changeset
924 file = i_new(struct dbox_file, 1);
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
925 file->path = i_strdup(path);
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
926 file->fd = fd;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
927
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
928 file->input = i_stream_create_file(file->fd, default_pool,
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
929 65536, FALSE);
3956
a52c36c51ff2 Support storing keywords in dbox files. Doesn't yet work while saving.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
930 file->output = o_stream_create_file(file->fd, default_pool, 0, FALSE);
4152
e2edd333c473 Added MAILBOX_OPEN_KEEP_LOCKED flag to mailbox opening and implemented it
Timo Sirainen <tss@iki.fi>
parents: 4114
diff changeset
931 if ((uoff_t)st->st_size < sizeof(struct dbox_file_header)) {
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
932 if (dbox_file_write_header(mbox, file) < 0) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
933 dbox_file_close(file);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
934 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
935 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
936 } else {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
937 if (dbox_file_read_header(mbox, file) < 0) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
938 dbox_file_close(file);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
939 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
940 }
4109
988a8ef1deea Some fixes to get dbox code working better. Still needs some work though..
Timo Sirainen <tss@iki.fi>
parents: 4070
diff changeset
941
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
942 if (entry != NULL) {
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
943 entry->create_time = file->create_time;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
944 entry->file_size = file->append_offset;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
945 }
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
946
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
947 if (!DBOX_CAN_APPEND(ctx, file->create_time,
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
948 file->append_offset)) {
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
949 dbox_file_close(file);
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
950 return 0;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
951 }
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
952 }
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
953
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
954 *file_r = file;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
955 return 1;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
956 }
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
957
4228
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
958 static int dbox_file_seq_was_used(struct dbox_mailbox *mbox, const char *path,
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
959 uint32_t file_seq)
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
960 {
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
961 struct stat st;
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
962
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
963 if (stat(path, &st) == 0)
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
964 return 0;
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
965 if (errno != ENOENT) {
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
966 mail_storage_set_critical(STORAGE(mbox->storage),
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
967 "stat(%s) failed: %m", path);
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
968 return -1;
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
969 }
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
970
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
971 /* doesn't exist, make sure that index's last file seq is lower */
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
972 if (dbox_uidlist_read(mbox->uidlist) < 0)
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
973 return -1;
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
974 return file_seq < mbox->uidlist->last_file_seq ? 1 : 0;
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
975 }
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
976
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
977 static int
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
978 dbox_file_append_lock(struct dbox_uidlist_append_ctx *ctx, string_t *path,
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
979 uint32_t *file_seq_r, struct dbox_uidlist_entry **entry_r,
4208
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
980 struct dotlock **dotlock_r, bool *existing_r)
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
981 {
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
982 struct dbox_mailbox *mbox = ctx->uidlist->mbox;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
983 struct dbox_uidlist_entry *const *entries;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
984 unsigned int i, count;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
985 uint32_t file_seq;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
986 int ret;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
987
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
988 entries = array_get(&ctx->uidlist->entries, &count);
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
989 for (i = 0;; i++) {
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
990 file_seq = 0;
4208
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
991 *existing_r = FALSE;
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
992 for (; i < count; i++) {
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
993 if (DBOX_CAN_APPEND(ctx, entries[i]->create_time,
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
994 entries[i]->file_size) &&
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
995 !dbox_uidlist_files_lookup(ctx,
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
996 entries[i]->file_seq)) {
4208
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
997 *existing_r = TRUE;
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
998 file_seq = entries[i]->file_seq;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
999 break;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1000 }
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1001 }
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1002
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1003 if (file_seq == 0) {
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1004 /* create new file */
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1005 file_seq = dbox_uidlist_get_new_file_seq(ctx->uidlist);
4109
988a8ef1deea Some fixes to get dbox code working better. Still needs some work though..
Timo Sirainen <tss@iki.fi>
parents: 4070
diff changeset
1006 }
988a8ef1deea Some fixes to get dbox code working better. Still needs some work though..
Timo Sirainen <tss@iki.fi>
parents: 4070
diff changeset
1007
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1008 /* try locking the file. */
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1009 str_truncate(path, 0);
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1010 str_printfa(path, "%s/"DBOX_MAILDIR_NAME"/"
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1011 DBOX_MAIL_FILE_FORMAT, mbox->path, file_seq);
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1012 ret = file_dotlock_create(&dbox_file_dotlock_set, str_c(path),
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1013 DOTLOCK_CREATE_FLAG_NONBLOCK,
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1014 dotlock_r);
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1015 if (ret > 0) {
4228
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
1016 /* success. but since we don't have uidlist locked
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
1017 here, it's possible that the file was just deleted
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
1018 by someone else. in that case we really don't want
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
1019 to create the file back and cause problems. */
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
1020 ret = dbox_file_seq_was_used(mbox, str_c(path),
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
1021 file_seq);
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
1022 if (ret == 0)
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
1023 break;
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
1024
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
1025 /* error / it was used, continue with another
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
1026 file sequence */
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
1027 file_dotlock_delete(dotlock_r);
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
1028
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
1029 if (ret < 0)
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
1030 return -1;
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
1031 } else if (ret < 0) {
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1032 mail_storage_set_critical(STORAGE(mbox->storage),
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1033 "file_dotlock_create(%s) failed: %m",
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1034 str_c(path));
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1035 return -1;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1036 }
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1037
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1038 /* lock already exists, try next file */
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1039 }
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1040
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1041 *file_seq_r = file_seq;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1042 *entry_r = i < count ? entries[i] : NULL;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1043 return 0;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1044 }
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1045
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1046 int dbox_uidlist_append_locked(struct dbox_uidlist_append_ctx *ctx,
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1047 struct dbox_file **file_r)
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1048 {
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1049 struct dbox_save_file *const *files, *save_file;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1050 struct dbox_uidlist_entry *entry;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1051 struct dbox_file *file = NULL;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1052 struct dotlock *dotlock = NULL;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1053 struct ostream *output;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1054 string_t *path;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1055 unsigned int i, count;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1056 struct stat st;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1057 uint32_t file_seq;
4208
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
1058 bool existing;
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1059 int ret;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1060
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1061 /* check first from already opened files */
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1062 files = array_get(&ctx->files, &count);
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1063 for (i = 0; i < count; i++) {
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1064 if (DBOX_CAN_APPEND(ctx, files[i]->file->create_time,
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1065 files[i]->append_offset)) {
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1066 if (dbox_reopen_file(ctx, files[i]) < 0)
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1067 return -1;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1068
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1069 *file_r = file = files[i]->file;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1070 o_stream_seek(file->output, file->append_offset);
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1071 return 0;
4109
988a8ef1deea Some fixes to get dbox code working better. Still needs some work though..
Timo Sirainen <tss@iki.fi>
parents: 4070
diff changeset
1072 }
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1073 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1074
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1075 /* check from other existing files. use uidlist's file_size field.
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1076 it's not completely trustworthy though. */
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1077 path = str_new(ctx->pool, 64);
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1078 do {
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1079 if (dotlock != NULL)
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1080 file_dotlock_delete(&dotlock);
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1081 if (dbox_file_append_lock(ctx, path, &file_seq,
4208
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
1082 &entry, &dotlock, &existing) < 0)
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1083 return -1;
4152
e2edd333c473 Added MAILBOX_OPEN_KEEP_LOCKED flag to mailbox opening and implemented it
Timo Sirainen <tss@iki.fi>
parents: 4114
diff changeset
1084 } while ((ret = dbox_file_append(ctx, str_c(path), entry,
4208
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
1085 &st, &file, existing)) == 0);
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1086
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1087 if (ret < 0) {
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1088 file_dotlock_delete(&dotlock);
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1089 dbox_file_close(file);
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1090 return -1;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1091 }
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1092 file->file_seq = file_seq;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1093
3956
a52c36c51ff2 Support storing keywords in dbox files. Doesn't yet work while saving.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1094 /* we'll always use CRLF linefeeds for mails (but not the header,
a52c36c51ff2 Support storing keywords in dbox files. Doesn't yet work while saving.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1095 so don't do this before dbox_file_write_header()) */
a52c36c51ff2 Support storing keywords in dbox files. Doesn't yet work while saving.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1096 output = o_stream_create_crlf(default_pool, file->output);
a52c36c51ff2 Support storing keywords in dbox files. Doesn't yet work while saving.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1097 o_stream_unref(&file->output);
a52c36c51ff2 Support storing keywords in dbox files. Doesn't yet work while saving.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1098 file->output = output;
a52c36c51ff2 Support storing keywords in dbox files. Doesn't yet work while saving.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1099
a52c36c51ff2 Support storing keywords in dbox files. Doesn't yet work while saving.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1100 o_stream_seek(file->output, file->append_offset);
a52c36c51ff2 Support storing keywords in dbox files. Doesn't yet work while saving.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1101
4109
988a8ef1deea Some fixes to get dbox code working better. Still needs some work though..
Timo Sirainen <tss@iki.fi>
parents: 4070
diff changeset
1102 save_file = p_new(ctx->pool, struct dbox_save_file, 1);
988a8ef1deea Some fixes to get dbox code working better. Still needs some work though..
Timo Sirainen <tss@iki.fi>
parents: 4070
diff changeset
1103 save_file->file = file;
988a8ef1deea Some fixes to get dbox code working better. Still needs some work though..
Timo Sirainen <tss@iki.fi>
parents: 4070
diff changeset
1104 save_file->dotlock = dotlock;
3812
2881f7e79098 Added rotation by number of days since file was created.
Timo Sirainen <tss@iki.fi>
parents: 3761
diff changeset
1105 save_file->dev = st.st_dev;
2881f7e79098 Added rotation by number of days since file was created.
Timo Sirainen <tss@iki.fi>
parents: 3761
diff changeset
1106 save_file->ino = st.st_ino;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1107 ARRAY_CREATE(&save_file->seqs, ctx->pool, unsigned int, 8);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1108
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1109 array_append(&ctx->files, &save_file, 1);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1110 *file_r = file;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1111 return 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1112 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1113
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1114 void dbox_uidlist_append_finish_mail(struct dbox_uidlist_append_ctx *ctx,
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1115 struct dbox_file *file)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1116 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1117 struct dbox_save_file *const *files, *save_file = NULL;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1118 unsigned int i, count;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1119
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1120 files = array_get(&ctx->files, &count);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1121 for (i = 0; i < count; i++) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1122 if (files[i]->file == file) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1123 save_file = files[i];
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1124 break;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1125 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1126 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1127 i_assert(save_file != NULL);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1128
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1129 ctx->mail_count++;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1130 array_append(&save_file->seqs, &ctx->mail_count, 1);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1131
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1132 file->append_offset = file->output->offset;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1133 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1134
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1135 struct dbox_file *
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1136 dbox_uidlist_append_lookup_file(struct dbox_uidlist_append_ctx *ctx,
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1137 uint32_t file_seq)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1138 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1139 struct dbox_save_file *const *files;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1140 unsigned int i, count;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1141
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1142 files = array_get(&ctx->files, &count);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1143 for (i = 0; i < count; i++) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1144 if (files[i]->file->file_seq == file_seq)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1145 return files[i]->file;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1146 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1147
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1148 i_unreached();
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1149 return NULL;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1150 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1151
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1152 uint32_t dbox_uidlist_get_new_file_seq(struct dbox_uidlist *uidlist)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1153 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1154 /* Note that unless uidlist is locked, it's not guaranteed that this
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1155 actually returns a new unused file sequence. */
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1156 return ++uidlist->file_seq_highwater;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1157 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1158
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1159 int dbox_uidlist_append_get_first_uid(struct dbox_uidlist_append_ctx *ctx,
3957
8f0ff62befd3 When appending, update sync_stamp in index so that dbox won't get a full
Timo Sirainen <tss@iki.fi>
parents: 3956
diff changeset
1160 uint32_t *uid_r, time_t *mtime_r)
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1161 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1162 int ret;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1163
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1164 /* from now on we'll need to keep uidlist locked until it's
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1165 committed or rollbacked */
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1166 if (!ctx->locked) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1167 if (dbox_uidlist_lock(ctx->uidlist) < 0)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1168 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1169 ctx->locked = TRUE;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1170
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1171 /* update uidlist to make sure we have the latest state */
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1172 if ((ret = dbox_uidlist_read(ctx->uidlist)) < 0)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1173 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1174 if (ret == 0) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1175 /* file is deleted */
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1176 ctx->uidlist->need_full_rewrite = TRUE;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1177 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1178 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1179
3957
8f0ff62befd3 When appending, update sync_stamp in index so that dbox won't get a full
Timo Sirainen <tss@iki.fi>
parents: 3956
diff changeset
1180 *mtime_r = ctx->uidlist->mtime;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1181 *uid_r = ctx->uidlist->last_uid + 1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1182 return 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1183 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1184
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1185 int dbox_uidlist_sync_init(struct dbox_uidlist *uidlist,
3761
ef482c909771 When index files (dovecot.index and dbox index) aren't synced with each
Timo Sirainen <tss@iki.fi>
parents: 3758
diff changeset
1186 struct dbox_uidlist_sync_ctx **ctx_r,
ef482c909771 When index files (dovecot.index and dbox index) aren't synced with each
Timo Sirainen <tss@iki.fi>
parents: 3758
diff changeset
1187 time_t *mtime_r)
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1188 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1189 int ret;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1190
3761
ef482c909771 When index files (dovecot.index and dbox index) aren't synced with each
Timo Sirainen <tss@iki.fi>
parents: 3758
diff changeset
1191 *mtime_r = -1;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1192 if (dbox_uidlist_lock(uidlist) < 0)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1193 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1194
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1195 if ((ret = dbox_uidlist_read(uidlist)) < 0) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1196 dbox_uidlist_unlock(uidlist);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1197 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1198 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1199
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1200 if (ret == 0) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1201 /* file is deleted */
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1202 uidlist->need_full_rewrite = TRUE;
3761
ef482c909771 When index files (dovecot.index and dbox index) aren't synced with each
Timo Sirainen <tss@iki.fi>
parents: 3758
diff changeset
1203 } else {
ef482c909771 When index files (dovecot.index and dbox index) aren't synced with each
Timo Sirainen <tss@iki.fi>
parents: 3758
diff changeset
1204 *mtime_r = uidlist->mtime;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1205 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1206
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1207 *ctx_r = i_new(struct dbox_uidlist_sync_ctx, 1);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1208 (*ctx_r)->uidlist = uidlist;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1209 return 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1210 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1211
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1212 int dbox_uidlist_sync_commit(struct dbox_uidlist_sync_ctx *ctx, time_t *mtime_r)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1213 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1214 int ret = 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1215
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1216 if (ctx->modified) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1217 /* this call may or may not release the dotlock.. */
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1218 ret = dbox_uidlist_full_rewrite(ctx->uidlist);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1219 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1220
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1221 *mtime_r = ctx->uidlist->mtime;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1222
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1223 if (ctx->uidlist->dotlock != NULL)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1224 dbox_uidlist_unlock(ctx->uidlist);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1225 i_free(ctx);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1226 return ret;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1227 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1228
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1229 void dbox_uidlist_sync_rollback(struct dbox_uidlist_sync_ctx *ctx)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1230 {
3758
Timo Sirainen <tss@iki.fi>
parents: 3756
diff changeset
1231 array_clear(&ctx->uidlist->entries);
Timo Sirainen <tss@iki.fi>
parents: 3756
diff changeset
1232 ctx->uidlist->ino = 0;
Timo Sirainen <tss@iki.fi>
parents: 3756
diff changeset
1233 ctx->uidlist->mtime = 0;
Timo Sirainen <tss@iki.fi>
parents: 3756
diff changeset
1234
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1235 dbox_uidlist_unlock(ctx->uidlist);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1236 i_free(ctx);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1237 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1238
3761
ef482c909771 When index files (dovecot.index and dbox index) aren't synced with each
Timo Sirainen <tss@iki.fi>
parents: 3758
diff changeset
1239 void dbox_uidlist_sync_from_scratch(struct dbox_uidlist_sync_ctx *ctx)
ef482c909771 When index files (dovecot.index and dbox index) aren't synced with each
Timo Sirainen <tss@iki.fi>
parents: 3758
diff changeset
1240 {
ef482c909771 When index files (dovecot.index and dbox index) aren't synced with each
Timo Sirainen <tss@iki.fi>
parents: 3758
diff changeset
1241 array_clear(&ctx->uidlist->entries);
ef482c909771 When index files (dovecot.index and dbox index) aren't synced with each
Timo Sirainen <tss@iki.fi>
parents: 3758
diff changeset
1242 ctx->uidlist->ino = 0;
ef482c909771 When index files (dovecot.index and dbox index) aren't synced with each
Timo Sirainen <tss@iki.fi>
parents: 3758
diff changeset
1243 ctx->uidlist->mtime = 0;
ef482c909771 When index files (dovecot.index and dbox index) aren't synced with each
Timo Sirainen <tss@iki.fi>
parents: 3758
diff changeset
1244
ef482c909771 When index files (dovecot.index and dbox index) aren't synced with each
Timo Sirainen <tss@iki.fi>
parents: 3758
diff changeset
1245 ctx->modified = TRUE;
ef482c909771 When index files (dovecot.index and dbox index) aren't synced with each
Timo Sirainen <tss@iki.fi>
parents: 3758
diff changeset
1246 ctx->uidlist->need_full_rewrite = TRUE;
ef482c909771 When index files (dovecot.index and dbox index) aren't synced with each
Timo Sirainen <tss@iki.fi>
parents: 3758
diff changeset
1247 }
ef482c909771 When index files (dovecot.index and dbox index) aren't synced with each
Timo Sirainen <tss@iki.fi>
parents: 3758
diff changeset
1248
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1249 void dbox_uidlist_sync_set_modified(struct dbox_uidlist_sync_ctx *ctx)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1250 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1251 ctx->modified = TRUE;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1252 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1253
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1254 void dbox_uidlist_sync_append(struct dbox_uidlist_sync_ctx *ctx,
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1255 const struct dbox_uidlist_entry *entry)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1256 {
3758
Timo Sirainen <tss@iki.fi>
parents: 3756
diff changeset
1257 struct dbox_uidlist_entry *const *entries, **pos;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1258 struct dbox_uidlist_entry *new_entry;
3758
Timo Sirainen <tss@iki.fi>
parents: 3756
diff changeset
1259 unsigned int count;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1260
4056
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
1261 i_assert(array_count(&entry->uid_list) > 0);
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
1262
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1263 new_entry = p_new(ctx->uidlist->entry_pool,
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1264 struct dbox_uidlist_entry, 1);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1265 *new_entry = *entry;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1266
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1267 ARRAY_CREATE(&new_entry->uid_list, ctx->uidlist->entry_pool,
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1268 struct seq_range, array_count(&entry->uid_list) + 1);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1269 array_append_array(&new_entry->uid_list, &entry->uid_list);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1270
4233
Timo Sirainen <tss@iki.fi>
parents: 4232
diff changeset
1271 if (new_entry->file_seq > ctx->uidlist->last_file_seq)
Timo Sirainen <tss@iki.fi>
parents: 4232
diff changeset
1272 ctx->uidlist->last_file_seq = new_entry->file_seq;
Timo Sirainen <tss@iki.fi>
parents: 4232
diff changeset
1273 dbox_uidlist_update_last_uid(ctx->uidlist, new_entry);
Timo Sirainen <tss@iki.fi>
parents: 4232
diff changeset
1274
3758
Timo Sirainen <tss@iki.fi>
parents: 3756
diff changeset
1275 entries = array_get(&ctx->uidlist->entries, &count);
Timo Sirainen <tss@iki.fi>
parents: 3756
diff changeset
1276 if (count == 0 || entries[count-1]->file_seq < new_entry->file_seq)
Timo Sirainen <tss@iki.fi>
parents: 3756
diff changeset
1277 array_append(&ctx->uidlist->entries, &new_entry, 1);
Timo Sirainen <tss@iki.fi>
parents: 3756
diff changeset
1278 else {
4226
83322a523c91 More fixes.
Timo Sirainen <tss@iki.fi>
parents: 4208
diff changeset
1279 unsigned int idx;
83322a523c91 More fixes.
Timo Sirainen <tss@iki.fi>
parents: 4208
diff changeset
1280
3758
Timo Sirainen <tss@iki.fi>
parents: 3756
diff changeset
1281 pos = bsearch_insert_pos(&new_entry->file_seq, entries,
Timo Sirainen <tss@iki.fi>
parents: 3756
diff changeset
1282 count, sizeof(*entries),
Timo Sirainen <tss@iki.fi>
parents: 3756
diff changeset
1283 dbox_uidlist_entry_cmp);
4226
83322a523c91 More fixes.
Timo Sirainen <tss@iki.fi>
parents: 4208
diff changeset
1284 idx = pos - entries;
83322a523c91 More fixes.
Timo Sirainen <tss@iki.fi>
parents: 4208
diff changeset
1285
83322a523c91 More fixes.
Timo Sirainen <tss@iki.fi>
parents: 4208
diff changeset
1286 i_assert(idx < count || idx == 0 ||
83322a523c91 More fixes.
Timo Sirainen <tss@iki.fi>
parents: 4208
diff changeset
1287 new_entry->file_seq > entries[idx-1]->file_seq);
83322a523c91 More fixes.
Timo Sirainen <tss@iki.fi>
parents: 4208
diff changeset
1288 i_assert(idx == count ||
83322a523c91 More fixes.
Timo Sirainen <tss@iki.fi>
parents: 4208
diff changeset
1289 new_entry->file_seq < entries[idx]->file_seq);
83322a523c91 More fixes.
Timo Sirainen <tss@iki.fi>
parents: 4208
diff changeset
1290 array_insert(&ctx->uidlist->entries, idx, &new_entry, 1);
3758
Timo Sirainen <tss@iki.fi>
parents: 3756
diff changeset
1291 }
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1292 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1293
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1294 void dbox_uidlist_sync_unlink(struct dbox_uidlist_sync_ctx *ctx,
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1295 uint32_t file_seq)
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1296 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1297 struct dbox_uidlist_entry *entry;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1298 unsigned int idx;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1299
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1300 entry = dbox_uidlist_entry_lookup_int(ctx->uidlist, file_seq, &idx);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1301 i_assert(entry != NULL);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1302
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1303 array_delete(&ctx->uidlist->entries, idx, 1);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1304
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1305 dbox_uidlist_sync_set_modified(ctx);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1306 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1307
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1308 uint32_t dbox_uidlist_sync_get_uid_validity(struct dbox_uidlist_sync_ctx *ctx)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1309 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1310 if (ctx->uidlist->uid_validity == 0) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1311 ctx->uidlist->uid_validity = ioloop_time;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1312 ctx->modified = TRUE;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1313 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1314
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1315 return ctx->uidlist->uid_validity;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1316 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1317
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1318 uint32_t dbox_uidlist_sync_get_next_uid(struct dbox_uidlist_sync_ctx *ctx)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1319 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1320 return ctx->uidlist->last_uid + 1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1321 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1322
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1323 int dbox_uidlist_get_mtime(struct dbox_uidlist *uidlist, time_t *mtime_r)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1324 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1325 struct stat st;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1326
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1327 if (stat(uidlist->path, &st) < 0) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1328 if (errno != ENOENT) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1329 mail_storage_set_critical(
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1330 STORAGE(uidlist->mbox->storage),
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1331 "stat(%s) failed: %m", uidlist->path);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1332 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1333 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1334
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1335 *mtime_r = 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1336 } else {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1337 *mtime_r = st.st_mtime;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1338 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1339 return 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1340 }