Replace callers of dynahash.h's my_log() by equivalent in pg_bitutils.h

All the calls replaced by this commit use 4-byte integers for their
variables used in input of my_log2().  Hence, the limit against
too-large inputs does not really apply.  Thresholds are also applied, as
of:
- In nodeAgg.c, the number of partitions is limited by
HASHAGG_MAX_PARTITIONS.
- In nodeHash.c, ExecChooseHashTableSize() caps its maximum number of
buckets based on HashJoinTuple and palloc() allocation limit.
- In worker.c, the number of subxacts tracked by ApplySubXactData uses
uint32, making pg_ceil_log2_64() safe to use directly.

Several approaches have been discussed, like an integration with
thresholds in pg_bitutils.h, but it was found confusing.  This uses
Dean's idea, which gives a simpler result than what I came up with to be
able to remove dynahash.h.  dynahash.h will be removed in a follow-up
commit, removing some duplication with the ceil log2 routines.

Reviewed-by: Peter Eisentraut <peter@eisentraut.org>
Reviewed-by: Dean Rasheed <dean.a.rasheed@gmail.com>
Discussion: https://postgr.es/m/CAEZATCUJPQD_7sC-wErak2CQGNa6bj2hY-mr8wsBki=kX7f2_A@mail.gmail.com
This commit is contained in:
Michael Paquier 2025-09-10 11:20:46 +09:00
parent 8c8f7b199d
commit b1187266e0
3 changed files with 5 additions and 8 deletions

View File

@ -267,7 +267,6 @@
#include "utils/acl.h" #include "utils/acl.h"
#include "utils/builtins.h" #include "utils/builtins.h"
#include "utils/datum.h" #include "utils/datum.h"
#include "utils/dynahash.h"
#include "utils/expandeddatum.h" #include "utils/expandeddatum.h"
#include "utils/injection_point.h" #include "utils/injection_point.h"
#include "utils/logtape.h" #include "utils/logtape.h"
@ -2115,7 +2114,7 @@ hash_choose_num_partitions(double input_groups, double hashentrysize,
npartitions = (int) dpartitions; npartitions = (int) dpartitions;
/* ceil(log2(npartitions)) */ /* ceil(log2(npartitions)) */
partition_bits = my_log2(npartitions); partition_bits = pg_ceil_log2_32(npartitions);
/* make sure that we don't exhaust the hash bits */ /* make sure that we don't exhaust the hash bits */
if (partition_bits + used_bits >= 32) if (partition_bits + used_bits >= 32)

View File

@ -36,7 +36,6 @@
#include "executor/nodeHashjoin.h" #include "executor/nodeHashjoin.h"
#include "miscadmin.h" #include "miscadmin.h"
#include "port/pg_bitutils.h" #include "port/pg_bitutils.h"
#include "utils/dynahash.h"
#include "utils/lsyscache.h" #include "utils/lsyscache.h"
#include "utils/memutils.h" #include "utils/memutils.h"
#include "utils/syscache.h" #include "utils/syscache.h"
@ -340,7 +339,7 @@ MultiExecParallelHash(HashState *node)
*/ */
hashtable->curbatch = -1; hashtable->curbatch = -1;
hashtable->nbuckets = pstate->nbuckets; hashtable->nbuckets = pstate->nbuckets;
hashtable->log2_nbuckets = my_log2(hashtable->nbuckets); hashtable->log2_nbuckets = pg_ceil_log2_32(hashtable->nbuckets);
hashtable->totalTuples = pstate->total_tuples; hashtable->totalTuples = pstate->total_tuples;
/* /*
@ -480,7 +479,7 @@ ExecHashTableCreate(HashState *state)
&nbuckets, &nbatch, &num_skew_mcvs); &nbuckets, &nbatch, &num_skew_mcvs);
/* nbuckets must be a power of 2 */ /* nbuckets must be a power of 2 */
log2_nbuckets = my_log2(nbuckets); log2_nbuckets = pg_ceil_log2_32(nbuckets);
Assert(nbuckets == (1 << log2_nbuckets)); Assert(nbuckets == (1 << log2_nbuckets));
/* /*
@ -3499,7 +3498,7 @@ ExecParallelHashTableSetCurrentBatch(HashJoinTable hashtable, int batchno)
dsa_get_address(hashtable->area, dsa_get_address(hashtable->area,
hashtable->batches[batchno].shared->buckets); hashtable->batches[batchno].shared->buckets);
hashtable->nbuckets = hashtable->parallel_state->nbuckets; hashtable->nbuckets = hashtable->parallel_state->nbuckets;
hashtable->log2_nbuckets = my_log2(hashtable->nbuckets); hashtable->log2_nbuckets = pg_ceil_log2_32(hashtable->nbuckets);
hashtable->current_chunk = NULL; hashtable->current_chunk = NULL;
hashtable->current_chunk_shared = InvalidDsaPointer; hashtable->current_chunk_shared = InvalidDsaPointer;
hashtable->batches[batchno].at_least_one_chunk = false; hashtable->batches[batchno].at_least_one_chunk = false;

View File

@ -276,7 +276,6 @@
#include "storage/procarray.h" #include "storage/procarray.h"
#include "tcop/tcopprot.h" #include "tcop/tcopprot.h"
#include "utils/acl.h" #include "utils/acl.h"
#include "utils/dynahash.h"
#include "utils/guc.h" #include "utils/guc.h"
#include "utils/inval.h" #include "utils/inval.h"
#include "utils/lsyscache.h" #include "utils/lsyscache.h"
@ -5115,7 +5114,7 @@ subxact_info_read(Oid subid, TransactionId xid)
len = sizeof(SubXactInfo) * subxact_data.nsubxacts; len = sizeof(SubXactInfo) * subxact_data.nsubxacts;
/* we keep the maximum as a power of 2 */ /* we keep the maximum as a power of 2 */
subxact_data.nsubxacts_max = 1 << my_log2(subxact_data.nsubxacts); subxact_data.nsubxacts_max = 1 << pg_ceil_log2_32(subxact_data.nsubxacts);
/* /*
* Allocate subxact information in the logical streaming context. We need * Allocate subxact information in the logical streaming context. We need