summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <kroki/tomash@moonlight.intranet>2006-10-30 17:58:56 +0300
committerunknown <kroki/tomash@moonlight.intranet>2006-10-30 17:58:56 +0300
commit49c9509a5f485c73b12f9f971a274e2e31624a91 (patch)
tree66d35aef9690c2bbef2846c1847f38bb3fcd65f5
parent722d4330185af36e733f5d451d48c7f55baa39c8 (diff)
parent885dc1cb9b7ddbf28ad72c754165a2b87ea79da7 (diff)
downloadmariadb-git-49c9509a5f485c73b12f9f971a274e2e31624a91.tar.gz
Merge moonlight.intranet:/home/tomash/src/mysql_ab/mysql-4.1-runtime
into moonlight.intranet:/home/tomash/src/mysql_ab/mysql-4.1-bug21915
-rw-r--r--sql/mysql_priv.h2
-rw-r--r--sql/mysqld.cc42
2 files changed, 35 insertions, 9 deletions
diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h
index 4a5658c5ccf..c2d378c0be9 100644
--- a/sql/mysql_priv.h
+++ b/sql/mysql_priv.h
@@ -95,6 +95,8 @@ MY_LOCALE *my_locale_by_name(const char *name);
#define MAX_ACCEPT_RETRY 10 // Test accept this many times
#define MAX_FIELDS_BEFORE_HASH 32
#define USER_VARS_HASH_SIZE 16
+#define TABLE_OPEN_CACHE_MIN 64
+#define TABLE_OPEN_CACHE_DEFAULT 64
#define STACK_MIN_SIZE 8192 // Abort if less stack during eval.
#define STACK_BUFF_ALLOC 64 // For stack overrun checks
#ifndef MYSQLD_NET_RETRY_COUNT
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index bf83772a8d8..f7b1a2687ea 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -2526,19 +2526,43 @@ static int init_common_variables(const char *conf_file_name, int argc,
/* connections and databases needs lots of files */
{
- uint files, wanted_files;
+ uint files, wanted_files, max_open_files;
- wanted_files= 10+(uint) max(max_connections*5,
- max_connections+table_cache_size*2);
- set_if_bigger(wanted_files, open_files_limit);
- files= my_set_max_open_files(wanted_files);
+ /* MyISAM requires two file handles per table. */
+ wanted_files= 10+max_connections+table_cache_size*2;
+ /*
+ We are trying to allocate no less than max_connections*5 file
+ handles (i.e. we are trying to set the limit so that they will
+ be available). In addition, we allocate no less than how much
+ was already allocated. However below we report a warning and
+ recompute values only if we got less file handles than were
+ explicitly requested. No warning and re-computation occur if we
+ can't get max_connections*5 but still got no less than was
+ requested (value of wanted_files).
+ */
+ max_open_files= max(max(wanted_files, max_connections*5),
+ open_files_limit);
+ files= my_set_max_open_files(max_open_files);
if (files < wanted_files)
{
if (!open_files_limit)
{
- max_connections= (ulong) min((files-10),max_connections);
- table_cache_size= (ulong) max((files-10-max_connections)/2,64);
+ /*
+ If we have requested too much file handles than we bring
+ max_connections in supported bounds.
+ */
+ max_connections= (ulong) min(files-10-TABLE_OPEN_CACHE_MIN*2,
+ max_connections);
+ /*
+ Decrease table_cache_size according to max_connections, but
+ not below TABLE_OPEN_CACHE_MIN. Outer min() ensures that we
+ never increase table_cache_size automatically (that could
+ happen if max_connections is decreased above).
+ */
+ table_cache_size= (ulong) min(max((files-10-max_connections)/2,
+ TABLE_OPEN_CACHE_MIN),
+ table_cache_size);
DBUG_PRINT("warning",
("Changed limits: max_open_files: %u max_connections: %ld table_cache: %ld",
files, max_connections, table_cache_size));
@@ -5511,8 +5535,8 @@ The minimum value for this variable is 4096.",
0, 0, 0, 0},
{"table_cache", OPT_TABLE_CACHE,
"The number of open tables for all threads.", (gptr*) &table_cache_size,
- (gptr*) &table_cache_size, 0, GET_ULONG, REQUIRED_ARG, 64, 1, 512*1024L,
- 0, 1, 0},
+ (gptr*) &table_cache_size, 0, GET_ULONG, REQUIRED_ARG,
+ TABLE_OPEN_CACHE_DEFAULT, 1, 512*1024L, 0, 1, 0},
{"thread_cache_size", OPT_THREAD_CACHE_SIZE,
"How many threads we should keep in a cache for reuse.",
(gptr*) &thread_cache_size, (gptr*) &thread_cache_size, 0, GET_ULONG,