mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-31 10:56:12 +01:00 
			
		
		
		
	 8fb09426b9
			
		
	
	
	8fb09426b9
	
	
	
		
			
			In commit b6923420f3 (MDEV-29445)
some hash tables were accidentally created with the minimum size
(101 entries) instead of correctly deriving the size from the
initial innodb_buffer_pool_size. This led to very long hash bucket
chains, which are very slow to traverse.
ut_find_prime(): Assert that the size is nonzero in order to catch
this type of regression in the future.
innodb_init_params(): Do not bother reading buf_pool.curr_size()
when it is known to be 0,
srv_start(): Correctly initialize srv_lock_table_size to 5 times
buf_pool.curr_size(), that is, the buffer pool size in pages,
between invoking buf_pool.create() and lock_sys.create().
btr_search_enable(), dict_sys_t::create(), dict_sys_t::resize():
Correctly refer to buf_pool.curr_pool_size(), that is,
innodb_buffer_pool_size in bytes, when calculating the hash table size.
In MDEV-29445 the expressions buf_pool_get_curr_size() were
accidentally replaced with buf_pool.curr_size().
		
	
			
		
			
				
	
	
		
			95 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*****************************************************************************
 | |
| 
 | |
| Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved.
 | |
| Copyright (c) 2019, 2020, MariaDB Corporation.
 | |
| 
 | |
| This program is free software; you can redistribute it and/or modify it under
 | |
| the terms of the GNU General Public License as published by the Free Software
 | |
| Foundation; version 2 of the License.
 | |
| 
 | |
| This program is distributed in the hope that it will be useful, but WITHOUT
 | |
| ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 | |
| FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
 | |
| 
 | |
| You should have received a copy of the GNU General Public License along with
 | |
| this program; if not, write to the Free Software Foundation, Inc.,
 | |
| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA
 | |
| 
 | |
| *****************************************************************************/
 | |
| 
 | |
| /***************************************************************//**
 | |
| @file ut/ut0rnd.cc
 | |
| Random numbers and hashing
 | |
| 
 | |
| Created 5/11/1994 Heikki Tuuri
 | |
| ********************************************************************/
 | |
| 
 | |
| #include "ut0rnd.h"
 | |
| 
 | |
| /** Seed value of ut_rnd_gen() */
 | |
| std::atomic<uint32_t> ut_rnd_current;
 | |
| 
 | |
| /** These random numbers are used in ut_find_prime */
 | |
| /*@{*/
 | |
| #define	UT_RANDOM_1	1.0412321
 | |
| #define	UT_RANDOM_2	1.1131347
 | |
| #define UT_RANDOM_3	1.0132677
 | |
| /*@}*/
 | |
| 
 | |
| /***********************************************************//**
 | |
| Looks for a prime number slightly greater than the given argument.
 | |
| The prime is chosen so that it is not near any power of 2.
 | |
| @return prime */
 | |
| ulint
 | |
| ut_find_prime(
 | |
| /*==========*/
 | |
| 	ulint	n)	/*!< in: positive number > 100 */
 | |
| {
 | |
| 	ulint	pow2;
 | |
| 	ulint	i;
 | |
| 
 | |
| 	ut_ad(n);
 | |
| 
 | |
| 	n += 100;
 | |
| 
 | |
| 	pow2 = 1;
 | |
| 	while (pow2 * 2 < n) {
 | |
| 		pow2 = 2 * pow2;
 | |
| 	}
 | |
| 
 | |
| 	if ((double) n < 1.05 * (double) pow2) {
 | |
| 		n = (ulint) ((double) n * UT_RANDOM_1);
 | |
| 	}
 | |
| 
 | |
| 	pow2 = 2 * pow2;
 | |
| 
 | |
| 	if ((double) n > 0.95 * (double) pow2) {
 | |
| 		n = (ulint) ((double) n * UT_RANDOM_2);
 | |
| 	}
 | |
| 
 | |
| 	if (n > pow2 - 20) {
 | |
| 		n += 30;
 | |
| 	}
 | |
| 
 | |
| 	/* Now we have n far enough from powers of 2. To make
 | |
| 	n more random (especially, if it was not near
 | |
| 	a power of 2), we then multiply it by a random number. */
 | |
| 
 | |
| 	n = (ulint) ((double) n * UT_RANDOM_3);
 | |
| 
 | |
| 	for (;; n++) {
 | |
| 		i = 2;
 | |
| 		while (i * i <= n) {
 | |
| 			if (n % i == 0) {
 | |
| 				goto next_n;
 | |
| 			}
 | |
| 			i++;
 | |
| 		}
 | |
| 
 | |
| 		/* Found a prime */
 | |
| 		break;
 | |
| next_n:		;
 | |
| 	}
 | |
| 
 | |
| 	return(n);
 | |
| }
 |