director.h revision 15ab2452b0220a115f4351ad9d7fd5ec70ae7966
bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch#ifndef DIRECTOR_H
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen#define DIRECTOR_H
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen#include "network.h"
2e533fb1283b5f06a4063b519e47f1861c910386Timo Sirainen#include "director-settings.h"
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainenstruct director;
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainenstruct mail_host;
6ea1de17b3d415f6ff2e6a2af8d34d8f6cf17636Timo Sirainenstruct user;
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainentypedef void director_state_change_callback_t(struct director *dir);
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainenstruct director {
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen const struct director_settings *set;
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen /* IP and port of this director. self_host->ip/port must equal these. */
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen struct ip_addr self_ip;
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen unsigned int self_port;
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen unsigned int test_port;
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen struct director_host *self_host;
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen struct director_connection *left, *right;
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen /* all director connections */
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen struct director_connection *connections;
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen struct timeout *to_reconnect;
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen /* current mail hosts */
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen struct mail_host_list *mail_hosts;
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen /* original mail hosts configured in config file.
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen this is used only for doveadm lookups */
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen struct mail_host_list *orig_config_hosts;
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen /* temporary user -> host associations */
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen struct user_directory *users;
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen /* these requests are waiting for directors to be in synced */
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen ARRAY_DEFINE(pending_requests, struct director_request *);
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen struct timeout *to_request;
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen struct timeout *to_handshake_warning;
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen director_state_change_callback_t *state_change_callback;
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen
4307c886579381dbb1897ea1388ae6978c96f560Timo Sirainen /* director hosts are sorted by IP (and port) */
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen ARRAY_DEFINE(dir_hosts, struct director_host *);
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen struct ipc_client *ipc_proxy;
1c7d88528a964f0a0e16bfe48d76da1cea94088eTimo Sirainen unsigned int sync_seq;
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen /* director ring handshaking is complete.
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen director can start serving clients. */
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen unsigned int ring_handshaked:1;
2e533fb1283b5f06a4063b519e47f1861c910386Timo Sirainen unsigned int ring_handshake_warning_sent:1;
6ea1de17b3d415f6ff2e6a2af8d34d8f6cf17636Timo Sirainen unsigned int ring_synced:1;
6ea1de17b3d415f6ff2e6a2af8d34d8f6cf17636Timo Sirainen unsigned int sync_frozen:1;
6ea1de17b3d415f6ff2e6a2af8d34d8f6cf17636Timo Sirainen unsigned int sync_pending:1;
6ea1de17b3d415f6ff2e6a2af8d34d8f6cf17636Timo Sirainen unsigned int debug:1;
6ea1de17b3d415f6ff2e6a2af8d34d8f6cf17636Timo Sirainen};
6ea1de17b3d415f6ff2e6a2af8d34d8f6cf17636Timo Sirainen
6ea1de17b3d415f6ff2e6a2af8d34d8f6cf17636Timo Sirainen/* Create a new director. If listen_ip specifies an actual IP, it's used with
6ea1de17b3d415f6ff2e6a2af8d34d8f6cf17636Timo Sirainen listen_port for finding ourself from the director_servers setting.
6ea1de17b3d415f6ff2e6a2af8d34d8f6cf17636Timo Sirainen listen_port is used regardless by director_host_add_from_string() for hosts
6ea1de17b3d415f6ff2e6a2af8d34d8f6cf17636Timo Sirainen without specified port. */
6ea1de17b3d415f6ff2e6a2af8d34d8f6cf17636Timo Sirainenstruct director *
6ea1de17b3d415f6ff2e6a2af8d34d8f6cf17636Timo Sirainendirector_init(const struct director_settings *set,
6ea1de17b3d415f6ff2e6a2af8d34d8f6cf17636Timo Sirainen const struct ip_addr *listen_ip, unsigned int listen_port,
6ea1de17b3d415f6ff2e6a2af8d34d8f6cf17636Timo Sirainen director_state_change_callback_t *callback);
6ea1de17b3d415f6ff2e6a2af8d34d8f6cf17636Timo Sirainenvoid director_deinit(struct director **dir);
6ea1de17b3d415f6ff2e6a2af8d34d8f6cf17636Timo Sirainen
6ea1de17b3d415f6ff2e6a2af8d34d8f6cf17636Timo Sirainen/* Start connecting to other directors */
6ea1de17b3d415f6ff2e6a2af8d34d8f6cf17636Timo Sirainenvoid director_connect(struct director *dir);
6ea1de17b3d415f6ff2e6a2af8d34d8f6cf17636Timo Sirainen
6ea1de17b3d415f6ff2e6a2af8d34d8f6cf17636Timo Sirainenvoid director_set_ring_handshaked(struct director *dir);
6ea1de17b3d415f6ff2e6a2af8d34d8f6cf17636Timo Sirainenvoid director_set_ring_synced(struct director *dir);
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainenvoid director_set_state_changed(struct director *dir);
2e533fb1283b5f06a4063b519e47f1861c910386Timo Sirainen
2e533fb1283b5f06a4063b519e47f1861c910386Timo Sirainenvoid director_update_host(struct director *dir, struct director_host *src,
2e533fb1283b5f06a4063b519e47f1861c910386Timo Sirainen struct director_host *orig_src,
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen struct mail_host *host);
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainenvoid director_remove_host(struct director *dir, struct director_host *src,
6ea1de17b3d415f6ff2e6a2af8d34d8f6cf17636Timo Sirainen struct director_host *orig_src,
1c7d88528a964f0a0e16bfe48d76da1cea94088eTimo Sirainen struct mail_host *host);
1c7d88528a964f0a0e16bfe48d76da1cea94088eTimo Sirainenvoid director_flush_host(struct director *dir, struct director_host *src,
6ea1de17b3d415f6ff2e6a2af8d34d8f6cf17636Timo Sirainen struct director_host *orig_src,
6ea1de17b3d415f6ff2e6a2af8d34d8f6cf17636Timo Sirainen struct mail_host *host);
6ea1de17b3d415f6ff2e6a2af8d34d8f6cf17636Timo Sirainenvoid director_update_user(struct director *dir, struct director_host *src,
6ea1de17b3d415f6ff2e6a2af8d34d8f6cf17636Timo Sirainen struct user *user);
6ea1de17b3d415f6ff2e6a2af8d34d8f6cf17636Timo Sirainenvoid director_move_user(struct director *dir, struct director_host *src,
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen struct director_host *orig_src,
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen unsigned int username_hash, struct mail_host *host);
5f252b9777617d67196e59fbd1f1d404a5323719Timo Sirainenvoid director_user_killed(struct director *dir, unsigned int username_hash);
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainenvoid director_user_killed_everywhere(struct director *dir,
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen struct director_host *src,
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen struct director_host *orig_src,
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen unsigned int username_hash);
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainenvoid director_sync_freeze(struct director *dir);
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainenvoid director_sync_thaw(struct director *dir);
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen/* Send data to all directors using both left and right connections
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen (unless they're the same). */
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainenvoid director_update_send(struct director *dir, struct director_host *src,
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen const char *data);
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen
2b602d8698d82e974eba6339ef96c29e256bde31Timo Sirainenint director_connect_host(struct director *dir, struct director_host *host);
2e533fb1283b5f06a4063b519e47f1861c910386Timo Sirainen
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen#endif
d47a87c927ca77e780480f4eaf575511698d42c8Timo Sirainen