From 220e048b26659561b5c180feafb3ae6fc95749ae Mon Sep 17 00:00:00 2001
From: Alexey Tikhonov <atikhono@redhat.com>
Date: Wed, 2 Dec 2020 21:22:47 +0100
Subject: [PATCH] dhash tables are now created with count=0 whenever no useful
 size hint available

This improves performance. For justification see
https://github.com/SSSD/sssd/issues/5134#issuecomment-737443576
and next comment.
---
 src/ldb_modules/memberof.c                              | 2 +-
 src/lib/sifp/sss_sifp_parser.c                          | 2 +-
 src/providers/ad/ad_init.c                              | 2 +-
 src/providers/ipa/ipa_netgroups.c                       | 6 +++---
 src/providers/ipa/ipa_subdomains_ext_groups.c           | 4 ++--
 src/providers/ipa/ipa_sudo_conversion.c                 | 6 +++---
 src/providers/krb5/krb5_delayed_online_authentication.c | 4 +---
 src/providers/krb5/krb5_renew_tgt.c                     | 4 +---
 src/providers/krb5/krb5_wait_queue.c                    | 4 +---
 src/providers/ldap/sdap_async_autofs.c                  | 2 +-
 src/providers/ldap/sdap_async_initgroups.c              | 2 +-
 src/providers/ldap/sdap_async_initgroups_ad.c           | 2 +-
 src/providers/ldap/sdap_async_nested_groups.c           | 6 +++---
 src/responder/ifp/ifp_iface/ifp_iface_types.c           | 2 +-
 src/responder/ifp/ifp_users.c                           | 2 +-
 src/responder/kcm/kcmsrv_op_queue.c                     | 4 +---
 src/responder/pam/pamsrv.c                              | 2 +-
 src/util/child_common.c                                 | 2 +-
 src/util/find_uid.c                                     | 3 +--
 src/util/sss_ptr_hash.c                                 | 2 +-
 src/util/util.c                                         | 2 +-
 21 files changed, 28 insertions(+), 37 deletions(-)

