# HG changeset patch # User Timo Sirainen # Date 1509987574 -7200 # Node ID 5524719c299ac5463da29b81e52eba25fe4b0604 # Parent 7fe2a998bc1ff7b0c761c38bca358c81633151c8 lib-storage: When copying mails, copy also empty cache fields This mainly means that it copies cache fields for nonexistent message headers. Those are still important, because otherwise Dovecot doesn't know whether they exist or not. diff -r 7fe2a998bc1f -r 5524719c299a src/lib-storage/index/index-storage.c --- a/src/lib-storage/index/index-storage.c Tue Nov 07 17:36:05 2017 +0200 +++ b/src/lib-storage/index/index-storage.c Mon Nov 06 18:59:34 2017 +0200 @@ -935,6 +935,7 @@ const struct mail_cache_field *dest_field; unsigned int src_field_idx, dest_field_idx; uint32_t t; + bool add = FALSE; src_field_idx = mail_cache_register_lookup(src_mail->box->cache, name); i_assert(src_field_idx != UINT_MAX); @@ -957,12 +958,14 @@ /* save date must update when mail is copied */ t = ioloop_time; buffer_append(buf, &t, sizeof(t)); + add = TRUE; + } else if (mail_cache_lookup_field(src_mail->transaction->cache_view, buf, + src_mail->seq, src_field_idx) <= 0) { + /* error / not found */ + buffer_set_used_size(buf, 0); } else { - if (mail_cache_lookup_field(src_mail->transaction->cache_view, buf, - src_mail->seq, src_field_idx) <= 0) - buffer_set_used_size(buf, 0); - else if (strcmp(name, "size.physical") == 0 || - strcmp(name, "size.virtual") == 0) { + if (strcmp(name, "size.physical") == 0 || + strcmp(name, "size.virtual") == 0) { /* FIXME: until mail_cache_lookup() can read unwritten cached data from buffer, we'll do this optimization to make quota plugin's work faster */ @@ -977,8 +980,11 @@ else imail->data.virtual_size = size; } + /* NOTE: we'll want to add also nonexistent headers, which + will keep the buf empty */ + add = TRUE; } - if (buf->used > 0) { + if (add) { mail_cache_add(dest_trans->cache_trans, dest_seq, dest_field_idx, buf->data, buf->used); }