Lines Matching refs:update

31    locking. The final vsize header update requires committing a transaction,
54 static void vsize_header_refresh(struct mailbox_vsize_update *update)
59 if (update->view != NULL)
60 mail_index_view_close(&update->view);
61 (void)mail_index_refresh(update->box->index);
62 update->view = mail_index_view_open(update->box->index);
64 mail_index_get_header_ext(update->view, update->box->vsize_hdr_ext_id,
67 memcpy(&update->orig_vsize_hdr, data,
68 I_MIN(size, sizeof(update->orig_vsize_hdr)));
70 if (size == sizeof(update->vsize_hdr))
71 memcpy(&update->vsize_hdr, data, sizeof(update->vsize_hdr));
74 mailbox_set_critical(update->box,
78 update->rebuild = TRUE;
79 i_zero(&update->vsize_hdr);
84 index_mailbox_vsize_check_rebuild(struct mailbox_vsize_update *update)
88 if (update->vsize_hdr.highest_uid == 0)
90 if (!mail_index_lookup_seq_range(update->view, 1,
91 update->vsize_hdr.highest_uid,
95 if (update->vsize_hdr.message_count != seq2) {
96 if (update->vsize_hdr.message_count < seq2) {
97 mailbox_set_critical(update->box,
99 update->vsize_hdr.message_count, seq2);
103 i_zero(&update->vsize_hdr);
104 update->rebuild = TRUE;
111 struct mailbox_vsize_update *update;
115 update = i_new(struct mailbox_vsize_update, 1);
116 update->box = box;
118 vsize_header_refresh(update);
119 return update;
122 static bool vsize_update_lock_full(struct mailbox_vsize_update *update,
125 struct mailbox *box = update->box;
129 if (update->lock != NULL)
131 if (update->lock_failed)
137 &update->lock, &error);
143 update->lock_failed = TRUE;
146 update->rebuild = FALSE;
147 vsize_header_refresh(update);
148 index_mailbox_vsize_check_rebuild(update);
152 bool index_mailbox_vsize_update_try_lock(struct mailbox_vsize_update *update)
154 return vsize_update_lock_full(update, 0);
157 bool index_mailbox_vsize_update_wait_lock(struct mailbox_vsize_update *update)
159 return vsize_update_lock_full(update, VSIZE_UPDATE_MAX_LOCK_SECS);
162 bool index_mailbox_vsize_want_updates(struct mailbox_vsize_update *update)
164 return update->vsize_hdr.highest_uid > 0;
168 index_mailbox_vsize_update_write(struct mailbox_vsize_update *update)
172 if (update->written)
174 update->written = TRUE;
176 if (update->rebuild == FALSE &&
177 memcmp(&update->orig_vsize_hdr, &update->vsize_hdr,
178 sizeof(update->vsize_hdr)) == 0) {
182 trans = mail_index_transaction_begin(update->view,
184 mail_index_update_header_ext(trans, update->box->vsize_hdr_ext_id,
185 0, &update->vsize_hdr,
186 sizeof(update->vsize_hdr));
222 struct mailbox_vsize_update *update = *_update;
226 if (update->lock != NULL || update->rebuild)
227 index_mailbox_vsize_update_write(update);
228 file_lock_free(&update->lock);
229 if (update->finish_in_background)
230 index_mailbox_vsize_notify_indexer(update->box);
232 mail_index_view_close(&update->view);
233 i_free(update);
236 void index_mailbox_vsize_hdr_expunge(struct mailbox_vsize_update *update,
239 i_assert(update->lock != NULL);
241 if (uid > update->vsize_hdr.highest_uid)
243 if (update->vsize_hdr.message_count == 0) {
244 mailbox_set_critical(update->box,
246 i_zero(&update->vsize_hdr);
249 update->vsize_hdr.message_count--;
250 if (update->vsize_hdr.vsize < vsize) {
251 mailbox_set_critical(update->box,
253 i_zero(&update->vsize_hdr);
256 update->vsize_hdr.vsize -= vsize;
260 index_mailbox_vsize_hdr_add_missing(struct mailbox_vsize_update *update,
263 struct mailbox_index_vsize *vsize_hdr = &update->vsize_hdr;
274 mailbox_get_open_status(update->box, STATUS_UIDNEXT, &status);
281 /* note that update->view may be more up-to-date than box->view.
286 if (!mail_index_lookup_seq_range(update->box->view,
289 /* nothing existed, but update uidnext */
296 trans = mailbox_transaction_begin(update->box, 0, "vsize update");
301 else if (update->box->storage->set->mail_vsize_bg_after_count == 0)
304 mails_left = update->box->storage->set->mail_vsize_bg_after_count;
317 mailbox_get_last_mail_error(update->box) == MAIL_ERROR_LOOKUP_ABORTED) {
321 mail_storage_set_error(update->box->storage, MAIL_ERROR_INUSE,
324 update->finish_in_background = TRUE;
360 struct mailbox_vsize_update *update;
365 update = index_mailbox_vsize_update_init(box);
366 if (update->vsize_hdr.highest_uid + 1 == status.uidnext &&
367 update->vsize_hdr.message_count == status.messages) {
369 metadata_r->virtual_size = update->vsize_hdr.vsize;
370 index_mailbox_vsize_update_deinit(&update);
374 /* we need to update it - lock it if possible. if not, update it
376 (void)index_mailbox_vsize_update_wait_lock(update);
378 ret = index_mailbox_vsize_hdr_add_missing(update, TRUE);
379 metadata_r->virtual_size = update->vsize_hdr.vsize;
380 index_mailbox_vsize_update_deinit(&update);
444 struct mailbox_vsize_update *update;
447 update = index_mailbox_vsize_update_init(box);
449 /* update here only if we don't need to rebuild the whole vsize. */
450 index_mailbox_vsize_check_rebuild(update);
451 if (index_mailbox_vsize_want_updates(update)) {
456 mailbox_get_open_status(update->box, STATUS_UIDNEXT, &status);
457 if (update->vsize_hdr.highest_uid + 1 != status.uidnext &&
458 index_mailbox_vsize_update_try_lock(update))
459 (void)index_mailbox_vsize_hdr_add_missing(update, FALSE);
461 index_mailbox_vsize_update_deinit(&update);