director.h revision 89d6cd658eabf46e07e40037b0e641ed9be1a2a3
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina/* weak users supported in protocol v1.1+ */
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina/* Minimum time between even attempting to communicate with a director that
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina failed due to a protocol error. */
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina#define DIRECTOR_PROTOCOL_FAILURE_RETRY_SECS 60
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březinatypedef void director_state_change_callback_t(struct director *dir);
e880949305cee3aca79441fe6113a9d79e7c98f2Jakub Hrozek /* IP and port of this director. self_host->ip/port must equal these. */
769347ad4d35d43488eb98f980143495b0db415dStef Walter unsigned int test_port;
769347ad4d35d43488eb98f980143495b0db415dStef Walter /* left and right connections are set only after they have finished
769347ad4d35d43488eb98f980143495b0db415dStef Walter handshaking. until then they're in the connections list, although
769347ad4d35d43488eb98f980143495b0db415dStef Walter updates are still sent to them during handshaking if the USER list
769347ad4d35d43488eb98f980143495b0db415dStef Walter /* all director connections */
769347ad4d35d43488eb98f980143495b0db415dStef Walter ARRAY_DEFINE(connections, struct director_connection *);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina /* current mail hosts */
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina /* original mail hosts configured in config file.
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina this is used only for doveadm lookups */
769347ad4d35d43488eb98f980143495b0db415dStef Walter /* temporary user -> host associations */
769347ad4d35d43488eb98f980143495b0db415dStef Walter /* these requests are waiting for directors to be in synced */
769347ad4d35d43488eb98f980143495b0db415dStef Walter ARRAY_DEFINE(pending_requests, struct director_request *);
769347ad4d35d43488eb98f980143495b0db415dStef Walter director_state_change_callback_t *state_change_callback;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina /* director hosts are sorted by IP (and port) */
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina ARRAY_DEFINE(dir_hosts, struct director_host *);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina /* the lowest minor version supported by the ring */
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina /* director ring handshaking is complete.
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina director can start serving clients. */
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina/* Create a new director. If listen_ip specifies an actual IP, it's used with
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina listen_port for finding ourself from the director_servers setting.
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina listen_port is used regardless by director_host_add_from_string() for hosts
65976ea5e9767bfaced81dfb97dc87d59f50b57eSimo Sorce without specified port. */
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březinadirector_init(const struct director_settings *set,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina const struct ip_addr *listen_ip, unsigned int listen_port,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashovvoid director_find_self(struct director *dir);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina/* Start connecting to other directors */
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březinavoid director_set_ring_handshaked(struct director *dir);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březinavoid director_set_ring_synced(struct director *dir);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březinavoid director_set_ring_unsynced(struct director *dir);
7c9fe57ad82747a32721ca0a08c5569282f3e0c4Pavel Březinavoid director_set_state_changed(struct director *dir);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březinavoid director_sync_send(struct director *dir, struct director_host *host,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březinabool director_resend_sync(struct director *dir);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březinavoid director_update_host(struct director *dir, struct director_host *src,
7c9fe57ad82747a32721ca0a08c5569282f3e0c4Pavel Březinavoid director_remove_host(struct director *dir, struct director_host *src,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březinavoid director_flush_host(struct director *dir, struct director_host *src,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březinavoid director_update_user(struct director *dir, struct director_host *src,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březinavoid director_update_user_weak(struct director *dir, struct director_host *src,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashovvoid director_move_user(struct director *dir, struct director_host *src,
7c9fe57ad82747a32721ca0a08c5569282f3e0c4Pavel Březina unsigned int username_hash, struct mail_host *host);
7c9fe57ad82747a32721ca0a08c5569282f3e0c4Pavel Březinavoid director_user_killed(struct director *dir, unsigned int username_hash);
7c9fe57ad82747a32721ca0a08c5569282f3e0c4Pavel Březinavoid director_user_killed_everywhere(struct director *dir,
6f8ae17869f4f8a1496e3f171ae6b5c11af1845cPavel Březinavoid director_user_weak(struct director *dir, struct user *user);
7c9fe57ad82747a32721ca0a08c5569282f3e0c4Pavel Březinavoid director_sync_freeze(struct director *dir);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina/* Send data to all directors using both left and right connections
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina (unless they're the same). */
3bea01f01d76e1e95a8239c0d3f67073992136a1Jan Zelenyvoid director_update_send(struct director *dir, struct director_host *src,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina const char *data);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březinaint director_connect_host(struct director *dir, struct director_host *host);