diff --git a/src/ldb_modules/memberof.c b/src/ldb_modules/memberof.c
index 5de3b7c3b5..bf8f180aac 100644
--- a/src/ldb_modules/memberof.c
+++ b/src/ldb_modules/memberof.c
@@ -4248,7 +4248,7 @@ static int mbof_member_update(struct mbof_rcmp_context *ctx,
     key.str = discard_const(ldb_dn_get_linearized(parent->dn));
 
     if (!mem->memberofs) {
-        ret = hash_create_ex(32, &mem->memberofs, 0, 0, 0, 0,
+        ret = hash_create_ex(0, &mem->memberofs, 0, 0, 0, 0,
                              hash_alloc, hash_free, mem, NULL, NULL);
         if (ret != HASH_SUCCESS) {
             return LDB_ERR_OPERATIONS_ERROR;
diff --git a/src/lib/sifp/sss_sifp_parser.c b/src/lib/sifp/sss_sifp_parser.c
index 43eab4d2b3..77dc4eef32 100644
--- a/src/lib/sifp/sss_sifp_parser.c
+++ b/src/lib/sifp/sss_sifp_parser.c
@@ -401,7 +401,7 @@ sss_sifp_parse_array(sss_sifp_ctx *ctx,
             goto done;
         }
 
-        hret = hash_create_ex(10, &(attr->data.str_dict), 0, 0, 0, 0,
+        hret = hash_create_ex(0, &(attr->data.str_dict), 0, 0, 0, 0,
                               ctx->alloc_fn, ctx->free_fn, ctx->alloc_pvt,
                               hash_delete_cb, ctx);
         if (hret != HASH_SUCCESS) {
diff --git a/src/providers/ad/ad_init.c b/src/providers/ad/ad_init.c
index d88f375c03..b66d401aef 100644
--- a/src/providers/ad/ad_init.c
+++ b/src/providers/ad/ad_init.c
@@ -294,7 +294,7 @@ static errno_t ad_init_gpo(struct ad_access_ctx *access_ctx)
     access_ctx->gpo_cache_timeout = gpo_cache_timeout;
 
     /* GPO logon maps */
-    ret = sss_hash_create(access_ctx, 10, &access_ctx->gpo_map_options_table);
+    ret = sss_hash_create(access_ctx, 0, &access_ctx->gpo_map_options_table);
     if (ret != EOK) {
         DEBUG(SSSDBG_FATAL_FAILURE, "Could not create gpo_map_options "
               "hash table [%d]: %s\n", ret, sss_strerror(ret));
diff --git a/src/providers/ipa/ipa_netgroups.c b/src/providers/ipa/ipa_netgroups.c
index 8d3ebf194f..52d90af4ff 100644
--- a/src/providers/ipa/ipa_netgroups.c
+++ b/src/providers/ipa/ipa_netgroups.c
@@ -224,11 +224,11 @@ struct tevent_req *ipa_get_netgroups_send(TALLOC_CTX *memctx,
         goto done;
     }
 
-    ret = sss_hash_create(state, 32, &state->new_netgroups);
+    ret = sss_hash_create(state, 0, &state->new_netgroups);
     if (ret != EOK) goto done;
-    ret = sss_hash_create(state, 32, &state->new_users);
+    ret = sss_hash_create(state, 0, &state->new_users);
     if (ret != EOK) goto done;
-    ret = sss_hash_create(state, 32, &state->new_hosts);
+    ret = sss_hash_create(state, 0, &state->new_hosts);
     if (ret != EOK) goto done;
 
 
diff --git a/src/providers/ipa/ipa_subdomains_ext_groups.c b/src/providers/ipa/ipa_subdomains_ext_groups.c
index 790ae9d163..d4c6c27943 100644
--- a/src/providers/ipa/ipa_subdomains_ext_groups.c
+++ b/src/providers/ipa/ipa_subdomains_ext_groups.c
@@ -121,7 +121,7 @@ static errno_t process_ext_groups(TALLOC_CTX *mem_ctx, size_t reply_count,
                     }
                 }
             } else if (ret == HASH_ERROR_KEY_NOT_FOUND) {
-                ret = sss_hash_create(ext_group_hash, 5, &m_hash);
+                ret = sss_hash_create(ext_group_hash, 0, &m_hash);
                 if (ret != HASH_SUCCESS) {
                     DEBUG(SSSDBG_OP_FAILURE, "sss_hash_create failed.\n");
                     goto done;
@@ -208,7 +208,7 @@ static errno_t find_ipa_ext_memberships(TALLOC_CTX *mem_ctx,
         goto done;
     }
 
-    ret = sss_hash_create(tmp_ctx, 10, &group_hash);
+    ret = sss_hash_create(tmp_ctx, 0, &group_hash);
     if (ret != HASH_SUCCESS) {
         DEBUG(SSSDBG_OP_FAILURE, "sss_hash_create failed.\n");
         goto done;
diff --git a/src/providers/ipa/ipa_sudo_conversion.c b/src/providers/ipa/ipa_sudo_conversion.c
index bd1ec72b3b..cfb41d8b02 100644
--- a/src/providers/ipa/ipa_sudo_conversion.c
+++ b/src/providers/ipa/ipa_sudo_conversion.c
@@ -368,21 +368,21 @@ ipa_sudo_conv_init(TALLOC_CTX *mem_ctx,
     conv->map_host = map_host;
     conv->map_hostgroup = map_hostgroup;
 
-    ret = sss_hash_create(conv, 20, &conv->rules);
+    ret = sss_hash_create(conv, 0, &conv->rules);
     if (ret != EOK) {
         DEBUG(SSSDBG_CRIT_FAILURE, "Unable to create hash table [%d]: %s\n",
               ret, sss_strerror(ret));
         goto done;
     }
 
-    ret = sss_hash_create(conv, 20, &conv->cmdgroups);
+    ret = sss_hash_create(conv, 0, &conv->cmdgroups);
     if (ret != EOK) {
         DEBUG(SSSDBG_CRIT_FAILURE, "Unable to create hash table [%d]: %s\n",
               ret, sss_strerror(ret));
         goto done;
     }
 
-    ret = sss_hash_create(conv, 20, &conv->cmds);
+    ret = sss_hash_create(conv, 0, &conv->cmds);
     if (ret != EOK) {
         DEBUG(SSSDBG_CRIT_FAILURE, "Unable to create hash table [%d]: %s\n",
               ret, sss_strerror(ret));
diff --git a/src/providers/krb5/krb5_delayed_online_authentication.c b/src/providers/krb5/krb5_delayed_online_authentication.c
index 07d375b9df..f88d8ab9be 100644
--- a/src/providers/krb5/krb5_delayed_online_authentication.c
+++ b/src/providers/krb5/krb5_delayed_online_authentication.c
@@ -33,8 +33,6 @@
 #include "util/util.h"
 #include "util/find_uid.h"
 
-#define INITIAL_USER_TABLE_SIZE 10
-
 struct deferred_auth_ctx {
     hash_table_t *user_table;
     struct be_ctx *be_ctx;
@@ -355,7 +353,7 @@ errno_t init_delayed_online_authentication(struct krb5_ctx *krb5_ctx,
         return ENOMEM;
     }
 
-    ret = hash_create_ex(INITIAL_USER_TABLE_SIZE,
+    ret = hash_create_ex(0,
                          &krb5_ctx->deferred_auth_ctx->user_table,
                          0, 0, 0, 0, hash_talloc, hash_talloc_free,
                          krb5_ctx->deferred_auth_ctx,
diff --git a/src/providers/krb5/krb5_renew_tgt.c b/src/providers/krb5/krb5_renew_tgt.c
index d79e7c3679..bef830373e 100644
--- a/src/providers/krb5/krb5_renew_tgt.c
+++ b/src/providers/krb5/krb5_renew_tgt.c
@@ -29,8 +29,6 @@
 #include "providers/krb5/krb5_utils.h"
 #include "providers/krb5/krb5_ccache.h"
 
-#define INITIAL_TGT_TABLE_SIZE 10
-
 struct renew_tgt_ctx {
     hash_table_t *tgt_table;
     struct be_ctx *be_ctx;
@@ -484,7 +482,7 @@ errno_t init_renew_tgt(struct krb5_ctx *krb5_ctx, struct be_ctx *be_ctx,
         return ENOMEM;
     }
 
-    ret = sss_hash_create_ex(krb5_ctx->renew_tgt_ctx, INITIAL_TGT_TABLE_SIZE,
+    ret = sss_hash_create_ex(krb5_ctx->renew_tgt_ctx, 0,
                              &krb5_ctx->renew_tgt_ctx->tgt_table, 0, 0, 0, 0,
                              renew_del_cb, NULL);
     if (ret != EOK) {
diff --git a/src/providers/krb5/krb5_wait_queue.c b/src/providers/krb5/krb5_wait_queue.c
index b4d3f903a9..06d7a981cd 100644
--- a/src/providers/krb5/krb5_wait_queue.c
+++ b/src/providers/krb5/krb5_wait_queue.c
@@ -29,8 +29,6 @@
 
 #include "src/providers/krb5/krb5_auth.h"
 
-#define INIT_HASH_SIZE 5
-
 struct queue_entry {
     struct queue_entry *prev;
     struct queue_entry *next;
@@ -109,7 +107,7 @@ static errno_t add_to_wait_queue(struct be_ctx *be_ctx,
     struct queue_entry *queue_entry;
 
     if (krb5_ctx->wait_queue_hash == NULL) {
-        ret = sss_hash_create_ex(krb5_ctx, INIT_HASH_SIZE,
+        ret = sss_hash_create_ex(krb5_ctx, 0,
                                  &krb5_ctx->wait_queue_hash, 0, 0, 0, 0,
                                  wait_queue_del_cb, NULL);
         if (ret != EOK) {
diff --git a/src/providers/ldap/sdap_async_autofs.c b/src/providers/ldap/sdap_async_autofs.c
index ae2fa33e14..8a542f971c 100644
--- a/src/providers/ldap/sdap_async_autofs.c
+++ b/src/providers/ldap/sdap_async_autofs.c
@@ -814,7 +814,7 @@ sdap_autofs_setautomntent_save(struct tevent_req *req)
             goto done;
         }
 
-        ret = sss_hash_create(state, 32, &entry_hash);
+        ret = sss_hash_create(state, 0, &entry_hash);
         if (ret) {
             goto done;
         }
diff --git a/src/providers/ldap/sdap_async_initgroups.c b/src/providers/ldap/sdap_async_initgroups.c
index bf8f9482ba..4c38267fe7 100644
--- a/src/providers/ldap/sdap_async_initgroups.c
+++ b/src/providers/ldap/sdap_async_initgroups.c
@@ -1632,7 +1632,7 @@ static struct tevent_req *sdap_initgr_rfc2307bis_send(
         goto done;
     }
 
-    ret = sss_hash_create(state, 32, &state->group_hash);
+    ret = sss_hash_create(state, 0, &state->group_hash);
     if (ret != EOK) {
         talloc_free(req);
         return NULL;
diff --git a/src/providers/ldap/sdap_async_initgroups_ad.c b/src/providers/ldap/sdap_async_initgroups_ad.c
index 80ac4c1f43..ce6902c1a5 100644
--- a/src/providers/ldap/sdap_async_initgroups_ad.c
+++ b/src/providers/ldap/sdap_async_initgroups_ad.c
@@ -1210,7 +1210,7 @@ sdap_ad_get_domain_local_groups_send(TALLOC_CTX *mem_ctx,
     state->groups = groups;
     state->num_groups = num_groups;
 
-    ret = sss_hash_create(state, 32, &state->group_hash);
+    ret = sss_hash_create(state, 0, &state->group_hash);
     if (ret != EOK) {
         DEBUG(SSSDBG_OP_FAILURE, "sss_hash_create failed.\n");
         goto fail;
diff --git a/src/providers/ldap/sdap_async_nested_groups.c b/src/providers/ldap/sdap_async_nested_groups.c
index 300d3de64b..2570a00bbd 100644
--- a/src/providers/ldap/sdap_async_nested_groups.c
+++ b/src/providers/ldap/sdap_async_nested_groups.c
@@ -808,21 +808,21 @@ sdap_nested_group_send(TALLOC_CTX *mem_ctx,
         goto immediately;
     }
 
-    ret = sss_hash_create(state->group_ctx, 32, &state->group_ctx->users);
+    ret = sss_hash_create(state->group_ctx, 0, &state->group_ctx->users);
     if (ret != EOK) {
         DEBUG(SSSDBG_CRIT_FAILURE, "Unable to create hash table [%d]: %s\n",
                                     ret, strerror(ret));
         goto immediately;
     }
 
-    ret = sss_hash_create(state->group_ctx, 32, &state->group_ctx->groups);
+    ret = sss_hash_create(state->group_ctx, 0, &state->group_ctx->groups);
     if (ret != EOK) {
         DEBUG(SSSDBG_CRIT_FAILURE, "Unable to create hash table [%d]: %s\n",
                                     ret, strerror(ret));
         goto immediately;
     }
 
-    ret = sss_hash_create(state->group_ctx, 32,
+    ret = sss_hash_create(state->group_ctx, 0,
                           &state->group_ctx->missing_external);
     if (ret != EOK) {
         DEBUG(SSSDBG_CRIT_FAILURE, "Unable to create hash table [%d]: %s\n",
diff --git a/src/responder/ifp/ifp_iface/ifp_iface_types.c b/src/responder/ifp/ifp_iface/ifp_iface_types.c
index 952504207d..31fbdc1b8c 100644
--- a/src/responder/ifp/ifp_iface/ifp_iface_types.c
+++ b/src/responder/ifp/ifp_iface/ifp_iface_types.c
@@ -49,7 +49,7 @@ errno_t sbus_iterator_read_ifp_extra(TALLOC_CTX *mem_ctx,
     int hret;
     int i;
 
-    ret = sss_hash_create(mem_ctx, 10, &table);
+    ret = sss_hash_create(mem_ctx, 0, &table);
     if (ret != EOK) {
         return ret;
     }
diff --git a/src/responder/ifp/ifp_users.c b/src/responder/ifp/ifp_users.c
index 91aecb896d..ac9330858f 100644
--- a/src/responder/ifp/ifp_users.c
+++ b/src/responder/ifp/ifp_users.c
@@ -1575,7 +1575,7 @@ ifp_users_user_get_extra_attributes(TALLOC_CTX *mem_ctx,
         goto done;
     }
 
-    ret = sss_hash_create(tmp_ctx, 10, &table);
+    ret = sss_hash_create(tmp_ctx, 0, &table);
     if (ret != EOK) {
         DEBUG(SSSDBG_CRIT_FAILURE, "Unable to create hash table!\n");
         goto done;
diff --git a/src/responder/kcm/kcmsrv_op_queue.c b/src/responder/kcm/kcmsrv_op_queue.c
index cd1b4c8a33..29af521def 100644
--- a/src/responder/kcm/kcmsrv_op_queue.c
+++ b/src/responder/kcm/kcmsrv_op_queue.c
@@ -23,8 +23,6 @@
 #include "util/util_creds.h"
 #include "responder/kcm/kcmsrv_pvt.h"
 
-#define QUEUE_HASH_SIZE      32
-
 struct kcm_ops_queue_entry {
     struct tevent_req *req;
 
@@ -68,7 +66,7 @@ struct kcm_ops_queue_ctx *kcm_ops_queue_create(TALLOC_CTX *mem_ctx,
         return NULL;
     }
 
-    ret = sss_hash_create_ex(mem_ctx, QUEUE_HASH_SIZE,
+    ret = sss_hash_create_ex(mem_ctx, 0,
                              &queue_ctx->wait_queue_hash, 0, 0, 0, 0,
                              NULL, NULL);
     if (ret != EOK) {
diff --git a/src/responder/pam/pamsrv.c b/src/responder/pam/pamsrv.c
index 0db2824ff0..de1620e82b 100644
--- a/src/responder/pam/pamsrv.c
+++ b/src/responder/pam/pamsrv.c
@@ -225,7 +225,7 @@ static int pam_process_init(TALLOC_CTX *mem_ctx,
     }
 
     /* Create table for initgroup lookups */
-    ret = sss_hash_create(pctx, 10, &pctx->id_table);
+    ret = sss_hash_create(pctx, 0, &pctx->id_table);
     if (ret != EOK) {
         DEBUG(SSSDBG_FATAL_FAILURE,
               "Could not create initgroups hash table: [%s]\n",
diff --git a/src/util/child_common.c b/src/util/child_common.c
index 7e8c305527..3ae9806b3b 100644
--- a/src/util/child_common.c
+++ b/src/util/child_common.c
@@ -72,7 +72,7 @@ errno_t sss_sigchld_init(TALLOC_CTX *mem_ctx,
     }
     sigchld_ctx->ev = ev;
 
-    ret = sss_hash_create(sigchld_ctx, 10, &sigchld_ctx->children);
+    ret = sss_hash_create(sigchld_ctx, 0, &sigchld_ctx->children);
     if (ret != EOK) {
         DEBUG(SSSDBG_FATAL_FAILURE,
               "fatal error initializing children hash table: [%s]\n",
diff --git a/src/util/find_uid.c b/src/util/find_uid.c
index 75ccadcf33..38e8f61644 100644
--- a/src/util/find_uid.c
+++ b/src/util/find_uid.c
@@ -45,7 +45,6 @@
 #include <systemd/sd-login.h>
 #endif
 
-#define INITIAL_TABLE_SIZE 64
 #define PATHLEN (NAME_MAX + 14)
 #define BUFSIZE 4096
 
@@ -304,7 +303,7 @@ errno_t get_uid_table(TALLOC_CTX *mem_ctx, hash_table_t **table)
 #ifdef __linux__
     int ret;
 
-    ret = hash_create_ex(INITIAL_TABLE_SIZE, table, 0, 0, 0, 0,
+    ret = hash_create_ex(0, table, 0, 0, 0, 0,
                          hash_talloc, hash_talloc_free, mem_ctx,
                          NULL, NULL);
     if (ret != HASH_SUCCESS) {
diff --git a/src/util/sss_ptr_hash.c b/src/util/sss_ptr_hash.c
index e3805dac40..115b0b9f80 100644
--- a/src/util/sss_ptr_hash.c
+++ b/src/util/sss_ptr_hash.c
@@ -172,7 +172,7 @@ hash_table_t *sss_ptr_hash_create(TALLOC_CTX *mem_ctx,
         data->pvt = del_cb_pvt;
     }
 
-    ret = sss_hash_create_ex(mem_ctx, 10, &table, 0, 0, 0, 0,
+    ret = sss_hash_create_ex(mem_ctx, 0, &table, 0, 0, 0, 0,
                              sss_ptr_hash_delete_cb, data);
     if (ret != EOK) {
         DEBUG(SSSDBG_CRIT_FAILURE, "Unable to create hash table [%d]: %s\n",
diff --git a/src/util/util.c b/src/util/util.c
index 19d4473287..8321754d83 100644
--- a/src/util/util.c
+++ b/src/util/util.c
@@ -234,7 +234,7 @@ errno_t diff_string_lists(TALLOC_CTX *memctx,
         list2 = _list2;
     }
 
-    error = hash_create(10, &table, NULL, NULL);
+    error = hash_create(0, &table, NULL, NULL);
     if (error != HASH_SUCCESS) {
         talloc_free(tmp_ctx);
         return EIO;
