[dovecot-cvs] dovecot/src/lib-storage/index/maildir
maildir-storage.c, 1.72, 1.73 maildir-sync.c, 1.20,
1.21 maildir-uidlist.c, 1.20, 1.21 maildir-uidlist.h, 1.6, 1.7
cras at procontrol.fi
cras at procontrol.fi
Mon May 24 04:50:19 EEST 2004
- Previous message: [dovecot-cvs] dovecot/src/lib-storage/index index-sync.c,1.34,1.35
- Next message: [dovecot-cvs] dovecot/src/lib-index mail-index-lock.c, 1.16,
1.17 mail-index-sync-private.h, 1.6,
1.7 mail-index-sync-update.c, 1.16, 1.17 mail-index-sync.c,
1.16, 1.17 mail-index-transaction-private.h, 1.2,
1.3 mail-index-transaction.c, 1.6,
1.7 mail-index-view-private.h, 1.5, 1.6 mail-index-view-sync.c,
1.10, 1.11 mail-index.c, 1.123, 1.124 mail-index.h, 1.110,
1.111 mail-transaction-log-view.c, 1.11,
1.12 mail-transaction-log.c, 1.29, 1.30 mail-transaction-log.h,
1.9, 1.10 mail-transaction-util.c, 1.7,
1.8 mail-transaction-util.h, 1.3, 1.4
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
Update of /home/cvs/dovecot/src/lib-storage/index/maildir
In directory talvi:/tmp/cvs-serv13926/lib-storage/index/maildir
Modified Files:
maildir-storage.c maildir-sync.c maildir-uidlist.c
maildir-uidlist.h
Log Message:
Index header changes now go through transaction log. Removed the kludgy
parameters for mail_index_sync_end(). Removed code duplication of syncing
index root mapping and view mapping. Some fixes to handling uidvalidity and
nextuid in syncing.
Index: maildir-storage.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/maildir/maildir-storage.c,v
retrieving revision 1.72
retrieving revision 1.73
diff -u -d -r1.72 -r1.73
--- a/maildir-storage.c 9 May 2004 23:32:44 -0000 1.72
+++ b/maildir-storage.c 24 May 2004 01:50:17 -0000 1.73
@@ -407,6 +407,7 @@
{
struct index_mailbox *ibox;
struct mail_index *index;
+ const struct mail_index_header *hdr;
const char *path, *index_dir, *control_dir;
struct stat st;
@@ -421,12 +422,17 @@
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);
+ ibox->uidlist = maildir_uidlist_init(ibox, hdr->uid_validity);
/* 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.20
retrieving revision 1.21
diff -u -d -r1.20 -r1.21
--- a/maildir-sync.c 22 May 2004 22:36:46 -0000 1.20
+++ b/maildir-sync.c 24 May 2004 01:50:17 -0000 1.21
@@ -179,6 +179,7 @@
#include "maildir-uidlist.h"
#include <stdio.h>
+#include <stddef.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/stat.h>
@@ -357,7 +358,7 @@
}
if (mail_index_transaction_commit(ctx.trans, &seq, &offset) < 0)
ret = -1;
- if (mail_index_sync_end(ctx.sync_ctx, 0, 0) < 0)
+ if (mail_index_sync_end(ctx.sync_ctx) < 0)
ret = -1;
}
@@ -575,7 +576,7 @@
const char *filename;
enum mail_flags flags;
keywords_mask_t keywords;
- uint32_t sync_stamp;
+ uint32_t uid_validity, next_uid;
int ret;
memset(&sync_ctx, 0, sizeof(sync_ctx));
@@ -591,6 +592,18 @@
ret = mail_index_get_header(view, &hdr);
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) {
+ /* uidvalidity changed and mailbox isn't being initialized,
+ index must be rebuilt */
+ mail_storage_set_critical(ibox->box.storage,
+ "Maildir sync: UIDVALIDITY changed (%u -> %u)",
+ hdr->uid_validity, uid_validity);
+ mail_index_mark_corrupted(ibox->index);
+ (void)mail_index_sync_end(sync_ctx.sync_ctx);
+ return -1;
+ }
+
trans = mail_index_transaction_begin(view, FALSE);
sync_ctx.trans = trans;
@@ -633,7 +646,6 @@
}
if (mail_index_lookup(view, seq, &rec) < 0) {
- mail_storage_set_index_error(ibox);
ret = -1;
break;
}
@@ -717,6 +729,27 @@
}
}
+ if (ibox->dirty_cur_time == 0) {
+ uint32_t sync_stamp = ibox->last_cur_mtime;
+
+ mail_index_update_header(trans,
+ offsetof(struct mail_index_header, sync_stamp),
+ &sync_stamp, sizeof(sync_stamp));
+ }
+
+ if (uid_validity != hdr->uid_validity) {
+ mail_index_update_header(trans,
+ offsetof(struct mail_index_header, uid_validity),
+ &uid_validity, sizeof(uid_validity));
+ }
+
+ next_uid = maildir_uidlist_get_next_uid(ibox->uidlist);
+ if (next_uid != 0 && hdr->next_uid != next_uid) {
+ mail_index_update_header(trans,
+ offsetof(struct mail_index_header, next_uid),
+ &next_uid, sizeof(next_uid));
+ }
+
if (ret < 0)
mail_index_transaction_rollback(trans);
else {
@@ -724,15 +757,14 @@
uoff_t offset;
if (mail_index_transaction_commit(trans, &seq, &offset) < 0)
- mail_storage_set_index_error(ibox);
+ ret = -1;
else if (seq != 0) {
ibox->commit_log_file_seq = seq;
ibox->commit_log_file_offset = offset;
}
}
- sync_stamp = ibox->dirty_cur_time != 0 ? 0 : ibox->last_cur_mtime;
- if (mail_index_sync_end(sync_ctx.sync_ctx, sync_stamp, 0) < 0)
+ if (mail_index_sync_end(sync_ctx.sync_ctx) < 0)
ret = -1;
if (ret == 0) {
Index: maildir-uidlist.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/maildir/maildir-uidlist.c,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -d -r1.20 -r1.21
--- a/maildir-uidlist.c 22 May 2004 22:36:46 -0000 1.20
+++ b/maildir-uidlist.c 24 May 2004 01:50:17 -0000 1.21
@@ -109,7 +109,8 @@
uidlist->lock_fd = -1;
}
-struct maildir_uidlist *maildir_uidlist_init(struct index_mailbox *ibox)
+struct maildir_uidlist *
+maildir_uidlist_init(struct index_mailbox *ibox, uint32_t uid_validity)
{
struct maildir_uidlist *uidlist;
@@ -123,7 +124,7 @@
uidlist->files = hash_create(default_pool, default_pool, 4096,
maildir_hash, maildir_cmp);
- uidlist->uid_validity = ioloop_time;
+ uidlist->uid_validity = uid_validity;
uidlist->next_uid = 1;
return uidlist;
@@ -416,6 +417,16 @@
return count;
}
+uint32_t maildir_uidlist_get_uid_validity(struct maildir_uidlist *uidlist)
+{
+ return uidlist->uid_validity;
+}
+
+uint32_t maildir_uidlist_get_next_uid(struct maildir_uidlist *uidlist)
+{
+ return !uidlist->initial_read ? 0 : uidlist->next_uid;
+}
+
static int maildir_uidlist_rewrite_fd(struct maildir_uidlist *uidlist,
const char *temp_path)
{
Index: maildir-uidlist.h
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/maildir/maildir-uidlist.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- a/maildir-uidlist.h 9 May 2004 23:52:13 -0000 1.6
+++ b/maildir-uidlist.h 24 May 2004 01:50:17 -0000 1.7
@@ -13,7 +13,8 @@
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);
+struct maildir_uidlist *
+maildir_uidlist_init(struct index_mailbox *ibox, uint32_t uid_validity);
void maildir_uidlist_deinit(struct maildir_uidlist *uidlist);
/* Returns -1 if error, 0 if file is broken or lost, 1 if ok. */
@@ -28,6 +29,9 @@
/* Returns number of recent messages. */
uint32_t maildir_uidlist_get_recent_count(struct maildir_uidlist *uidlist);
+uint32_t maildir_uidlist_get_uid_validity(struct maildir_uidlist *uidlist);
+uint32_t maildir_uidlist_get_next_uid(struct maildir_uidlist *uidlist);
+
/* Sync uidlist with what's actually on maildir. */
struct maildir_uidlist_sync_ctx *
maildir_uidlist_sync_init(struct maildir_uidlist *uidlist, int partial);
- Previous message: [dovecot-cvs] dovecot/src/lib-storage/index index-sync.c,1.34,1.35
- Next message: [dovecot-cvs] dovecot/src/lib-index mail-index-lock.c, 1.16,
1.17 mail-index-sync-private.h, 1.6,
1.7 mail-index-sync-update.c, 1.16, 1.17 mail-index-sync.c,
1.16, 1.17 mail-index-transaction-private.h, 1.2,
1.3 mail-index-transaction.c, 1.6,
1.7 mail-index-view-private.h, 1.5, 1.6 mail-index-view-sync.c,
1.10, 1.11 mail-index.c, 1.123, 1.124 mail-index.h, 1.110,
1.111 mail-transaction-log-view.c, 1.11,
1.12 mail-transaction-log.c, 1.29, 1.30 mail-transaction-log.h,
1.9, 1.10 mail-transaction-util.c, 1.7,
1.8 mail-transaction-util.h, 1.3, 1.4
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the dovecot-cvs
mailing list