annotate src/lib-storage/index/dbox/dbox-uidlist.c @ 4304:3bb4f35b99d4 HEAD

dbox_rotate_size checking was wrong.
author Timo Sirainen <tss@iki.fi>
date Thu, 08 Jun 2006 17:42:21 +0300
parents be915546ce49
children f693898fee3b
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
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 struct dbox_uidlist {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 struct dbox_mailbox *mbox;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 char *path;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 int fd;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 struct dotlock *dotlock;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 int lock_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 unsigned int version;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 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
50
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 ino_t ino;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 time_t mtime;
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 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
55
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 pool_t entry_pool;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 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
58
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 unsigned int appending:1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 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
61 };
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 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
64 pool_t pool;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 struct dbox_uidlist *uidlist;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
67 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
68 unsigned int mail_count;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 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
71 unsigned int open_fds;
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 unsigned int locked:1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 };
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 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
77 struct dbox_uidlist *uidlist;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 unsigned int modified:1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 };
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 const struct dotlock_settings uidlist_dotlock_settings = {
3985
38c352bb7bb7 Dotlock fixes
Timo Sirainen <tss@iki.fi>
parents: 3957
diff changeset
82 MEMBER(temp_prefix) NULL,
38c352bb7bb7 Dotlock fixes
Timo Sirainen <tss@iki.fi>
parents: 3957
diff changeset
83 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
84
3985
38c352bb7bb7 Dotlock fixes
Timo Sirainen <tss@iki.fi>
parents: 3957
diff changeset
85 MEMBER(timeout) 120,
38c352bb7bb7 Dotlock fixes
Timo Sirainen <tss@iki.fi>
parents: 3957
diff changeset
86 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
87
3985
38c352bb7bb7 Dotlock fixes
Timo Sirainen <tss@iki.fi>
parents: 3957
diff changeset
88 MEMBER(callback) NULL,
38c352bb7bb7 Dotlock fixes
Timo Sirainen <tss@iki.fi>
parents: 3957
diff changeset
89 MEMBER(context) NULL,
38c352bb7bb7 Dotlock fixes
Timo Sirainen <tss@iki.fi>
parents: 3957
diff changeset
90
38c352bb7bb7 Dotlock fixes
Timo Sirainen <tss@iki.fi>
parents: 3957
diff changeset
91 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
92 };
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94 const struct dotlock_settings dbox_file_dotlock_set = {
3985
38c352bb7bb7 Dotlock fixes
Timo Sirainen <tss@iki.fi>
parents: 3957
diff changeset
95 MEMBER(temp_prefix) NULL,
38c352bb7bb7 Dotlock fixes
Timo Sirainen <tss@iki.fi>
parents: 3957
diff changeset
96 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
97
3985
38c352bb7bb7 Dotlock fixes
Timo Sirainen <tss@iki.fi>
parents: 3957
diff changeset
98 MEMBER(timeout) 120,
38c352bb7bb7 Dotlock fixes
Timo Sirainen <tss@iki.fi>
parents: 3957
diff changeset
99 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
100
3985
38c352bb7bb7 Dotlock fixes
Timo Sirainen <tss@iki.fi>
parents: 3957
diff changeset
101 MEMBER(callback) NULL,
38c352bb7bb7 Dotlock fixes
Timo Sirainen <tss@iki.fi>
parents: 3957
diff changeset
102 MEMBER(context) NULL,
38c352bb7bb7 Dotlock fixes
Timo Sirainen <tss@iki.fi>
parents: 3957
diff changeset
103
38c352bb7bb7 Dotlock fixes
Timo Sirainen <tss@iki.fi>
parents: 3957
diff changeset
104 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
105 };
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107 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
108 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
109 struct dbox_uidlist *uidlist;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111 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
112 uidlist->mbox = mbox;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113 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
114 uidlist->mtime = -1;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
115 uidlist->lock_fd = -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116 uidlist->entry_pool =
4056
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
117 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
118 uidlist->path =
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
119 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
120 DBOX_UIDLIST_FILENAME, NULL);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
121 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
122 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
123 return uidlist;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126 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
127 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128 i_assert(!uidlist->appending);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
130 array_free(&uidlist->entries);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
131 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
132 i_free(uidlist->path);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133 i_free(uidlist);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
135
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136 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
137 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138 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
139 struct seq_range *range;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140 unsigned int count;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
141
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
142 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
143 i_assert(count > 0);
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 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
146 return FALSE;
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-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
149 /* 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
150 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
151 } else {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152 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
153 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154 return TRUE;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156
3756
5fcf8e16ba8c Use binary search for finding entries
Timo Sirainen <tss@iki.fi>
parents: 3755
diff changeset
157 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
158 {
5fcf8e16ba8c Use binary search for finding entries
Timo Sirainen <tss@iki.fi>
parents: 3755
diff changeset
159 const unsigned int *file_seq = key;
3758
Timo Sirainen <tss@iki.fi>
parents: 3756
diff changeset
160 struct dbox_uidlist_entry *const *entry = p;
3756
5fcf8e16ba8c Use binary search for finding entries
Timo Sirainen <tss@iki.fi>
parents: 3755
diff changeset
161
3761
ef482c909771 When index files (dovecot.index and dbox index) aren't synced with each
Timo Sirainen <tss@iki.fi>
parents: 3758
diff changeset
162 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
163 }
5fcf8e16ba8c Use binary search for finding entries
Timo Sirainen <tss@iki.fi>
parents: 3755
diff changeset
164
4233
Timo Sirainen <tss@iki.fi>
parents: 4232
diff changeset
165 static void dbox_uidlist_update_last_uid(struct dbox_uidlist *uidlist,
Timo Sirainen <tss@iki.fi>
parents: 4232
diff changeset
166 const struct dbox_uidlist_entry *entry)
Timo Sirainen <tss@iki.fi>
parents: 4232
diff changeset
167 {
Timo Sirainen <tss@iki.fi>
parents: 4232
diff changeset
168 const struct seq_range *range;
Timo Sirainen <tss@iki.fi>
parents: 4232
diff changeset
169 unsigned int count;
Timo Sirainen <tss@iki.fi>
parents: 4232
diff changeset
170
Timo Sirainen <tss@iki.fi>
parents: 4232
diff changeset
171 range = array_get(&entry->uid_list, &count);
Timo Sirainen <tss@iki.fi>
parents: 4232
diff changeset
172 if (range[count-1].seq2 > uidlist->last_uid)
Timo Sirainen <tss@iki.fi>
parents: 4232
diff changeset
173 uidlist->last_uid = range[count-1].seq2;
Timo Sirainen <tss@iki.fi>
parents: 4232
diff changeset
174 }
Timo Sirainen <tss@iki.fi>
parents: 4232
diff changeset
175
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
176 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
177 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
178 {
3756
5fcf8e16ba8c Use binary search for finding entries
Timo Sirainen <tss@iki.fi>
parents: 3755
diff changeset
179 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
180 const struct seq_range *range;
4056
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
181 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
182
4233
Timo Sirainen <tss@iki.fi>
parents: 4232
diff changeset
183 dbox_uidlist_update_last_uid(uidlist, src_entry);
Timo Sirainen <tss@iki.fi>
parents: 4232
diff changeset
184
4056
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
185 entries = array_get_modifyable(&uidlist->entries, &count);
4226
83322a523c91 More fixes.
Timo Sirainen <tss@iki.fi>
parents: 4208
diff changeset
186 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
187 /* append new file sequence */
4056
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
188 idx = count;
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
189 } else {
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
190 pos = bsearch_insert_pos(&src_entry->file_seq, entries, count,
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
191 sizeof(*entries),
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
192 dbox_uidlist_entry_cmp);
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
193 idx = pos - entries;
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
194 }
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
195
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
196 if (idx == count || entries[idx]->file_seq != src_entry->file_seq) {
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
197 /* new entry */
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198 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
199 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
200 *dest_entry = *src_entry;
4226
83322a523c91 More fixes.
Timo Sirainen <tss@iki.fi>
parents: 4208
diff changeset
201 i_assert(idx < count || idx == 0 ||
83322a523c91 More fixes.
Timo Sirainen <tss@iki.fi>
parents: 4208
diff changeset
202 src_entry->file_seq > entries[idx-1]->file_seq);
83322a523c91 More fixes.
Timo Sirainen <tss@iki.fi>
parents: 4208
diff changeset
203 i_assert(idx == count ||
83322a523c91 More fixes.
Timo Sirainen <tss@iki.fi>
parents: 4208
diff changeset
204 src_entry->file_seq < entries[idx]->file_seq);
4056
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
205 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
206
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207 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
208 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
209 } else {
4056
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
210 /* merge to existing entry. UIDs must be growing since only
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
211 new mails are appended */
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
212 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
213 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
214 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
215 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
216 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
217
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218 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
219 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
220 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
221 mail_storage_set_critical(
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222 STORAGE(uidlist->mbox->storage),
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
223 "%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
224 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
225 return FALSE;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
226 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229 return TRUE;
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
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
232 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
233 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
234 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
235 struct seq_range range;
4208
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
236 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
237 uint32_t digit;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
238 int ret;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240 /* <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
241 t_push();
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242 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
243 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
244 struct seq_range, 8);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
245
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
246 /* get uid list */
4056
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
247 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
248 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
249 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
250 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
251 else {
4056
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
252 if (range.seq1 == 0) {
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
253 if (digit <= range.seq2) {
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
254 /* broken */
4208
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
255 error = t_strdup_printf("UID %u <= %u",
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
256 digit,
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
257 range.seq2);
4056
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
258 break;
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
259 }
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
260 range.seq1 = digit;
4056
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
261 }
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
262 if (*line == ',' || *line == ' ') {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
263 if (range.seq1 > digit) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
264 /* broken */
4208
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
265 error = t_strdup_printf("UID %u > %u",
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
266 range.seq1,
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
267 digit);
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268 break;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
270 range.seq2 = digit;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
271 array_append(&entry->uid_list, &range, 1);
4056
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
272 range.seq1 = 0;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
273
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
274 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
275 /* 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
276 uidlist->last_uid = digit;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
277 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
278
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
279 if (*line == ' ')
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
280 break;
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 digit = 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
283 }
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
4208
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
286 if (error == NULL) {
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
287 if (*line != ' ') {
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
288 error = *line == '\0' ? "File sequence missing" :
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
289 "Expecting space after UID list";
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
290 } else if (array_count(&entry->uid_list) == 0)
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
291 error = "UID list missing";
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
292 }
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
293
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
294 if (error != NULL) {
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
295 mail_storage_set_critical(STORAGE(uidlist->mbox->storage),
4208
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
296 "%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
297 t_pop();
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
298 return FALSE;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
299 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
300
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
301 /* get file seq */
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
302 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
303 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
304 entry->file_seq = digit;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
305
3812
2881f7e79098 Added rotation by number of days since file was created.
Timo Sirainen <tss@iki.fi>
parents: 3761
diff changeset
306 /* get create timestamp */
2881f7e79098 Added rotation by number of days since file was created.
Timo Sirainen <tss@iki.fi>
parents: 3761
diff changeset
307 line++;
2881f7e79098 Added rotation by number of days since file was created.
Timo Sirainen <tss@iki.fi>
parents: 3761
diff changeset
308 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
309 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
310
3812
2881f7e79098 Added rotation by number of days since file was created.
Timo Sirainen <tss@iki.fi>
parents: 3761
diff changeset
311 if (*line != ' ') {
2881f7e79098 Added rotation by number of days since file was created.
Timo Sirainen <tss@iki.fi>
parents: 3761
diff changeset
312 mail_storage_set_critical(STORAGE(uidlist->mbox->storage),
4208
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
313 "%s: Corrupted entry: Expecting space after timestamp",
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
314 uidlist->path);
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
315
3812
2881f7e79098 Added rotation by number of days since file was created.
Timo Sirainen <tss@iki.fi>
parents: 3761
diff changeset
316 t_pop();
2881f7e79098 Added rotation by number of days since file was created.
Timo Sirainen <tss@iki.fi>
parents: 3761
diff changeset
317 return FALSE;
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 /* get file size */
2881f7e79098 Added rotation by number of days since file was created.
Timo Sirainen <tss@iki.fi>
parents: 3761
diff changeset
320 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
321 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
322
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
323 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
324 t_pop();
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
325 return ret;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
326 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
327
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
328 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
329 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
330 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
331 const char *line;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
332 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
333 struct istream *input;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
334 struct stat st;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
335 int ret;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
336
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
337 if (uidlist->fd != -1) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
338 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
339 if (errno != ENOENT) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
340 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
341 "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
342 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
343 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
344 return 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
345 }
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 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
348 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
349 /* unchanged */
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
350 return 1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
351 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
352 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
353
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
354 uidlist->mtime = -1;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
355 if (uidlist->fd != -1) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
356 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
357 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
358 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
359
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
360 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
361 if (uidlist->fd == -1) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
362 if (errno == ENOENT)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
363 return 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
364
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
365 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
366 "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
367 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
368 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
369
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
370 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
371 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
372 "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
373 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
374 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
375 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
376 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
377
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
378 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
379
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
380 /* 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
381 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
382 used directly. */
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
383 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
384 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
385 &uid_validity, &last_uid,
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
386 &last_file_seq) != 4 ||
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
387 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
388 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
389 "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
390 uidlist->path, uidlist->version);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
391 ret = 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
392 } else {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
393 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
394
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
395 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
396 uidlist->last_uid : 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
397 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
398 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
399
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
400 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_uid = last_uid;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
402 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
403 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
404 array_clear(&uidlist->entries);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
405
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
406 ret = 1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
407 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
408 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
409 ret = 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
410 break;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
411 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
412 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
413
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
414 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
415 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
416 "%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
417 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
418 ret = 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
419 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
420 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
421 mail_storage_set_critical(storage,
4232
81ec8a2fbea9 Error message fixes
Timo Sirainen <tss@iki.fi>
parents: 4228
diff changeset
422 "%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
423 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
424 uidlist->last_file_seq);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
425 ret = 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
426 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
427
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
428 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
429 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
430 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
431
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
432 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
433 /* broken file */
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
434 (void)unlink(uidlist->path);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
435
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
436 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
437 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
438 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
439 uidlist->mtime = -1;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
440 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
441
4070
71b8faa84ec6 Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents: 4056
diff changeset
442 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
443 return ret;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
444 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
445
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
446 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
447 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
448 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
449
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
450 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
451 uidlist->path, 0,
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
452 &uidlist->dotlock);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
453 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
454 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
455 "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
456 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
457 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
458
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
459 return 0;
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 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
463 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
464 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
465
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
466 (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
467 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
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
470 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
471 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
472 unsigned int *idx_r)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
473 {
3756
5fcf8e16ba8c Use binary search for finding entries
Timo Sirainen <tss@iki.fi>
parents: 3755
diff changeset
474 struct dbox_uidlist_entry *const *entries, **entry;
3758
Timo Sirainen <tss@iki.fi>
parents: 3756
diff changeset
475 unsigned int count;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
476
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
477 entries = array_get(&uidlist->entries, &count);
3758
Timo Sirainen <tss@iki.fi>
parents: 3756
diff changeset
478 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
479 dbox_uidlist_entry_cmp);
5fcf8e16ba8c Use binary search for finding entries
Timo Sirainen <tss@iki.fi>
parents: 3755
diff changeset
480 if (entry == NULL)
5fcf8e16ba8c Use binary search for finding entries
Timo Sirainen <tss@iki.fi>
parents: 3755
diff changeset
481 return NULL;
5fcf8e16ba8c Use binary search for finding entries
Timo Sirainen <tss@iki.fi>
parents: 3755
diff changeset
482
5fcf8e16ba8c Use binary search for finding entries
Timo Sirainen <tss@iki.fi>
parents: 3755
diff changeset
483 *idx_r = entry - entries;
3758
Timo Sirainen <tss@iki.fi>
parents: 3756
diff changeset
484 return *entry;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
485 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
486
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
487 struct dbox_uidlist_entry *
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
488 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
489 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
490 unsigned int idx;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
491
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
492 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
493 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
494
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
495 static time_t get_min_timestamp(unsigned int days)
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
496 {
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
497 struct tm tm;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
498 time_t stamp;
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 if (days == 0)
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
501 return 0;
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 /* get beginning of today */
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
504 tm = *localtime(&ioloop_time);
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
505 tm.tm_hour = 0;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
506 tm.tm_min = 0;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
507 tm.tm_sec = 0;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
508 stamp = mktime(&tm);
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
509 if (stamp == (time_t)-1)
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
510 i_panic("mktime(today) failed");
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
511
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
512 return stamp - (3600*24 * (days-1));
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
513 }
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
514
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
515 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
516 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
517 {
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 *ctx;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
519 pool_t pool;
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 i_assert(!uidlist->appending);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
522
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
523 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
524 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
525 ctx->pool = pool;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
526 ctx->uidlist = uidlist;
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
527 ctx->min_usable_timestamp =
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
528 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
529 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
530 return ctx;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
531 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
532
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
533 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
534 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
535 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
536 struct ostream *output;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
537 struct stat st, st2;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
538 const char *lock_path;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
539 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
540 string_t *str;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
541 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
542 int ret = 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
543
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
544 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
545
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
546 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
547
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
548 t_push();
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
549 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
550
4228
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
551 /* 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
552 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
553 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
554 uidlist->last_file_seq);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
555 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
556
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
557 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
558 for (i = 0; i < count; i++) {
4233
Timo Sirainen <tss@iki.fi>
parents: 4232
diff changeset
559 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
560 str_truncate(str, 0);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
561
4226
83322a523c91 More fixes.
Timo Sirainen <tss@iki.fi>
parents: 4208
diff changeset
562 i_assert(i == 0 ||
83322a523c91 More fixes.
Timo Sirainen <tss@iki.fi>
parents: 4208
diff changeset
563 entries[i]->file_seq > entries[i-1]->file_seq);
83322a523c91 More fixes.
Timo Sirainen <tss@iki.fi>
parents: 4208
diff changeset
564
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
565 /* <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
566 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
567 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
568 for (ui = 0; ui < range_count; ui++) {
4233
Timo Sirainen <tss@iki.fi>
parents: 4232
diff changeset
569 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
570 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
571 str_append_c(str, ',');
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
572 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
573 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
574 else {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
575 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
576 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
577 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
578 }
4176
513aa0df39ee dbox fixes
Timo Sirainen <tss@iki.fi>
parents: 4152
diff changeset
579 str_printfa(str, " %u %lu %"PRIuUOFF_T, entries[i]->file_seq,
513aa0df39ee dbox fixes
Timo Sirainen <tss@iki.fi>
parents: 4152
diff changeset
580 (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
581 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
582 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
583 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
584 break;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
585 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
586 t_pop();
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
587
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
588 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
589 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
590 "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
591 ret = -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
592 }
4070
71b8faa84ec6 Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents: 4056
diff changeset
593 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
594
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
595 if (ret < 0)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
596 return -1;
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 /* 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
599 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
600 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
601 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
602 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
603 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
604 "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
605 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
606 }
ef482c909771 When index files (dovecot.index and dbox index) aren't synced with each
Timo Sirainen <tss@iki.fi>
parents: 3758
diff changeset
607 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
608 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
609 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
610 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
611 "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
612 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
613 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
614
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
615 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
616 struct utimbuf ut;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
617
4056
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
618 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
619 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
620 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
621
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
622 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
623 mail_storage_set_critical(
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
624 STORAGE(uidlist->mbox->storage),
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
625 "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
626 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
627 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
628 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
629
3761
ef482c909771 When index files (dovecot.index and dbox index) aren't synced with each
Timo Sirainen <tss@iki.fi>
parents: 3758
diff changeset
630 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
631 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
632
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
633 /* 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
634 uidlist */
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
635 uidlist->lock_fd = -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
636 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
637 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
638
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
639 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
640 return 0;
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
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
643 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
644 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
645 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
646 const unsigned int *seqs;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
647 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
648
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
649 str_truncate(str, 0);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
650
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
651 /* build uidlist string */
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
652 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
653 start = 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
654 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
655 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
656 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
657 continue;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
658 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
659
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
660 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
661 str_append_c(str, ',');
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
662 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
663 if (seq != start)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
664 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
665 start = seq + 1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
666 }
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", 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
668
3812
2881f7e79098 Added rotation by number of days since file was created.
Timo Sirainen <tss@iki.fi>
parents: 3761
diff changeset
669 /* 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
670 str_printfa(str, " %s %s", dec2str(save_file->file->create_time),
4304
3bb4f35b99d4 dbox_rotate_size checking was wrong.
Timo Sirainen <tss@iki.fi>
parents: 4245
diff changeset
671 dec2str(save_file->file->append_offset));
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
672 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
673 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
674
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
675 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
676 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
677 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
678 string_t *str;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
679 unsigned int i, count;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
680 uint32_t uid_start;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
681
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
682 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
683
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
684 t_push();
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
685 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
686 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
687 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
688 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
689 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
690 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
691 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
692 t_pop();
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
693 }
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 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
696 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
697 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
698 struct ostream *output;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
699 struct utimbuf ut;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
700 struct stat st;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
701 unsigned int i, count;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
702 uint32_t uid_start;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
703 string_t *str;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
704 int ret = 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
705
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
706 i_assert(ctx->uidlist->fd != -1);
4056
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
707 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
708
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
709 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
710 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
711 "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
712 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
713 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
714 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
715
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
716 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
717
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
718 /* 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
719 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
720 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
721 t_push();
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
722 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
723 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
724 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
725 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
726 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
727 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
728 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
729 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
730 t_pop();
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
731
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
732 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
733 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
734 "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
735 ret = -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
736 }
4070
71b8faa84ec6 Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents: 4056
diff changeset
737 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
738
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
739 if (ret < 0)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
740 return -1;
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 /* 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
743 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
744 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
745 "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
746 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
747 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
748
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
749 ut.actime = ioloop_time;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
750 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
751 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
752 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
753 "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
754 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
755 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
756
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
757 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
758 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
759 return 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
760 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
761
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
762 static int
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
763 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
764 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
765 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
766 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
767 unsigned int i, count;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
768 int ret = 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
769
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
770 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
771 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
772 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
773 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
774
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
775 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
776 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
777 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
778 append_offset_hex)) < 0) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
779 mail_storage_set_critical(
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
780 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
781 "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
782 files[i]->file->path);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
783 ret = -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
784 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
785 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
786 return ret;
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
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
789 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
790 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
791 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
792 int ret;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
793
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
794 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
795 /* nothing actually appended */
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
796 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
797 *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
798 return 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
799 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
800
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
801 i_assert(ctx->locked);
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 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
804 ret = -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
805 else {
4056
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
806 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
807 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
808 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
809 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
810 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
811 ctx->locked = FALSE;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
812 } else {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
813 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
814 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
815 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
816
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
817 *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
818 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
819 return ret;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
820 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
821
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
822 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
823 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
824 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
825 unsigned int i, count;
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 /* unlock files */
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
828 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
829 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
830 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
831
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
832 if (ctx->locked)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
833 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
834 ctx->uidlist->appending = FALSE;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
835 pool_unref(ctx->pool);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
836 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
837
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
838 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
839 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
840 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
841 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
842 struct stat st;
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 if (file->fd != -1)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
845 return 0;
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 /* 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
848 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
849 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
850 if (file->fd == -1) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
851 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
852 "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
853 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
854 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
855
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
856 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
857 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
858 "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
859 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
860 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
861
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
862 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
863 !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
864 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
865 "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
866 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
867 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
868 return 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
869 }
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 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
872 uint32_t file_seq)
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 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
875 unsigned int i, count;
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 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
878 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
879 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
880 return TRUE;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
881 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
882 return FALSE;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
883 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
884
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
885 #define DBOX_CAN_APPEND(ctx, create_time, file_size) \
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
886 (((create_time) >= (ctx)->min_usable_timestamp && \
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
887 (file_size) < (ctx)->uidlist->mbox->rotate_size) || \
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
888 (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
889
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
890 static int
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
891 dbox_file_append(struct dbox_uidlist_append_ctx *ctx,
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
892 const char *path, struct dbox_uidlist_entry *entry,
4208
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
893 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
894 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
895 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
896 struct dbox_file *file;
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
897 int fd;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
898
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
899 *file_r = NULL;
3812
2881f7e79098 Added rotation by number of days since file was created.
Timo Sirainen <tss@iki.fi>
parents: 3761
diff changeset
900
4208
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
901 fd = open(path, O_RDWR | (existing ? 0 : O_CREAT), 0600);
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
902 if (fd == -1) {
4208
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
903 if (errno == ENOENT && existing) {
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
904 /* the file was unlinked just now, update its size
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
905 so that we don't get back here. */
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
906 entry->file_size = (uoff_t)-1;
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
907 return 0;
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
908 }
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
909 mail_storage_set_critical(STORAGE(mbox->storage),
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
910 "open(%s) failed: %m", path);
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
911 return -1;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
912 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
913
4152
e2edd333c473 Added MAILBOX_OPEN_KEEP_LOCKED flag to mailbox opening and implemented it
Timo Sirainen <tss@iki.fi>
parents: 4114
diff changeset
914 if (fstat(fd, st) < 0) {
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
915 mail_storage_set_critical(STORAGE(mbox->storage),
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
916 "fstat(%s) failed: %m", path);
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
917 (void)close(fd);
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
918 return -1;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
919 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
920
4109
988a8ef1deea Some fixes to get dbox code working better. Still needs some work though..
Timo Sirainen <tss@iki.fi>
parents: 4070
diff changeset
921 file = i_new(struct dbox_file, 1);
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
922 file->path = i_strdup(path);
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
923 file->fd = fd;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
924
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
925 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
926 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
927 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
928 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
929 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
930 dbox_file_close(file);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
931 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
932 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
933 } else {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
934 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
935 dbox_file_close(file);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
936 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
937 }
4109
988a8ef1deea Some fixes to get dbox code working better. Still needs some work though..
Timo Sirainen <tss@iki.fi>
parents: 4070
diff changeset
938
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
939 if (entry != NULL) {
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
940 entry->create_time = file->create_time;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
941 entry->file_size = file->append_offset;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
942 }
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
943
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
944 if (!DBOX_CAN_APPEND(ctx, file->create_time,
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
945 file->append_offset)) {
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
946 dbox_file_close(file);
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
947 return 0;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
948 }
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
949 }
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
950
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
951 *file_r = file;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
952 return 1;
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
4228
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
955 static int dbox_file_seq_was_used(struct dbox_mailbox *mbox, const char *path,
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
956 uint32_t file_seq)
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
957 {
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
958 struct stat st;
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
959
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
960 if (stat(path, &st) == 0)
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
961 return 0;
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
962 if (errno != ENOENT) {
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
963 mail_storage_set_critical(STORAGE(mbox->storage),
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
964 "stat(%s) failed: %m", path);
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
965 return -1;
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
966 }
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
967
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
968 /* doesn't exist, make sure that index's last file seq is lower */
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
969 if (dbox_uidlist_read(mbox->uidlist) < 0)
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
970 return -1;
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
971 return file_seq < mbox->uidlist->last_file_seq ? 1 : 0;
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
972 }
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
973
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
974 static int
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
975 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
976 uint32_t *file_seq_r, struct dbox_uidlist_entry **entry_r,
4208
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
977 struct dotlock **dotlock_r, bool *existing_r)
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
978 {
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
979 struct dbox_mailbox *mbox = ctx->uidlist->mbox;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
980 struct dbox_uidlist_entry *const *entries;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
981 unsigned int i, count;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
982 uint32_t file_seq;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
983 int ret;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
984
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
985 entries = array_get(&ctx->uidlist->entries, &count);
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
986 for (i = 0;; i++) {
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
987 file_seq = 0;
4208
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
988 *existing_r = FALSE;
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
989 for (; i < count; i++) {
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
990 if (DBOX_CAN_APPEND(ctx, entries[i]->create_time,
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
991 entries[i]->file_size) &&
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
992 !dbox_uidlist_files_lookup(ctx,
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
993 entries[i]->file_seq)) {
4208
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
994 *existing_r = TRUE;
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
995 file_seq = entries[i]->file_seq;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
996 break;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
997 }
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
998 }
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
999
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1000 if (file_seq == 0) {
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1001 /* create new file */
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1002 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
1003 }
988a8ef1deea Some fixes to get dbox code working better. Still needs some work though..
Timo Sirainen <tss@iki.fi>
parents: 4070
diff changeset
1004
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1005 /* try locking the file. */
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1006 str_truncate(path, 0);
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1007 str_printfa(path, "%s/"DBOX_MAILDIR_NAME"/"
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1008 DBOX_MAIL_FILE_FORMAT, mbox->path, file_seq);
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1009 ret = file_dotlock_create(&dbox_file_dotlock_set, str_c(path),
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1010 DOTLOCK_CREATE_FLAG_NONBLOCK,
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1011 dotlock_r);
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1012 if (ret > 0) {
4228
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
1013 /* success. but since we don't have uidlist locked
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
1014 here, it's possible that the file was just deleted
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
1015 by someone else. in that case we really don't want
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
1016 to create the file back and cause problems. */
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
1017 ret = dbox_file_seq_was_used(mbox, str_c(path),
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
1018 file_seq);
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
1019 if (ret == 0)
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
1020 break;
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
1021
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
1022 /* error / it was used, continue with another
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
1023 file sequence */
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
1024 file_dotlock_delete(dotlock_r);
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
1025
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
1026 if (ret < 0)
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
1027 return -1;
Timo Sirainen <tss@iki.fi>
parents: 4226
diff changeset
1028 } else if (ret < 0) {
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1029 mail_storage_set_critical(STORAGE(mbox->storage),
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1030 "file_dotlock_create(%s) failed: %m",
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1031 str_c(path));
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1032 return -1;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1033 }
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1034
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1035 /* lock already exists, try next file */
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 *file_seq_r = file_seq;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1039 *entry_r = i < count ? entries[i] : NULL;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1040 return 0;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1041 }
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1042
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1043 int dbox_uidlist_append_locked(struct dbox_uidlist_append_ctx *ctx,
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1044 struct dbox_file **file_r)
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 struct dbox_save_file *const *files, *save_file;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1047 struct dbox_uidlist_entry *entry;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1048 struct dbox_file *file = NULL;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1049 struct dotlock *dotlock = NULL;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1050 struct ostream *output;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1051 string_t *path;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1052 unsigned int i, count;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1053 struct stat st;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1054 uint32_t file_seq;
4208
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
1055 bool existing;
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1056 int ret;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1057
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1058 /* check first from already opened files */
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1059 files = array_get(&ctx->files, &count);
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1060 for (i = 0; i < count; i++) {
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1061 if (DBOX_CAN_APPEND(ctx, files[i]->file->create_time,
4304
3bb4f35b99d4 dbox_rotate_size checking was wrong.
Timo Sirainen <tss@iki.fi>
parents: 4245
diff changeset
1062 files[i]->file->append_offset)) {
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1063 if (dbox_reopen_file(ctx, files[i]) < 0)
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1064 return -1;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1065
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1066 *file_r = file = files[i]->file;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1067 o_stream_seek(file->output, file->append_offset);
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1068 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
1069 }
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1070 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1071
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1072 /* check from other existing files. use uidlist's file_size field.
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1073 it's not completely trustworthy though. */
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1074 path = str_new(ctx->pool, 64);
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1075 do {
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1076 if (dotlock != NULL)
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1077 file_dotlock_delete(&dotlock);
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1078 if (dbox_file_append_lock(ctx, path, &file_seq,
4208
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
1079 &entry, &dotlock, &existing) < 0)
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1080 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
1081 } while ((ret = dbox_file_append(ctx, str_c(path), entry,
4208
Timo Sirainen <tss@iki.fi>
parents: 4176
diff changeset
1082 &st, &file, existing)) == 0);
4114
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1083
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1084 if (ret < 0) {
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1085 file_dotlock_delete(&dotlock);
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1086 dbox_file_close(file);
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1087 return -1;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1088 }
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1089 file->file_seq = file_seq;
d1c27abc6ebc Fixes and cleanups.
Timo Sirainen <tss@iki.fi>
parents: 4109
diff changeset
1090
3956
a52c36c51ff2 Support storing keywords in dbox files. Doesn't yet work while saving.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1091 /* 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
1092 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
1093 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
1094 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
1095 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
1096
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_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
1098
4109
988a8ef1deea Some fixes to get dbox code working better. Still needs some work though..
Timo Sirainen <tss@iki.fi>
parents: 4070
diff changeset
1099 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
1100 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
1101 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
1102 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
1103 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
1104 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
1105
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1106 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
1107 *file_r = file;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1108 return 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1109 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1110
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1111 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
1112 struct dbox_file *file)
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 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
1115 unsigned int i, count;
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 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
1118 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
1119 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
1120 save_file = files[i];
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1121 break;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1122 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1123 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1124 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
1125
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1126 ctx->mail_count++;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1127 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
1128
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1129 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
1130 }
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 struct dbox_file *
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1133 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
1134 uint32_t file_seq)
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1135 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1136 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
1137 unsigned int i, count;
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 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
1140 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
1141 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
1142 return files[i]->file;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1143 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1144
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1145 i_unreached();
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1146 return NULL;
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
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1149 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
1150 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1151 /* 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
1152 actually returns a new unused file sequence. */
4245
Timo Sirainen <tss@iki.fi>
parents: 4233
diff changeset
1153 i_assert(uidlist->file_seq_highwater >= 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
1154 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
1155 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1156
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1157 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
1158 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
1159 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1160 int ret;
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 /* 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
1163 committed or rollbacked */
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1164 if (!ctx->locked) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1165 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
1166 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1167 ctx->locked = TRUE;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1168
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1169 /* 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
1170 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
1171 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1172 if (ret == 0) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1173 /* file is deleted */
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1174 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
1175 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1176 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1177
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
1178 *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
1179 *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
1180 return 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1181 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1182
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1183 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
1184 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
1185 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
1186 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1187 int ret;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1188
3761
ef482c909771 When index files (dovecot.index and dbox index) aren't synced with each
Timo Sirainen <tss@iki.fi>
parents: 3758
diff changeset
1189 *mtime_r = -1;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1190 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
1191 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1192
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1193 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
1194 dbox_uidlist_unlock(uidlist);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1195 return -1;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1196 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1197
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1198 if (ret == 0) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1199 /* file is deleted */
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1200 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
1201 } else {
ef482c909771 When index files (dovecot.index and dbox index) aren't synced with each
Timo Sirainen <tss@iki.fi>
parents: 3758
diff changeset
1202 *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
1203 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1204
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1205 *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
1206 (*ctx_r)->uidlist = uidlist;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1207 return 0;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1208 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1209
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1210 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
1211 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1212 int ret = 0;
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 if (ctx->modified) {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1215 /* 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
1216 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
1217 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1218
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1219 *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
1220
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1221 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
1222 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
1223 i_free(ctx);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1224 return ret;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1225 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1226
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1227 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
1228 {
3758
Timo Sirainen <tss@iki.fi>
parents: 3756
diff changeset
1229 array_clear(&ctx->uidlist->entries);
Timo Sirainen <tss@iki.fi>
parents: 3756
diff changeset
1230 ctx->uidlist->ino = 0;
Timo Sirainen <tss@iki.fi>
parents: 3756
diff changeset
1231 ctx->uidlist->mtime = 0;
Timo Sirainen <tss@iki.fi>
parents: 3756
diff changeset
1232
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1233 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
1234 i_free(ctx);
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1235 }
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1236
3761
ef482c909771 When index files (dovecot.index and dbox index) aren't synced with each
Timo Sirainen <tss@iki.fi>
parents: 3758
diff changeset
1237 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
1238 {
ef482c909771 When index files (dovecot.index and dbox index) aren't synced with each
Timo Sirainen <tss@iki.fi>
parents: 3758
diff changeset
1239 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
1240 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
1241 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
1242
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->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
1244 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
1245 }
ef482c909771 When index files (dovecot.index and dbox index) aren't synced with each
Timo Sirainen <tss@iki.fi>
parents: 3758
diff changeset
1246
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1247 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
1248 {
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1249 ctx->modified = TRUE;
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
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1252 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
1253 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
1254 {
3758
Timo Sirainen <tss@iki.fi>
parents: 3756
diff changeset
1255 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
1256 struct dbox_uidlist_entry *new_entry;
3758
Timo Sirainen <tss@iki.fi>
parents: 3756
diff changeset
1257 unsigned int count;
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1258
4056
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
1259 i_assert(array_count(&entry->uid_list) > 0);
Timo Sirainen <tss@iki.fi>
parents: 3985
diff changeset
1260
3720
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1261 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
1262 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
1263 *new_entry = *entry;
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1264
fd0986477809 Initial implementation of Dovecot's own high performance file format, named
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1265 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
1266 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
1267 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
1268
4233
Timo Sirainen <tss@iki.fi>
parents: 4232
diff changeset
1269 if (new_entry->file_seq > ctx->uidlist->last_file_seq)
Timo Sirainen <tss@iki.fi>
parents: 4232
diff changeset
1270 ctx->uidlist->last_file_seq = new_entry->file_seq;
4245
Timo Sirainen <tss@iki.fi>
parents: 4233
diff changeset
1271 if (new_entry->file_seq > ctx->uidlist->file_seq_highwater)
Timo Sirainen <tss@iki.fi>
parents: 4233
diff changeset
1272 ctx->uidlist->file_seq_highwater = new_entry->file_seq;
4233
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 }