[dovecot-cvs] dovecot/src/lib-storage/index/maildir
maildir-storage.c, 1.73, 1.74 maildir-sync.c, 1.21,
1.22 maildir-uidlist.c, 1.21, 1.22 maildir-uidlist.h, 1.7, 1.8
cras at procontrol.fi
cras at procontrol.fi
Mon May 24 05:29:45 EEST 2004
Update of /home/cvs/dovecot/src/lib-storage/index/maildir
In directory talvi:/tmp/cvs-serv27871/lib-storage/index/maildir
Modified Files:
maildir-storage.c maildir-sync.c maildir-uidlist.c
maildir-uidlist.h
Log Message:
Some more UIDVALIDITY issues fixed.
Index: maildir-storage.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/maildir/maildir-storage.c,v
retrieving revision 1.73
retrieving revision 1.74
diff -u -d -r1.73 -r1.74
--- a/maildir-storage.c 24 May 2004 01:50:17 -0000 1.73
+++ b/maildir-storage.c 24 May 2004 02:29:43 -0000 1.74
@@ -407,7 +407,6 @@
{
struct index_mailbox *ibox;
struct mail_index *index;
- const struct mail_index_header *hdr;
const char *path, *index_dir, *control_dir;
struct stat st;
@@ -422,17 +421,12 @@
if (ibox == NULL)
return NULL;
- if (mail_index_get_header(ibox->view, &hdr) < 0) {
- index_storage_mailbox_free(&ibox->box);
- return NULL;
- }
-
ibox->path = i_strdup(path);
ibox->control_dir = i_strdup(control_dir);
ibox->get_recent_count = maildir_get_recent_count;
ibox->mail_interface = &maildir_mail;
- ibox->uidlist = maildir_uidlist_init(ibox, hdr->uid_validity);
+ ibox->uidlist = maildir_uidlist_init(ibox);
/* for shared mailboxes get the create mode from the
permissions of dovecot-shared file */
Index: maildir-sync.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/maildir/maildir-sync.c,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -d -r1.21 -r1.22
--- a/maildir-sync.c 24 May 2004 01:50:17 -0000 1.21
+++ b/maildir-sync.c 24 May 2004 02:29:43 -0000 1.22
@@ -593,7 +593,8 @@
i_assert(ret == 0); /* view is locked, can't happen */
uid_validity = maildir_uidlist_get_uid_validity(ibox->uidlist);
- if (uid_validity != hdr->uid_validity && hdr->next_uid != 1) {
+ if (uid_validity != hdr->uid_validity &&
+ uid_validity != 0 && hdr->uid_validity != 0) {
/* uidvalidity changed and mailbox isn't being initialized,
index must be rebuilt */
mail_storage_set_critical(ibox->box.storage,
@@ -737,7 +738,22 @@
&sync_stamp, sizeof(sync_stamp));
}
- if (uid_validity != hdr->uid_validity) {
+ if (hdr->uid_validity == 0) {
+ /* get the initial uidvalidity */
+ if (maildir_uidlist_update(ibox->uidlist) < 0)
+ ret = -1;
+ uid_validity = maildir_uidlist_get_uid_validity(ibox->uidlist);
+ if (uid_validity == 0) {
+ uid_validity = ioloop_time;
+ maildir_uidlist_set_uid_validity(ibox->uidlist,
+ uid_validity);
+ }
+ } else if (uid_validity == 0) {
+ maildir_uidlist_set_uid_validity(ibox->uidlist,
+ hdr->uid_validity);
+ }
+
+ if (uid_validity != hdr->uid_validity && uid_validity != 0) {
mail_index_update_header(trans,
offsetof(struct mail_index_header, uid_validity),
&uid_validity, sizeof(uid_validity));
Index: maildir-uidlist.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/maildir/maildir-uidlist.c,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -d -r1.21 -r1.22
--- a/maildir-uidlist.c 24 May 2004 01:50:17 -0000 1.21
+++ b/maildir-uidlist.c 24 May 2004 02:29:43 -0000 1.22
@@ -45,6 +45,7 @@
unsigned int initial_read:1;
unsigned int initial_sync:1;
+ unsigned int file_missing:1;
};
struct maildir_uidlist_sync_ctx {
@@ -109,8 +110,7 @@
uidlist->lock_fd = -1;
}
-struct maildir_uidlist *
-maildir_uidlist_init(struct index_mailbox *ibox, uint32_t uid_validity)
+struct maildir_uidlist *maildir_uidlist_init(struct index_mailbox *ibox)
{
struct maildir_uidlist *uidlist;
@@ -124,7 +124,6 @@
uidlist->files = hash_create(default_pool, default_pool, 4096,
maildir_hash, maildir_cmp);
- uidlist->uid_validity = uid_validity;
uidlist->next_uid = 1;
return uidlist;
@@ -258,9 +257,11 @@
"open(%s) failed: %m", uidlist->fname);
return -1;
}
+ uidlist->file_missing = TRUE;
uidlist->initial_read = TRUE;
return 0;
}
+ uidlist->file_missing = FALSE;
if (fstat(fd, &st) < 0) {
mail_storage_set_critical(storage,
@@ -422,6 +423,12 @@
return uidlist->uid_validity;
}
+void maildir_uidlist_set_uid_validity(struct maildir_uidlist *uidlist,
+ uint32_t uid_validity)
+{
+ uidlist->uid_validity = uid_validity;
+}
+
uint32_t maildir_uidlist_get_next_uid(struct maildir_uidlist *uidlist)
{
return !uidlist->initial_read ? 0 : uidlist->next_uid;
@@ -439,7 +446,10 @@
const char *filename, *flags_str;
int ret = 0;
- uidlist->version = 2;
+ uidlist->version = 2;
+
+ if (uidlist->uid_validity == 0)
+ uidlist->uid_validity = ioloop_time;
str = t_str_new(4096);
str_printfa(str, "%u %u %u\n", uidlist->version,
@@ -516,6 +526,8 @@
mail_storage_set_critical(ibox->box.storage,
"file_dotlock_replace(%s) failed: %m", db_path);
ret = -1;
+ } else {
+ uidlist->file_missing = FALSE;
}
} else {
(void)close(uidlist->lock_fd);
@@ -624,6 +636,12 @@
}
ctx->new_files_count++;
+ if (uidlist->record_pool == NULL) {
+ uidlist->record_pool =
+ pool_alloconly_create("uidlist record_pool",
+ 1024);
+ }
+
rec = p_new(uidlist->record_pool,
struct maildir_uidlist_rec, 1);
rec->uid = (uint32_t)-1;
Index: maildir-uidlist.h
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/maildir/maildir-uidlist.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- a/maildir-uidlist.h 24 May 2004 01:50:17 -0000 1.7
+++ b/maildir-uidlist.h 24 May 2004 02:29:43 -0000 1.8
@@ -13,8 +13,7 @@
int maildir_uidlist_try_lock(struct maildir_uidlist *uidlist);
void maildir_uidlist_unlock(struct maildir_uidlist *uidlist);
-struct maildir_uidlist *
-maildir_uidlist_init(struct index_mailbox *ibox, uint32_t uid_validity);
+struct maildir_uidlist *maildir_uidlist_init(struct index_mailbox *ibox);
void maildir_uidlist_deinit(struct maildir_uidlist *uidlist);
/* Returns -1 if error, 0 if file is broken or lost, 1 if ok. */
@@ -32,6 +31,9 @@
uint32_t maildir_uidlist_get_uid_validity(struct maildir_uidlist *uidlist);
uint32_t maildir_uidlist_get_next_uid(struct maildir_uidlist *uidlist);
+void maildir_uidlist_set_uid_validity(struct maildir_uidlist *uidlist,
+ uint32_t uid_validity);
+
/* Sync uidlist with what's actually on maildir. */
struct maildir_uidlist_sync_ctx *
maildir_uidlist_sync_init(struct maildir_uidlist *uidlist, int partial);
More information about the dovecot-cvs
mailing list