]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
director: Make director_consistent_hashing=yes mandatory
authorMartti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
Mon, 3 Apr 2017 11:30:13 +0000 (14:30 +0300)
committerGitLab <gitlab@git.dovecot.net>
Mon, 3 Apr 2017 15:19:32 +0000 (18:19 +0300)
src/director/director-connection.c
src/director/director-settings.c
src/director/director-settings.h
src/director/director.c
src/director/doveadm-connection.c
src/director/mail-host.c
src/director/mail-host.h

index 7cddc094f9e66a845367e7e84b735ec7a050b52c..711f69a4acea33aead61b7f29a158c43e5d2ef13 100644 (file)
@@ -1285,8 +1285,10 @@ director_handshake_cmd_options(struct director_connection *conn,
                if (strcmp(args[i], DIRECTOR_OPT_CONSISTENT_HASHING) == 0)
                        consistent_hashing = TRUE;
        }
-       if (consistent_hashing != conn->dir->set->director_consistent_hashing) {
-               i_error("director(%s): director_consistent_hashing settings differ between directors",
+       if (!consistent_hashing) {
+               i_error("director(%s): director_consistent_hashing settings "
+                       "differ between directors. Set "
+                       "director_consistent_hashing=yes on old directors",
                        conn->name);
                return -1;
        }
@@ -1860,9 +1862,7 @@ static int director_connection_send_done(struct director_connection *conn)
 {
        i_assert(conn->version_received);
 
-       if (!conn->dir->set->director_consistent_hashing)
-               ;
-       else if (conn->minor_version >= DIRECTOR_VERSION_OPTIONS) {
+       if (conn->minor_version >= DIRECTOR_VERSION_OPTIONS) {
                director_connection_send(conn,
                        "OPTIONS\t"DIRECTOR_OPT_CONSISTENT_HASHING"\n");
        } else {
index 7768e12dd000ac0b17e6ef98ca1dd395d5d21150..a195034a205d6882e129bd2239a53194fc289249 100644 (file)
@@ -74,7 +74,6 @@ static const struct setting_define director_setting_defines[] = {
        DEF(SET_STR, director_flush_socket),
        DEF(SET_TIME, director_user_expire),
        DEF(SET_TIME, director_user_kick_delay),
-       DEF(SET_BOOL, director_consistent_hashing),
 
        SETTING_DEFINE_LIST_END
 };
@@ -88,7 +87,6 @@ const struct director_settings director_default_settings = {
        .director_flush_socket = "",
        .director_user_expire = 60*15,
        .director_user_kick_delay = 2,
-       .director_consistent_hashing = TRUE
 };
 
 const struct setting_parser_info director_setting_parser_info = {
index 36fd575374c7fd6c376a573c66a1c32e498bc28e..c4e8f6d8070c8cdb94ace20d8aeab48e72adffe0 100644 (file)
@@ -13,7 +13,6 @@ struct director_settings {
 
        unsigned int director_user_expire;
        unsigned int director_user_kick_delay;
-       bool director_consistent_hashing;
 };
 
 extern const struct setting_parser_info director_setting_parser_info;
index 941c211fdf2d072fa6143a430cf4e0e5bb7ecf38..a2fafad04f59e72be1225bd7e348e0d75c44743f 100644 (file)
@@ -1350,7 +1350,6 @@ director_init(const struct director_settings *set,
        i_array_init(&dir->pending_requests, 16);
        i_array_init(&dir->connections, 8);
        dir->mail_hosts = mail_hosts_init(set->director_user_expire,
-                                         set->director_consistent_hashing,
                                          director_user_freed);
 
        dir->ipc_proxy = ipc_client_init(DIRECTOR_IPC_PROXY_PATH);
index 54fd5e0c8b77053beb76696620a0697b0c08fba4..b7628f381b1d518c465f252170c09a7d99a147af 100644 (file)
@@ -83,7 +83,6 @@ static void doveadm_cmd_host_list_removed(struct doveadm_connection *conn)
        int ret;
 
        orig_hosts_list = mail_hosts_init(conn->dir->set->director_user_expire,
-                                         conn->dir->set->director_consistent_hashing,
                                          NULL);
        (void)mail_hosts_parse_and_add(orig_hosts_list,
                                       conn->dir->set->director_mail_servers);
index 4cf8a6f6fdfd181618286087d07a3c2a16034398..a5c5b409f4e9270d14549be0a4ff16ab1b70ebd6 100644 (file)
@@ -16,7 +16,6 @@ struct mail_host_list {
        user_free_hook_t *user_free_hook;
        unsigned int hosts_hash;
        unsigned int user_expire_secs;
-       bool consistent_hashing;
        bool vhosts_unsorted;
        bool have_vhosts;
 };
@@ -92,25 +91,6 @@ mail_tag_vhosts_sort_ring(struct mail_host_list *list, struct mail_tag *tag)
        array_sort(&tag->vhosts, mail_vhost_cmp);
 }
 
-static void
-mail_tag_vhosts_sort_direct(struct mail_host_list *list, struct mail_tag *tag)
-{
-       struct mail_vhost *vhost;
-       struct mail_host *const *hostp;
-       unsigned int i;
-
-       /* rebuild vhosts */
-       array_clear(&tag->vhosts);
-       array_foreach(&list->hosts, hostp) {
-               if ((*hostp)->down || (*hostp)->tag != tag)
-                       continue;
-               for (i = 0; i < (*hostp)->vhost_count; i++) {
-                       vhost = array_append_space(&tag->vhosts);
-                       vhost->host = *hostp;
-               }
-       }
-}
-
 static void
 mail_hosts_sort(struct mail_host_list *list)
 {
@@ -122,10 +102,7 @@ mail_hosts_sort(struct mail_host_list *list)
 
        list->have_vhosts = FALSE;
        array_foreach(&list->tags, tagp) {
-               if (list->consistent_hashing)
-                       mail_tag_vhosts_sort_ring(list, *tagp);
-               else
-                       mail_tag_vhosts_sort_direct(list, *tagp);
+               mail_tag_vhosts_sort_ring(list, *tagp);
                if (array_count(&(*tagp)->vhosts) > 0)
                        list->have_vhosts = TRUE;
        }
@@ -439,18 +416,6 @@ mail_host_get_by_hash_ring(struct mail_tag *tag, unsigned int hash)
        return vhosts[idx % count].host;
 }
 
-static struct mail_host *
-mail_host_get_by_hash_direct(struct mail_tag *tag, unsigned int hash)
-{
-       const struct mail_vhost *vhosts;
-       unsigned int count;
-
-       vhosts = array_get(&tag->vhosts, &count);
-       if (count == 0)
-               return NULL;
-       return vhosts[hash % count].host;
-}
-
 struct mail_host *
 mail_host_get_by_hash(struct mail_host_list *list, unsigned int hash,
                      const char *tag_name)
@@ -464,10 +429,7 @@ mail_host_get_by_hash(struct mail_host_list *list, unsigned int hash,
        if (tag == NULL)
                return NULL;
 
-       if (list->consistent_hashing)
-               return mail_host_get_by_hash_ring(tag, hash);
-       else
-               return mail_host_get_by_hash_direct(tag, hash);
+       return mail_host_get_by_hash_ring(tag, hash);
 }
 
 void mail_hosts_set_synced(struct mail_host_list *list)
@@ -521,14 +483,13 @@ const ARRAY_TYPE(mail_tag) *mail_hosts_get_tags(struct mail_host_list *list)
 }
 
 struct mail_host_list *
-mail_hosts_init(unsigned int user_expire_secs, bool consistent_hashing,
+mail_hosts_init(unsigned int user_expire_secs,
                user_free_hook_t *user_free_hook)
 {
        struct mail_host_list *list;
 
        list = i_new(struct mail_host_list, 1);
        list->user_expire_secs = user_expire_secs;
-       list->consistent_hashing = consistent_hashing;
        list->user_free_hook = user_free_hook;
 
        i_array_init(&list->hosts, 16);
@@ -570,8 +531,7 @@ struct mail_host_list *mail_hosts_dup(const struct mail_host_list *src)
        struct mail_host_list *dest;
        struct mail_host *const *hostp, *dest_host;
 
-       dest = mail_hosts_init(src->user_expire_secs, src->consistent_hashing,
-                              src->user_free_hook);
+       dest = mail_hosts_init(src->user_expire_secs, src->user_free_hook);
        array_foreach(&src->hosts, hostp) {
                dest_host = mail_host_dup(dest, *hostp);
                array_append(&dest->hosts, &dest_host, 1);
index cee78578922c534e29ec74658680a3c387dda4c5..4cf65c9294dff701c4be580c6001cc181527ed72 100644 (file)
@@ -77,7 +77,7 @@ mail_hosts_find_user(struct mail_host_list *list, const char *tag_name,
                     unsigned int username_hash);
 
 struct mail_host_list *
-mail_hosts_init(unsigned int user_expire_secs, bool consistent_hashing,
+mail_hosts_init(unsigned int user_expire_secs,
                user_free_hook_t *user_free_hook);
 void mail_hosts_deinit(struct mail_host_list **list);