director.h revision bdd36cfdba3ff66d25570a9ff568d69e1eb543cf
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#ifndef DIRECTOR_H
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#define DIRECTOR_H
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
bdd36cfdba3ff66d25570a9ff568d69e1eb543cfTimo Sirainen#include "net.h"
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#include "director-settings.h"
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
aa797403d51ff047727b77d64532001d6b6cc21aTimo Sirainen#define DIRECTOR_VERSION_NAME "director"
aa797403d51ff047727b77d64532001d6b6cc21aTimo Sirainen#define DIRECTOR_VERSION_MAJOR 1
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen#define DIRECTOR_VERSION_MINOR 3
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen/* weak users supported in protocol v1.1+ */
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen#define DIRECTOR_VERSION_WEAK_USERS 1
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen/* director removes supported in v1.2+ */
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen#define DIRECTOR_VERSION_RING_REMOVE 2
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen/* quit reason supported in v1.3+ */
dff32d11a411a24f3b76003c1ae22c5a960f180eTimo Sirainen#define DIRECTOR_VERSION_QUIT 3
aa797403d51ff047727b77d64532001d6b6cc21aTimo Sirainen
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen/* Minimum time between even attempting to communicate with a director that
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen failed due to a protocol error. */
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen#define DIRECTOR_PROTOCOL_FAILURE_RETRY_SECS 60
8c2b4a45f17a5cb13bb01058ca37798cf48d91baTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstruct director;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstruct mail_host;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstruct user;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainentypedef void director_state_change_callback_t(struct director *dir);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstruct director {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen const struct director_settings *set;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* IP and port of this director. self_host->ip/port must equal these. */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen struct ip_addr self_ip;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int self_port;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
00e7c3010f7da4a49881a7feb05e413af353af0aTimo Sirainen unsigned int test_port;
00e7c3010f7da4a49881a7feb05e413af353af0aTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen struct director_host *self_host;
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen /* left and right connections are set only after they have finished
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen handshaking. until then they're in the connections list, although
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen updates are still sent to them during handshaking if the USER list
5f5713d6468dca1acf3d350dd8a33057331f78c5Timo Sirainen is long. */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen struct director_connection *left, *right;
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen /* all director connections */
4ee00532a265bdfb38539d811fcd12d51210ac35Timo Sirainen ARRAY(struct director_connection *) connections;
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen struct timeout *to_reconnect;
433f5c9cc560a8cbff47257513d0bacb1cf250f4Timo Sirainen struct timeout *to_sync;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
edd318d5866ac3fbc6e8df28fb24a4dfef93c884Timo Sirainen /* current mail hosts */
cf9d67e4a9bfee31cf3be05244555d51a3d1b9feTimo Sirainen struct mail_host_list *mail_hosts;
edd318d5866ac3fbc6e8df28fb24a4dfef93c884Timo Sirainen /* original mail hosts configured in config file.
edd318d5866ac3fbc6e8df28fb24a4dfef93c884Timo Sirainen this is used only for doveadm lookups */
edd318d5866ac3fbc6e8df28fb24a4dfef93c884Timo Sirainen struct mail_host_list *orig_config_hosts;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* temporary user -> host associations */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen struct user_directory *users;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* these requests are waiting for directors to be in synced */
4ee00532a265bdfb38539d811fcd12d51210ac35Timo Sirainen ARRAY(struct director_request *) pending_requests;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen struct timeout *to_request;
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen struct timeout *to_handshake_warning;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen director_state_change_callback_t *state_change_callback;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* director hosts are sorted by IP (and port) */
4ee00532a265bdfb38539d811fcd12d51210ac35Timo Sirainen ARRAY(struct director_host *) dir_hosts;
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen struct timeout *to_remove_dirs;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
15ab2452b0220a115f4351ad9d7fd5ec70ae7966Timo Sirainen struct ipc_client *ipc_proxy;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int sync_seq;
aa797403d51ff047727b77d64532001d6b6cc21aTimo Sirainen /* the lowest minor version supported by the ring */
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen unsigned int ring_min_version;
152db3f90f298b7fb2dbbd4276f0fc30a9bc30f6Timo Sirainen time_t ring_last_sync_time;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen time_t ring_first_alone;
89d6cd658eabf46e07e40037b0e641ed9be1a2a3Timo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* director ring handshaking is complete.
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen director can start serving clients. */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int ring_handshaked:1;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen unsigned int ring_handshake_warning_sent:1;
242abe3ad2423776e9cf05e1304eb8fda4831b23Timo Sirainen unsigned int ring_synced:1;
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen unsigned int sync_frozen:1;
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen unsigned int sync_pending:1;
00e7c3010f7da4a49881a7feb05e413af353af0aTimo Sirainen unsigned int debug:1;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen};
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen/* Create a new director. If listen_ip specifies an actual IP, it's used with
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen listen_port for finding ourself from the director_servers setting.
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen listen_port is used regardless by director_host_add_from_string() for hosts
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen without specified port. */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstruct director *
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainendirector_init(const struct director_settings *set,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen const struct ip_addr *listen_ip, unsigned int listen_port,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen director_state_change_callback_t *callback);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenvoid director_deinit(struct director **dir);
c4900d31385344bfadaee53a897daeafdb3063d8Timo Sirainenvoid director_find_self(struct director *dir);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen/* Start connecting to other directors */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenvoid director_connect(struct director *dir);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
4aab01f4eade3d278b61471516c062ce30a84b5fTimo Sirainenvoid director_set_ring_handshaked(struct director *dir);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainenvoid director_set_ring_synced(struct director *dir);
152db3f90f298b7fb2dbbd4276f0fc30a9bc30f6Timo Sirainenvoid director_set_ring_unsynced(struct director *dir);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenvoid director_set_state_changed(struct director *dir);
aa797403d51ff047727b77d64532001d6b6cc21aTimo Sirainenvoid director_sync_send(struct director *dir, struct director_host *host,
aa797403d51ff047727b77d64532001d6b6cc21aTimo Sirainen uint32_t seq, unsigned int minor_version);
433f5c9cc560a8cbff47257513d0bacb1cf250f4Timo Sirainenbool director_resend_sync(struct director *dir);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainenvoid director_notify_ring_added(struct director_host *added_host,
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen struct director_host *src);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainenvoid director_ring_remove(struct director_host *removed_host,
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen struct director_host *src);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenvoid director_update_host(struct director *dir, struct director_host *src,
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen struct director_host *orig_src,
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen struct mail_host *host) ATTR_NULL(3);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenvoid director_remove_host(struct director *dir, struct director_host *src,
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen struct director_host *orig_src,
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen struct mail_host *host) ATTR_NULL(2, 3);
5e9bb72de1209cd39fdf3e95bdb26e047cc5594eTimo Sirainenvoid director_flush_host(struct director *dir, struct director_host *src,
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen struct director_host *orig_src,
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen struct mail_host *host) ATTR_NULL(3);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenvoid director_update_user(struct director *dir, struct director_host *src,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen struct user *user);
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainenvoid director_update_user_weak(struct director *dir, struct director_host *src,
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainen struct director_host *orig_src,
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen struct user *user) ATTR_NULL(3);
15ab2452b0220a115f4351ad9d7fd5ec70ae7966Timo Sirainenvoid director_move_user(struct director *dir, struct director_host *src,
15ab2452b0220a115f4351ad9d7fd5ec70ae7966Timo Sirainen struct director_host *orig_src,
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen unsigned int username_hash, struct mail_host *host)
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen ATTR_NULL(3);
15ab2452b0220a115f4351ad9d7fd5ec70ae7966Timo Sirainenvoid director_user_killed(struct director *dir, unsigned int username_hash);
15ab2452b0220a115f4351ad9d7fd5ec70ae7966Timo Sirainenvoid director_user_killed_everywhere(struct director *dir,
15ab2452b0220a115f4351ad9d7fd5ec70ae7966Timo Sirainen struct director_host *src,
15ab2452b0220a115f4351ad9d7fd5ec70ae7966Timo Sirainen struct director_host *orig_src,
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen unsigned int username_hash) ATTR_NULL(3);
b6b9c99fefbbc662bd9a0006566133c4480bf0e8Timo Sirainenvoid director_user_weak(struct director *dir, struct user *user);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainenvoid director_sync_freeze(struct director *dir);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainenvoid director_sync_thaw(struct director *dir);
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen/* Send data to all directors using both left and right connections
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen (unless they're the same). */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenvoid director_update_send(struct director *dir, struct director_host *src,
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen const char *cmd);
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainenvoid director_update_send_version(struct director *dir,
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen struct director_host *src,
e4194f4703eeec32b432371ae30fc8f25ab720d8Timo Sirainen unsigned int min_version, const char *cmd);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenint director_connect_host(struct director *dir, struct director_host *host);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen#endif