pool_unref(&pool);
}
-bool dbox_map_want_purge(struct dbox_map *map)
-{
- const struct mail_index_header *hdr;
- const struct dbox_map_mail_index_record *rec;
- const uint16_t *ref16_p;
- const void *data;
- uoff_t ref0_size, total_size;
- bool expunged;
- uint32_t seq;
-
- if (map->set->mdbox_purge_min_percentage >= 100) {
- /* we never purge anything */
- return FALSE;
- }
-
- ref0_size = total_size = 0;
- hdr = mail_index_get_header(map->view);
- for (seq = 1; seq <= hdr->messages_count; seq++) {
- mail_index_lookup_ext(map->view, seq, map->map_ext_id,
- &data, &expunged);
- if (data == NULL || expunged)
- continue;
- rec = data;
-
- mail_index_lookup_ext(map->view, seq, map->ref_ext_id,
- &data, &expunged);
- if (data == NULL || expunged)
- continue;
- ref16_p = data;
-
- if (*ref16_p == 0)
- ref0_size += rec->size;
- total_size += rec->size;
- }
-
- if (ref0_size < DBOX_FORCE_PURGE_MIN_BYTES)
- return FALSE;
- if ((float)ref0_size / (float)total_size < DBOX_FORCE_PURGE_MIN_RATIO)
- return FALSE;
- return TRUE;
-}
-
const ARRAY_TYPE(seq_range) *dbox_map_get_zero_ref_files(struct dbox_map *map)
{
const struct mail_index_header *hdr;
const ARRAY_TYPE(uint32_t) *map_uids, int diff);
int dbox_map_remove_file_id(struct dbox_map *map, uint32_t file_id);
-/* Returns TRUE if there's enough pressure to purge immediately. */
-bool dbox_map_want_purge(struct dbox_map *map);
/* Return all files containing messages with zero refcount. */
const ARRAY_TYPE(seq_range) *dbox_map_get_zero_ref_files(struct dbox_map *map);
struct dbox_map_transaction_context *map_trans;
int ret;
- /* prevent a user from saving + expunging messages all the time and
- using lots of disk space. but avoid doing this in situations where
- a user simply expunges a lot of mail for the first time. that's why
- we do this calculation before sync, not after: the purging is
- triggered only after the second expunge. */
- if ((ctx->flags & MDBOX_SYNC_FLAG_NO_PURGE) == 0 &&
- dbox_map_want_purge(ctx->mbox->storage->map))
- ctx->purge = TRUE;
-
map_trans = dbox_map_transaction_begin(ctx->mbox->storage->map, FALSE);
ret = dbox_map_update_refcounts(map_trans, &ctx->expunged_map_uids, -1);
if (ret == 0) {
mail_index_sync_rollback(&ctx->index_sync_ctx);
}
- if (ctx->purge)
- (void)mdbox_sync_purge(&ctx->mbox->storage->storage.storage);
i_free(ctx);
return ret;
}
/* list of expunged map_uids. the same map_uid may be listed more than
once in case message has been copied multiple times to mailbox. */
ARRAY_TYPE(uint32_t) expunged_map_uids;
-
- unsigned int purge:1;
};
int mdbox_sync_begin(struct mdbox_mailbox *mbox, enum mdbox_sync_flags flags,