[dovecot-cvs] dovecot/src/lib-storage/index/maildir maildir-save.c,
1.54, 1.55 maildir-storage.h, 1.40, 1.41 maildir-sync.c, 1.61,
1.62 maildir-uidlist.c, 1.38, 1.39
cras at dovecot.org
cras at dovecot.org
Tue Jul 12 15:45:08 EEST 2005
Update of /var/lib/cvs/dovecot/src/lib-storage/index/maildir
In directory talvi:/tmp/cvs-serv27133/lib-storage/index/maildir
Modified Files:
maildir-save.c maildir-storage.h maildir-sync.c
maildir-uidlist.c
Log Message:
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Fixed saving message into empty and non-synced mailboxes.
Index: maildir-save.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/index/maildir/maildir-save.c,v
retrieving revision 1.54
retrieving revision 1.55
diff -u -d -r1.54 -r1.55
--- maildir-save.c 4 Jul 2005 11:32:26 -0000 1.54
+++ maildir-save.c 12 Jul 2005 12:45:06 -0000 1.55
@@ -46,6 +46,7 @@
time_t received_date;
uint32_t seq;
+ unsigned int synced:1;
unsigned int failed:1;
};
@@ -105,6 +106,8 @@
ctx->newdir = p_strconcat(pool, mbox->path, "/new", NULL);
ctx->curdir = p_strconcat(pool, mbox->path, "/cur", NULL);
+ ctx->synced = maildir_sync_is_synced(mbox) > 0;
+
ctx->keywords_buffer = buffer_create_const_data(pool, NULL, 0);
array_create_from_buffer(&ctx->keywords_array, ctx->keywords_buffer,
sizeof(unsigned int));
@@ -116,7 +119,7 @@
enum mail_flags flags, struct mail_keywords *keywords,
time_t received_date, int timezone_offset __attr_unused__,
const char *from_envelope __attr_unused__,
- struct istream *input, int want_mail __attr_unused__)
+ struct istream *input, int want_mail)
{
struct maildir_transaction_context *t =
(struct maildir_transaction_context *)_t;
@@ -182,12 +185,22 @@
sizeof(unsigned int) * keywords->count);
}
- /* insert into index */
- mail_index_append(ctx->trans, 0, &ctx->seq);
- mail_index_update_flags(ctx->trans, ctx->seq, MODIFY_REPLACE, flags);
- if (keywords != NULL) {
- mail_index_update_keywords(ctx->trans, ctx->seq,
- MODIFY_REPLACE, keywords);
+ if (!ctx->synced && want_mail) {
+ if (maildir_storage_sync_force(mbox) < 0)
+ ctx->failed = TRUE;
+ else
+ ctx->synced = TRUE;
+ }
+
+ if (ctx->synced) {
+ /* insert into index */
+ mail_index_append(ctx->trans, 0, &ctx->seq);
+ mail_index_update_flags(ctx->trans, ctx->seq,
+ MODIFY_REPLACE, flags);
+ if (keywords != NULL) {
+ mail_index_update_keywords(ctx->trans, ctx->seq,
+ MODIFY_REPLACE, keywords);
+ }
}
t_pop();
@@ -358,8 +371,10 @@
return -1;
}
- first_uid = maildir_uidlist_get_next_uid(ctx->mbox->uidlist);
- mail_index_append_assign_uids(ctx->trans, first_uid, &last_uid);
+ if (ctx->synced) {
+ first_uid = maildir_uidlist_get_next_uid(ctx->mbox->uidlist);
+ mail_index_append_assign_uids(ctx->trans, first_uid, &last_uid);
+ }
flags = MAILDIR_UIDLIST_REC_FLAG_NEW_DIR |
MAILDIR_UIDLIST_REC_FLAG_RECENT;
Index: maildir-storage.h
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/index/maildir/maildir-storage.h,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -d -r1.40 -r1.41
--- maildir-storage.h 30 Jun 2005 20:28:20 -0000 1.40
+++ maildir-storage.h 12 Jul 2005 12:45:06 -0000 1.41
@@ -92,6 +92,8 @@
struct mailbox_list *
maildir_mailbox_list_next(struct mailbox_list_context *ctx);
+int maildir_sync_is_synced(struct maildir_mailbox *mbox);
+
struct mailbox_sync_context *
maildir_storage_sync_init(struct mailbox *box, enum mailbox_sync_flags flags);
int maildir_storage_sync_force(struct maildir_mailbox *mbox);
Index: maildir-sync.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/index/maildir/maildir-sync.c,v
retrieving revision 1.61
retrieving revision 1.62
diff -u -d -r1.61 -r1.62
--- maildir-sync.c 4 Jul 2005 11:32:27 -0000 1.61
+++ maildir-sync.c 12 Jul 2005 12:45:06 -0000 1.62
@@ -732,42 +732,59 @@
return ret < 0 ? -1 : (moves <= MAILDIR_RENAME_RESCAN_COUNT ? 0 : 1);
}
-static int maildir_sync_quick_check(struct maildir_sync_context *ctx,
- int *new_changed_r, int *cur_changed_r)
+static void
+maildir_sync_update_from_header(struct maildir_mailbox *mbox)
+{
+ uint64_t value;
+
+ /* FIXME: ugly, replace with extension header */
+ value = mail_index_get_header(mbox->ibox.view)->sync_size;
+ mbox->last_new_mtime = value & 0xffffffff;
+ mbox->last_new_sync_time = value >> 32;
+
+ mbox->last_cur_mtime =
+ mail_index_get_header(mbox->ibox.view)->sync_stamp;
+}
+
+static int
+maildir_sync_quick_check(struct maildir_mailbox *mbox,
+ const char *new_dir, const char *cur_dir,
+ int *new_changed_r, int *cur_changed_r)
{
- struct maildir_mailbox *mbox = ctx->mbox;
struct stat st;
time_t new_mtime, cur_mtime;
*new_changed_r = *cur_changed_r = FALSE;
- if (stat(ctx->new_dir, &st) < 0) {
+ if (stat(new_dir, &st) < 0) {
mail_storage_set_critical(STORAGE(mbox->storage),
- "stat(%s) failed: %m", ctx->new_dir);
+ "stat(%s) failed: %m", new_dir);
return -1;
}
new_mtime = st.st_mtime;
- if (stat(ctx->cur_dir, &st) < 0) {
+ if (stat(cur_dir, &st) < 0) {
mail_storage_set_critical(STORAGE(mbox->storage),
- "stat(%s) failed: %m", ctx->cur_dir);
+ "stat(%s) failed: %m", cur_dir);
return -1;
}
cur_mtime = st.st_mtime;
/* cur stamp is kept in index, we don't have to sync if
- someone else has done it and updated the index. */
- mbox->last_cur_mtime =
- mail_index_get_header(mbox->ibox.view)->sync_stamp;
- if (mbox->dirty_cur_time == 0 && cur_mtime != mbox->last_cur_mtime) {
+ someone else has done it and updated the index.
+
+ FIXME: For now we're using sync_size field as the new/ dir's stamp.
+ Pretty ugly.. */
+ maildir_sync_update_from_header(mbox);
+ if ((mbox->dirty_cur_time == 0 && cur_mtime != mbox->last_cur_mtime) ||
+ (new_mtime != mbox->last_new_mtime)) {
/* check if the index has been updated.. */
if (mail_index_refresh(mbox->ibox.index) < 0) {
mail_storage_set_index_error(&mbox->ibox);
return -1;
}
- mbox->last_cur_mtime =
- mail_index_get_header(mbox->ibox.view)->sync_stamp;
+ maildir_sync_update_from_header(mbox);
}
if (new_mtime != mbox->last_new_mtime ||
@@ -836,6 +853,8 @@
array_t ARRAY_DEFINE(keywords, unsigned int);
array_t ARRAY_DEFINE(idx_keywords, unsigned int);
uint32_t uid_validity, next_uid;
+ uint64_t value;
+ time_t old_new_sync_time;
int ret = 0, full_rescan = FALSE;
i_assert(maildir_uidlist_is_locked(sync_ctx->mbox->uidlist));
@@ -1057,6 +1076,23 @@
&sync_stamp, sizeof(sync_stamp), TRUE);
}
+ /* FIXME: use a header extension instead of sync_size.. */
+ value = mbox->last_new_mtime;
+ old_new_sync_time = hdr->sync_size >> 32;
+ if (mbox->last_new_mtime >= old_new_sync_time - MAILDIR_SYNC_SECS) {
+ value |= (uint64_t)mbox->last_new_sync_time << 32;
+ } else {
+ value |= (uint64_t)old_new_sync_time << 32;
+ }
+ if (value != hdr->sync_size) {
+ uint64_t sync_stamp = mbox->last_new_mtime |
+ ((uint64_t)mbox->last_new_sync_time << 32);
+
+ mail_index_update_header(trans,
+ offsetof(struct mail_index_header, sync_size),
+ &sync_stamp, sizeof(sync_stamp), TRUE);
+ }
+
if (hdr->uid_validity == 0) {
/* get the initial uidvalidity */
if (maildir_uidlist_update(mbox->uidlist) < 0)
@@ -1124,7 +1160,9 @@
if (sync_last_commit) {
new_changed = cur_changed = FALSE;
} else if (!forced) {
- if (maildir_sync_quick_check(ctx, &new_changed, &cur_changed) < 0)
+ if (maildir_sync_quick_check(ctx->mbox,
+ ctx->new_dir, ctx->cur_dir,
+ &new_changed, &cur_changed) < 0)
return -1;
if (!new_changed && !cur_changed)
@@ -1286,3 +1324,18 @@
return index_mailbox_sync_init(box, flags, ret < 0);
}
+
+int maildir_sync_is_synced(struct maildir_mailbox *mbox)
+{
+ const char *new_dir, *cur_dir;
+ int ret, new_changed, cur_changed;
+
+ t_push();
+ new_dir = t_strconcat(mbox->path, "/new", NULL);
+ cur_dir = t_strconcat(mbox->path, "/cur", NULL);
+
+ ret = maildir_sync_quick_check(mbox, new_dir, cur_dir,
+ &new_changed, &cur_changed);
+ t_pop();
+ return ret < 0 ? -1 : (!new_changed && !cur_changed);
+}
Index: maildir-uidlist.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/index/maildir/maildir-uidlist.c,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -d -r1.38 -r1.39
--- maildir-uidlist.c 30 Jun 2005 20:28:20 -0000 1.38
+++ maildir-uidlist.c 12 Jul 2005 12:45:06 -0000 1.39
@@ -466,9 +466,13 @@
uidlist->version = 1;
- if (uidlist->uid_validity == 0)
- uidlist->uid_validity = ioloop_time;
+ if (uidlist->uid_validity == 0) {
+ /* Get UIDVALIDITY from index */
+ const struct mail_index_header *hdr;
+ hdr = mail_index_get_header(uidlist->mbox->ibox.view);
+ uidlist->uid_validity = hdr->uid_validity;
+ }
str = t_str_new(4096);
str_printfa(str, "%u %u %u\n", uidlist->version,
uidlist->uid_validity, uidlist->next_uid);
More information about the dovecot-cvs
mailing list