dsync-brain-private.h revision 2e652d2651b2800f99a17dcb3014a009fe4660d3
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek#ifndef DSYNC_BRAIN_PRIVATE_H
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek#define DSYNC_BRAIN_PRIVATE_H
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek#include "hash.h"
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek#include "dsync-brain.h"
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek#include "dsync-mailbox.h"
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek#include "dsync-mailbox-state.h"
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek#define DSYNC_LOCK_FILENAME ".dovecot-sync.lock"
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozekstruct dsync_mailbox_tree_sync_change;
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozekenum dsync_state {
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek DSYNC_STATE_MASTER_RECV_HANDSHAKE,
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek DSYNC_STATE_SLAVE_RECV_HANDSHAKE,
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek /* if sync_type=STATE, the master brain knows the saved "last common
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek mailbox state". this state is sent to the slave. */
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek DSYNC_STATE_MASTER_SEND_LAST_COMMON,
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek DSYNC_STATE_SLAVE_RECV_LAST_COMMON,
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek /* both sides send their mailbox trees */
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek DSYNC_STATE_SEND_MAILBOX_TREE,
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek DSYNC_STATE_SEND_MAILBOX_TREE_DELETES,
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek DSYNC_STATE_RECV_MAILBOX_TREE,
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek DSYNC_STATE_RECV_MAILBOX_TREE_DELETES,
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek /* master decides in which order mailboxes are synced (it knows the
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek slave's mailboxes by looking at the received mailbox tree) */
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek DSYNC_STATE_MASTER_SEND_MAILBOX,
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek DSYNC_STATE_SLAVE_RECV_MAILBOX,
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek /* once mailbox is selected, the mails inside it are synced.
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek after the mails are synced, another mailbox is synced. */
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek DSYNC_STATE_SYNC_MAILS,
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek DSYNC_STATE_DONE
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek};
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek
7c5cd2e7711621af9163a41393e88896a91ac33bJakub Hrozekenum dsync_box_state {
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek DSYNC_BOX_STATE_MAILBOX,
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek DSYNC_BOX_STATE_CHANGES,
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek DSYNC_BOX_STATE_ATTRIBUTES,
2745b0156f12df7a7eb93d57716233243658e4d9Jakub Hrozek DSYNC_BOX_STATE_MAIL_REQUESTS,
2745b0156f12df7a7eb93d57716233243658e4d9Jakub Hrozek DSYNC_BOX_STATE_MAILS,
2745b0156f12df7a7eb93d57716233243658e4d9Jakub Hrozek DSYNC_BOX_STATE_RECV_LAST_COMMON,
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek DSYNC_BOX_STATE_DONE
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek};
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozekstruct dsync_brain {
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek pool_t pool;
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek struct mail_user *user;
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek struct dsync_ibc *ibc;
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek const char *process_title_prefix;
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek ARRAY(struct mail_namespace *) sync_namespaces;
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek const char *sync_box;
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek struct mailbox *virtual_all_box;
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose guid_128_t sync_box_guid;
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose const char *const *exclude_mailboxes;
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose enum dsync_brain_sync_type sync_type;
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose time_t sync_since_timestamp;
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose const char *sync_flag;
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose char alt_char;
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose unsigned int lock_timeout;
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose int lock_fd;
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose const char *lock_path;
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose struct file_lock *lock;
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose char hierarchy_sep;
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose struct dsync_mailbox_tree *local_mailbox_tree;
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose struct dsync_mailbox_tree *remote_mailbox_tree;
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose struct dsync_mailbox_tree_iter *local_tree_iter;
802385896dc1c4e7b8bbd40dcfe3cd131f68e696Sumit Bose
45aeb924ec3ac448bb8d174a5cc061ed98b147c7Jakub Hrozek enum dsync_state state, pre_box_state;
enum dsync_box_state box_recv_state;
enum dsync_box_state box_send_state;
unsigned int proctitle_update_counter;
struct dsync_transaction_log_scan *log_scan;
struct dsync_mailbox_importer *box_importer;
struct dsync_mailbox_exporter *box_exporter;
struct mailbox *box;
struct dsync_mailbox local_dsync_box, remote_dsync_box;
pool_t dsync_box_pool;
/* list of mailbox states
for master brain: given to brain at init and
for slave brain: received from DSYNC_STATE_SLAVE_RECV_LAST_COMMON */
HASH_TABLE_TYPE(dsync_mailbox_state) mailbox_states;
/* DSYNC_STATE_MASTER_SEND_LAST_COMMON: current send position */
struct hash_iterate_context *mailbox_states_iter;
/* state of the mailbox we're currently syncing, changed at
init and deinit */
struct dsync_mailbox_state mailbox_state;
/* new states for synced mailboxes */
ARRAY_TYPE(dsync_mailbox_state) remote_mailbox_states;
unsigned int master_brain:1;
unsigned int mail_requests:1;
unsigned int backup_send:1;
unsigned int backup_recv:1;
unsigned int purge:1;
unsigned int debug:1;
unsigned int sync_visible_namespaces:1;
unsigned int no_mail_sync:1;
unsigned int no_backup_overwrite:1;
unsigned int no_mail_prefetch:1;
unsigned int changes_during_sync:1;
unsigned int require_full_resync:1;
unsigned int verbose_proctitle:1;
unsigned int failed:1;
};
extern const char *dsync_box_state_names[DSYNC_BOX_STATE_DONE+1];
void dsync_brain_mailbox_trees_init(struct dsync_brain *brain);
void dsync_brain_send_mailbox_tree(struct dsync_brain *brain);
void dsync_brain_send_mailbox_tree_deletes(struct dsync_brain *brain);
bool dsync_brain_recv_mailbox_tree(struct dsync_brain *brain);
bool dsync_brain_recv_mailbox_tree_deletes(struct dsync_brain *brain);
int dsync_brain_mailbox_tree_sync_change(struct dsync_brain *brain,
const struct dsync_mailbox_tree_sync_change *change);
void dsync_brain_sync_mailbox_deinit(struct dsync_brain *brain);
int dsync_brain_mailbox_alloc(struct dsync_brain *brain, const guid_128_t guid,
struct mailbox **box_r, const char **error_r);
bool dsync_brain_mailbox_update_pre(struct dsync_brain *brain,
struct mailbox *box,
const struct dsync_mailbox *local_box,
const struct dsync_mailbox *remote_box);
bool dsync_boxes_need_sync(struct dsync_brain *brain,
const struct dsync_mailbox *box1,
const struct dsync_mailbox *box2);
void dsync_brain_sync_init_box_states(struct dsync_brain *brain);
void dsync_brain_master_send_mailbox(struct dsync_brain *brain);
bool dsync_brain_slave_recv_mailbox(struct dsync_brain *brain);
int dsync_brain_sync_mailbox_open(struct dsync_brain *brain,
const struct dsync_mailbox *remote_dsync_box);
bool dsync_brain_sync_mails(struct dsync_brain *brain);
#endif