its failed state, so we can connect to it */
conn->host->last_network_failure = 0;
if (!director_has_outgoing_connections(dir))
- director_connect(dir);
+ director_connect(dir, "Connecting to left");
} else if (dir->left->host == conn->host) {
/* b) */
i_assert(dir->left != conn);
struct director_host *host;
struct ip_addr ip;
in_port_t port;
+ const char *right_state;
if (str_array_length(args) != 2 ||
!director_args_parse_ip_port(conn, args, &ip, &port)) {
host->removed = FALSE;
if (dir->right == NULL) {
- dir_debug("Received CONNECT request to %s, "
- "initializing right", host->name);
+ right_state = "initializing right";
} else {
- dir_debug("Received CONNECT request to %s, "
- "replacing current right %s",
- host->name, dir->right->name);
+ right_state = t_strdup_printf("replacing current right %s",
+ dir->right->name);
}
/* connect here */
- (void)director_connect_host(dir, host);
+ (void)director_connect_host(dir, host, t_strdup_printf(
+ "Received CONNECT request from %s - %s",
+ conn->name, right_state));
return TRUE;
}
conn->to_ping = timeout_add(DIRECTOR_CONNECTION_ME_TIMEOUT_MSECS,
director_connection_init_timeout, conn);
+ i_info("Incoming connection from director %s", conn->name);
director_connection_send_handshake(conn);
return conn;
}
director_connection_deinit(_conn, reason);
if (dir->right == NULL)
- director_connect(dir);
+ director_connect(dir, "Reconnecting after disconnection");
}
static void director_connection_reconnect(struct director_connection **_conn,
director_connection_deinit(_conn, reason);
if (dir->right == NULL)
- director_connect(dir);
+ director_connect(dir, "Reconnecting after error");
}
void director_connection_send(struct director_connection *conn,
}
static void
-director_log_connect(struct director *dir, struct director_host *host)
+director_log_connect(struct director *dir, struct director_host *host,
+ const char *reason)
{
string_t *str = t_str_new(128);
str_printfa(str, ", last protocol failure %ds ago",
(int)(ioloop_time - host->last_protocol_failure));
}
- dir_debug("Connecting to %s:%u (as %s%s)",
- net_ip2addr(&host->ip), host->port,
- net_ip2addr(&dir->self_ip), str_c(str));
+ i_info("Connecting to %s:%u (as %s%s): %s",
+ net_ip2addr(&host->ip), host->port,
+ net_ip2addr(&dir->self_ip), str_c(str), reason);
}
-int director_connect_host(struct director *dir, struct director_host *host)
+int director_connect_host(struct director *dir, struct director_host *host,
+ const char *reason)
{
in_port_t port;
int fd;
if (director_has_outgoing_connection(dir, host))
return 0;
- if (director_debug)
- director_log_connect(dir, host);
+ director_log_connect(dir, host, reason);
port = dir->test_port != 0 ? dir->test_port : host->port;
fd = net_connect_ip(&host->ip, port, &dir->self_ip);
if (fd == -1) {
return NULL;
}
+static void director_quick_reconnect_retry(struct director *dir)
+{
+ director_connect(dir, "Alone in director ring - trying to connect to others");
+}
+
static bool director_wait_for_others(struct director *dir)
{
struct director_host *const *hostp;
if (dir->to_reconnect != NULL)
timeout_remove(&dir->to_reconnect);
dir->to_reconnect = timeout_add(DIRECTOR_QUICK_RECONNECT_TIMEOUT_MSECS,
- director_connect, dir);
+ director_quick_reconnect_retry, dir);
return TRUE;
}
-void director_connect(struct director *dir)
+void director_connect(struct director *dir, const char *reason)
{
struct director_host *const *hosts;
unsigned int i, count, self_idx;
continue;
}
- if (director_connect_host(dir, hosts[idx]) == 0) {
+ if (director_connect_host(dir, hosts[idx], reason) == 0) {
/* success */
return;
}
if (preferred_host == NULL) {
/* all directors have been removed, try again later */
- } else if (cur_host != preferred_host)
- (void)director_connect_host(dir, preferred_host);
- else {
+ } else if (cur_host != preferred_host) {
+ (void)director_connect_host(dir, preferred_host,
+ "Reconnect attempt to preferred director");
+ } else {
/* the connection hasn't finished sync yet.
keep this timeout for now. */
}
}
}
if (dir->right == NULL)
- director_connect(dir);
+ director_connect(dir, "Reconnecting after director was removed");
cmd = t_strdup_printf("DIRECTOR-REMOVE\t%s\t%u\n",
net_ip2addr(&removed_host->ip),
void director_find_self(struct director *dir);
/* Start connecting to other directors */
-void director_connect(struct director *dir);
+void director_connect(struct director *dir, const char *reason);
void director_set_ring_handshaked(struct director *dir);
void director_set_ring_synced(struct director *dir);
struct director_host *src,
unsigned int min_version, const char *cmd);
-int director_connect_host(struct director *dir, struct director_host *host);
+int director_connect_host(struct director *dir, struct director_host *host,
+ const char *reason);
bool
director_get_username_hash(struct director *dir, const char *username,