srv0start.c:

  Fix bug #5414 in 4.1: srv_max_n_threads was always set to only 1000, regardless of the buffer pool size; undelr very high concurrent loads this could cause an assertion failure in sync0arr.c line 384 when we ran out of wait slots for threads; also innodb_thread_concurrency did not work, because the wait queue also there overflowed at 1000 concurrent threads; also remove redundant code
trx0undo.c:
  Add a missing newline to fprints
parent ad6ad34b
...@@ -1055,34 +1055,15 @@ innobase_start_or_create_for_mysql(void) ...@@ -1055,34 +1055,15 @@ innobase_start_or_create_for_mysql(void)
srv_file_flush_method_str); srv_file_flush_method_str);
return(DB_ERROR); return(DB_ERROR);
} }
/* Set the maximum number of threads which can wait for a semaphore
inside InnoDB */
#if defined(__WIN__) || defined(__NETWARE__)
/* Create less event semaphores because Win 98/ME had difficulty creating
40000 event semaphores.
Comment from Novell, Inc.: also, these just take a lot of memory on
NetWare. */
srv_max_n_threads = 1000;
#else
if (srv_pool_size >= 8 * 1024) {
/* Here we still have srv_pool_size counted
in kilobytes, srv_boot converts the value to
pages; if buffer pool is less than 8 MB,
assume fewer threads. */
srv_max_n_threads = 10000;
} else {
srv_max_n_threads = 1000; /* saves several MB of memory,
especially in 64-bit
computers */
}
#endif
/* Note that the call srv_boot() also changes the values of /* Note that the call srv_boot() also changes the values of
srv_pool_size etc. to the units used by InnoDB internally */ srv_pool_size etc. to the units used by InnoDB internally */
/* Set the maximum number of threads which can wait for a semaphore /* Set the maximum number of threads which can wait for a semaphore
inside InnoDB */ inside InnoDB: this is the 'sync wait array' size, as well as the
maximum number of threads that can wait in the 'srv_conc array' for
their time to enter InnoDB. */
#if defined(__WIN__) || defined(__NETWARE__) #if defined(__WIN__) || defined(__NETWARE__)
/* Create less event semaphores because Win 98/ME had difficulty creating /* Create less event semaphores because Win 98/ME had difficulty creating
...@@ -1091,11 +1072,16 @@ Comment from Novell, Inc.: also, these just take a lot of memory on ...@@ -1091,11 +1072,16 @@ Comment from Novell, Inc.: also, these just take a lot of memory on
NetWare. */ NetWare. */
srv_max_n_threads = 1000; srv_max_n_threads = 1000;
#else #else
if (srv_pool_size >= 8 * 1024 * 1024) { if (srv_pool_size >= 1000 * 1024) {
/* Here we still have srv_pool_size counted /* Here we still have srv_pool_size counted
in bytes, srv_boot converts the value to in kilobytes (in 4.0 this was in bytes)
pages; if buffer pool is less than 8 MB, srv_boot() converts the value to
pages; if buffer pool is less than 1000 MB,
assume fewer threads. */ assume fewer threads. */
srv_max_n_threads = 50000;
} else if (srv_pool_size >= 8 * 1024) {
srv_max_n_threads = 10000; srv_max_n_threads = 10000;
} else { } else {
srv_max_n_threads = 1000; /* saves several MB of memory, srv_max_n_threads = 1000; /* saves several MB of memory,
...@@ -1103,7 +1089,7 @@ NetWare. */ ...@@ -1103,7 +1089,7 @@ NetWare. */
computers */ computers */
} }
#endif #endif
err = srv_boot(); err = srv_boot(); /* This changes srv_pool_size to units of a page */
if (err != DB_SUCCESS) { if (err != DB_SUCCESS) {
......
...@@ -404,7 +404,7 @@ trx_undo_seg_create( ...@@ -404,7 +404,7 @@ trx_undo_seg_create(
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fprintf(stderr, fprintf(stderr,
"InnoDB: Warning: cannot find a free slot for an undo log. Do you have too\n" "InnoDB: Warning: cannot find a free slot for an undo log. Do you have too\n"
"InnoDB: many active transactions running concurrently?"); "InnoDB: many active transactions running concurrently?\n");
return(NULL); return(NULL);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment