Mercurial > dovecot > core-2.2
diff src/doveadm/dsync/dsync-brain.c @ 18180:39d00448490f
dsync: If same GUID already exists in storage, try to copy it instead of recreating the mail.
This way most mailbox backends can reduce disk space by only doing a
reference count update.
This feature isn't enabled by default. A virtual "All Mails" mailbox needs
to be configured using the virtual plugin. Then you need to give this
mailbox as -a parameter, e.g.:
doveadm sync -a "Virtual/All Mails" ...
Currently this is implemented by reading through all the GUIDs in the
virtual mailbox. This of course isn't very efficient for things like
incremental replication. An upcoming conversation plugin will keep track of
all the mails' GUIDs, so in future replication should be able to have this
functionality efficiently as well.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 20 Jan 2015 03:23:29 +0200 |
parents | f393f63764e0 |
children | 35e4a6ae8d85 |
line wrap: on
line diff
--- a/src/doveadm/dsync/dsync-brain.c Tue Jan 20 03:14:37 2015 +0200 +++ b/src/doveadm/dsync/dsync-brain.c Tue Jan 20 03:23:29 2015 +0200 @@ -141,6 +141,16 @@ (flags & DSYNC_BRAIN_FLAG_NO_MAIL_PREFETCH) != 0; } +static void +dsync_brain_open_virtual_all_box(struct dsync_brain *brain, + const char *vname) +{ + struct mail_namespace *ns; + + ns = mail_namespace_find(brain->user->namespaces, vname); + brain->virtual_all_box = mailbox_alloc(ns->list, vname, 0); +} + struct dsync_brain * dsync_brain_master_init(struct mail_user *user, struct dsync_ibc *ibc, enum dsync_brain_sync_type sync_type, @@ -185,6 +195,9 @@ brain->master_brain = TRUE; dsync_brain_set_flags(brain, flags); + if (set->virtual_all_box != NULL) + dsync_brain_open_virtual_all_box(brain, set->virtual_all_box); + if (sync_type != DSYNC_BRAIN_SYNC_TYPE_STATE) ; else if (dsync_mailbox_states_import(brain->mailbox_states, brain->pool, @@ -207,6 +220,7 @@ ibc_set.sync_ns_prefixes = sync_ns_str == NULL ? NULL : str_c(sync_ns_str); ibc_set.sync_box = set->sync_box; + ibc_set.virtual_all_box = set->virtual_all_box; ibc_set.exclude_mailboxes = set->exclude_mailboxes; ibc_set.sync_since_timestamp = set->sync_since_timestamp; memcpy(ibc_set.sync_box_guid, set->sync_box_guid, @@ -295,6 +309,8 @@ if (brain->box != NULL) dsync_brain_sync_mailbox_deinit(brain); + if (brain->virtual_all_box != NULL) + mailbox_free(&brain->virtual_all_box); if (brain->local_tree_iter != NULL) dsync_mailbox_tree_iter_deinit(&brain->local_tree_iter); if (brain->local_mailbox_tree != NULL) @@ -465,6 +481,8 @@ brain->purge = (ibc_set->brain_flags & DSYNC_BRAIN_FLAG_PURGE_REMOTE) != 0; + if (ibc_set->virtual_all_box != NULL) + dsync_brain_open_virtual_all_box(brain, ibc_set->virtual_all_box); dsync_brain_mailbox_trees_init(brain); if (brain->sync_type == DSYNC_BRAIN_SYNC_TYPE_STATE)