director_handshake_cmd_done(conn);
return TRUE;
}
- i_error("director(%s): Unknown command (in this state): %s",
+ i_error("director(%s): Invalid handshake command: %s",
conn->name, cmd);
return FALSE;
}
i_error("director(%s): Received empty line", conn->name);
return FALSE;
}
- if (!conn->handshake_received)
- return director_connection_handle_handshake(conn, cmd, args);
+ if (!conn->handshake_received) {
+ if (!director_connection_handle_handshake(conn, cmd, args)) {
+ /* invalid commands during handshake,
+ we probably don't want to reconnect here */
+ conn->host->last_failed = ioloop_time;
+ return FALSE;
+ }
+ return TRUE;
+ }
if (strcmp(cmd, "USER") == 0)
return director_cmd_user(conn, args);
static void director_connection_connected(struct director_connection *conn)
{
+ struct director *dir = conn->dir;
string_t *str = t_str_new(1024);
int err;
if ((err = net_geterror(conn->fd)) != 0) {
+ conn->host->last_failed = ioloop_time;
i_error("director(%s): connect() failed: %s", conn->name,
strerror(err));
director_connection_deinit(&conn);
+
+ /* try connecting to next server */
+ director_connect(dir);
return;
}
conn->connected = TRUE;
director_connection_send_hosts(str);
director_connection_send(conn, str_c(str));
- conn->user_iter = user_directory_iter_init(conn->dir->users);
+ conn->user_iter = user_directory_iter_init(dir->users);
(void)director_connection_send_users(conn);
}
#include "director-connection.h"
#include "director.h"
+#define DIRECTOR_RECONNECT_RETRY_SECS 60
+
static bool director_is_self_ip_set(struct director *dir)
{
struct ip_addr ip;
i_assert(dir->right == NULL);
+ if (host->last_failed + DIRECTOR_RECONNECT_RETRY_SECS > ioloop_time) {
+ /* failed recently, don't try retrying here */
+ return -1;
+ }
+
fd = net_connect_ip(&host->ip, host->port, NULL);
if (fd == -1) {
+ host->last_failed = ioloop_time;
i_error("connect(%s) failed: %m", host->name);
return -1;
}
dir->right = director_connection_init_out(dir, fd, host);
- return 1;
+ return 0;
}
void director_connect(struct director *dir)
for (i = 1; i < count; i++) {
unsigned int idx = (self_idx + i) % count;
- if (director_connect_host(dir, hosts[idx]) > 0)
+ if (director_connect_host(dir, hosts[idx]) == 0)
break;
}
if (i == count) {