mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
merge
This commit is contained in:
@ -1,9 +1,10 @@
|
|||||||
jcole@tetra.spaceapes.com
|
jcole@tetra.spaceapes.com
|
||||||
monty@donna.mysql.com
|
monty@donna.mysql.com
|
||||||
|
monty@work.mysql.com
|
||||||
mwagner@work.mysql.com
|
mwagner@work.mysql.com
|
||||||
paul@central.snake.net
|
paul@central.snake.net
|
||||||
sasha@mysql.sashanet.com
|
sasha@mysql.sashanet.com
|
||||||
sasha@work.mysql.com
|
sasha@work.mysql.com
|
||||||
serg@donna.mysql.com
|
serg@donna.mysql.com
|
||||||
|
serg@serg.mysql.com
|
||||||
tim@cane.mysql.fi
|
tim@cane.mysql.fi
|
||||||
monty@work.mysql.com
|
|
||||||
|
175
Docs/manual.texi
175
Docs/manual.texi
@ -7602,8 +7602,15 @@ To compile on NetBSD you need GNU @code{make}. Otherwise the compile will crash
|
|||||||
when @code{make} tries to run @code{lint} on C++ files.
|
when @code{make} tries to run @code{lint} on C++ files.
|
||||||
|
|
||||||
@node OpenBSD, BSDI, NetBSD, Source install system issues
|
@node OpenBSD, BSDI, NetBSD, Source install system issues
|
||||||
@subsection OpenBSD 2.5 Notes
|
@subsection OpenBSD Notes
|
||||||
|
|
||||||
|
@menu
|
||||||
|
* OpenBSD 2.5:: OpenBSD 2.5 Notes
|
||||||
|
* OpenBSD 2.8:: OpenBSD 2.8 Notes
|
||||||
|
@end menu
|
||||||
|
|
||||||
|
@node OpenBSD 2.5
|
||||||
|
@subsubsection OpenBSD 2.5 Notes
|
||||||
On OpenBSD Version 2.5, you can compile @strong{MySQL} with native threads
|
On OpenBSD Version 2.5, you can compile @strong{MySQL} with native threads
|
||||||
with the following options:
|
with the following options:
|
||||||
|
|
||||||
@ -7611,6 +7618,14 @@ with the following options:
|
|||||||
CFLAGS=-pthread CXXFLAGS=-pthread ./configure --with-mit-threads=no
|
CFLAGS=-pthread CXXFLAGS=-pthread ./configure --with-mit-threads=no
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
|
@node OpenBSD 2.8
|
||||||
|
@subsubsection OpenBSD 2.8 Notes
|
||||||
|
Our users have reported that OpenBSD 2.8 has a threading bug which causes
|
||||||
|
problems with MySQL. The OpenBSD Developers have fixed the problem, but as
|
||||||
|
of January 25th, 2001, it's only available in the ``-current'' branch. The
|
||||||
|
symptoms of this threading bug are: slow response, high load, high cpu usage,
|
||||||
|
and crashes.
|
||||||
|
|
||||||
@node BSDI, SCO, OpenBSD, Source install system issues
|
@node BSDI, SCO, OpenBSD, Source install system issues
|
||||||
@subsection BSD/OS Notes
|
@subsection BSD/OS Notes
|
||||||
|
|
||||||
@ -20312,59 +20327,64 @@ The following columns are returned:
|
|||||||
below, though the format and numbers probably differ:
|
below, though the format and numbers probably differ:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
+--------------------------+------------+
|
+--------------------------+--------+
|
||||||
| Variable_name | Value |
|
| Variable_name | Value |
|
||||||
+--------------------------+------------+
|
+--------------------------+--------+
|
||||||
| Aborted_clients | 0 |
|
| Aborted_clients | 0 |
|
||||||
| Aborted_connects | 0 |
|
| Aborted_connects | 0 |
|
||||||
| Bytes_received | 142160923 |
|
| Bytes_received | 629539 |
|
||||||
| Bytes_sent | 1161910370 |
|
| Bytes_sent | 736394 |
|
||||||
| Connections | 30022 |
|
| Connections | 62 |
|
||||||
| Created_tmp_disk_tables | 0 |
|
| Created_tmp_disk_tables | 0 |
|
||||||
| Created_tmp_tables | 8988 |
|
| Created_tmp_tables | 0 |
|
||||||
| Delayed_insert_threads | 0 |
|
| Created_tmp_files | 0 |
|
||||||
| Delayed_writes | 0 |
|
| Delayed_insert_threads | 0 |
|
||||||
| Delayed_errors | 0 |
|
| Delayed_writes | 0 |
|
||||||
| Flush_commands | 1 |
|
| Delayed_errors | 0 |
|
||||||
| Handler_delete | 462604 |
|
| Flush_commands | 1 |
|
||||||
| Handler_read_first | 95882 |
|
| Handler_delete | 0 |
|
||||||
| Handler_read_key | 27681068 |
|
| Handler_read_first | 1 |
|
||||||
| Handler_read_next | 265008218 |
|
| Handler_read_key | 9201 |
|
||||||
| Handler_read_prev | 3022500 |
|
| Handler_read_next | 0 |
|
||||||
| Handler_read_rnd | 36900998 |
|
| Handler_read_prev | 0 |
|
||||||
| Handler_read_rnd_next | 252097176 |
|
| Handler_read_rnd | 0 |
|
||||||
| Handler_update | 16945404 |
|
| Handler_read_rnd_next | 45 |
|
||||||
| Handler_write | 66826676 |
|
| Handler_update | 5998 |
|
||||||
| Key_blocks_used | 14955 |
|
| Handler_write | 0 |
|
||||||
| Key_read_requests | 90131960 |
|
| Key_blocks_used | 407 |
|
||||||
| Key_reads | 163268 |
|
| Key_read_requests | 27683 |
|
||||||
| Key_write_requests | 7573912 |
|
| Key_reads | 407 |
|
||||||
| Key_writes | 3780151 |
|
| Key_write_requests | 0 |
|
||||||
| Max_used_connections | 0 |
|
| Key_writes | 0 |
|
||||||
| Not_flushed_key_blocks | 0 |
|
| Max_used_connections | 60 |
|
||||||
| Not_flushed_delayed_rows | 0 |
|
| Not_flushed_key_blocks | 0 |
|
||||||
| Open_tables | 0 |
|
| Not_flushed_delayed_rows | 0 |
|
||||||
| Open_files | 0 |
|
| Open_tables | 60 |
|
||||||
| Open_streams | 0 |
|
| Open_files | 66 |
|
||||||
| Opened_tables | 44598 |
|
| Open_streams | 0 |
|
||||||
| Questions | 1866024 |
|
| Opened_tables | 66 |
|
||||||
| Select_full_join | 0 |
|
| Questions | 9308 |
|
||||||
| Select_full_range_join | 0 |
|
| Select_full_join | 0 |
|
||||||
| Select_range | 68187 |
|
| Select_full_range_join | 0 |
|
||||||
| Select_range_check | 0 |
|
| Select_range | 0 |
|
||||||
| Select_scan | 31440 |
|
| Select_range_check | 0 |
|
||||||
| Slave_running | OFF |
|
| Select_scan | 0 |
|
||||||
| Slow_launch_threads | 0 |
|
| Slave_running | OFF |
|
||||||
| Slow_queries | 0 |
|
| Slave_open_temp_tables | 0 |
|
||||||
| Sort_range | 0 |
|
| Slow_launch_threads | 0 |
|
||||||
| Sort_rows | 36650500 |
|
| Slow_queries | 0 |
|
||||||
| Sort_scan | 5298 |
|
| Sort_merge_passes | 0 |
|
||||||
| Threads_cached | 0 |
|
| Sort_range | 0 |
|
||||||
| Threads_connected | 1 |
|
| Sort_rows | 0 |
|
||||||
| Threads_created | 30022 |
|
| Sort_scan | 0 |
|
||||||
| Threads_running | 1 |
|
| Table_locks_immediate | 3183 |
|
||||||
| Uptime | 39613 |
|
| Table_locks_waited | 6030 |
|
||||||
+--------------------------+------------+
|
| Threads_cached | 30 |
|
||||||
|
| Threads_created | 61 |
|
||||||
|
| Threads_connected | 31 |
|
||||||
|
| Threads_running | 31 |
|
||||||
|
| Uptime | 135 |
|
||||||
|
+--------------------------+--------+
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
@cindex variables, status
|
@cindex variables, status
|
||||||
@ -20427,6 +20447,12 @@ open by the slave thread
|
|||||||
@item @code{Sort_range} @tab Number of sorts that where done with ranges.
|
@item @code{Sort_range} @tab Number of sorts that where done with ranges.
|
||||||
@item @code{Sort_rows} @tab Number of sorted rows.
|
@item @code{Sort_rows} @tab Number of sorted rows.
|
||||||
@item @code{Sort_scan} @tab Number of sorts that where done by scanning the table.
|
@item @code{Sort_scan} @tab Number of sorts that where done by scanning the table.
|
||||||
|
@item @code{Table_locks_immediate} @tab Number of times a table lock was
|
||||||
|
acquired immediately. Available after 3.23.33.
|
||||||
|
@item @code{Table_locks_waited} @tab Number of times a table lock could not
|
||||||
|
be acquired immediately and a wait was needed. If this is high, and you
|
||||||
|
have performance problems, you should first optimize your queries, and then
|
||||||
|
either split your table(s) or use replication. Available after 3.23.33.
|
||||||
@item @code{Threads_cached} @tab Number of threads in the thread cache.
|
@item @code{Threads_cached} @tab Number of threads in the thread cache.
|
||||||
@item @code{Threads_connected} @tab Number of currently open connections.
|
@item @code{Threads_connected} @tab Number of currently open connections.
|
||||||
@item @code{Threads_created} @tab Number of threads created to handle connections.
|
@item @code{Threads_created} @tab Number of threads created to handle connections.
|
||||||
@ -39012,7 +39038,7 @@ your @code{FULLTEXT} indexes.
|
|||||||
@end example
|
@end example
|
||||||
line in @code{myisam/ftdefs.h} to
|
line in @code{myisam/ftdefs.h} to
|
||||||
@example
|
@example
|
||||||
#define GWS_IN_USE GWS_IDF
|
#define GWS_IN_USE GWS_FREQ
|
||||||
@end example
|
@end example
|
||||||
and recompile @strong{MySQL}.
|
and recompile @strong{MySQL}.
|
||||||
There is no need to rebuild the indexes though.
|
There is no need to rebuild the indexes though.
|
||||||
@ -40915,14 +40941,24 @@ Fixed bug when using @code{DISTINCT} on results from functions that refered to
|
|||||||
a group function, like
|
a group function, like
|
||||||
@code{SELECT a,DISTINCT SEC_TO_TIME(sum(a)) from table_name GROUP BY a,b}.
|
@code{SELECT a,DISTINCT SEC_TO_TIME(sum(a)) from table_name GROUP BY a,b}.
|
||||||
@item
|
@item
|
||||||
|
Changed clients to use TCP/IP when -P or --port option is specified.
|
||||||
|
@item
|
||||||
|
Fixed bug in handling @code{STOP} event after @code{ROTATE} event in
|
||||||
|
replication
|
||||||
|
@item
|
||||||
|
Fixed another buffer overrun in @code{DROP DATABASE}
|
||||||
|
@item
|
||||||
|
Added @code{Table_locks_immediate} and @code{Table_locks_waited} status
|
||||||
|
variables
|
||||||
|
@item
|
||||||
Fixed bug in replication that broke slave server start with existing
|
Fixed bug in replication that broke slave server start with existing
|
||||||
@code{master.info} - bug introduced in 3.23.32
|
@code{master.info}. This fixes a bug introduced in 3.23.32.
|
||||||
@item
|
@item
|
||||||
Added @code{SET SQL_SLAVE_SKIP_COUNTER=n} command to recover from
|
Added @code{SET SQL_SLAVE_SKIP_COUNTER=n} command to recover from
|
||||||
replication glitches without a full database copy
|
replication glitches without a full database copy.
|
||||||
@item
|
@item
|
||||||
Added @code{max_binlog_size} variable - binary log will be rotated
|
Added @code{max_binlog_size} variable; the binary log will be rotated
|
||||||
automatically once the size crosses the limit.
|
automatically when the size crosses the limit.
|
||||||
@item
|
@item
|
||||||
Added @code{Last_error}, @code{Last_errno}, and @code{Slave_skip_counter} to
|
Added @code{Last_error}, @code{Last_errno}, and @code{Slave_skip_counter} to
|
||||||
@code{SHOW SLAVE STATUS}.
|
@code{SHOW SLAVE STATUS}.
|
||||||
@ -40935,7 +40971,7 @@ Execute coredump handler on @code{SIGILL}, and @code{SIGBUS} in addition to
|
|||||||
On x86 Linux, print the current query and thread (connection) id, if
|
On x86 Linux, print the current query and thread (connection) id, if
|
||||||
available, in the coredump handler.
|
available, in the coredump handler.
|
||||||
@item
|
@item
|
||||||
Fixed several timing bugs in the test suite
|
Fixed several timing bugs in the test suite.
|
||||||
@item
|
@item
|
||||||
Extended @code{mysqltest} to take care of the timing issues in the test
|
Extended @code{mysqltest} to take care of the timing issues in the test
|
||||||
suite.
|
suite.
|
||||||
@ -40946,9 +40982,15 @@ suite.
|
|||||||
Fixed creation of @code{MERGE} tables on Windows.
|
Fixed creation of @code{MERGE} tables on Windows.
|
||||||
@item
|
@item
|
||||||
Portability fixes for OpenBSD and OS2.
|
Portability fixes for OpenBSD and OS2.
|
||||||
|
@item
|
||||||
|
Added --temp-pool option to mysqld. Using this option will cause most
|
||||||
|
temporary files created to use a small set of names, rather than a unique
|
||||||
|
name for each new file. This is to work around a problem in the Linux
|
||||||
|
kernel dealing with creating a bunch of new files with different names.
|
||||||
|
With the old behavior, Linux seems to "leak" memory, as it's being allocated
|
||||||
|
to the directory entry cache instead of the disk cache.
|
||||||
@end itemize
|
@end itemize
|
||||||
|
|
||||||
|
|
||||||
@node News-3.23.32, News-3.23.31, News-3.23.33, News-3.23.x
|
@node News-3.23.32, News-3.23.31, News-3.23.33, News-3.23.x
|
||||||
@appendixsubsec Changes in release 3.23.32
|
@appendixsubsec Changes in release 3.23.32
|
||||||
@itemize @bullet
|
@itemize @bullet
|
||||||
@ -40957,8 +40999,8 @@ Changed code to get around compiler bug in Compaq C++ on OSF1, that broke
|
|||||||
@code{BACKUP}, @code{RESTORE}, @code{CHECK}, @code{REPAIR}, and
|
@code{BACKUP}, @code{RESTORE}, @code{CHECK}, @code{REPAIR}, and
|
||||||
@code{ANALYZE TABLE}.
|
@code{ANALYZE TABLE}.
|
||||||
@item
|
@item
|
||||||
Added option @code{FULL} to @code{SHOW COLUMNS}. Now we only show the
|
Added option @code{FULL} to @code{SHOW COLUMNS}. Now we show the
|
||||||
privilege list for the columns if this option is given.
|
privilege list for the columns only if this option is given.
|
||||||
@item
|
@item
|
||||||
Fixed bug in @code{SHOW LOGS} when there weren't any BDB logs.
|
Fixed bug in @code{SHOW LOGS} when there weren't any BDB logs.
|
||||||
@item
|
@item
|
||||||
@ -46742,10 +46784,15 @@ for @code{BDB} tables. @xref{Internal locking}. With @code{MyISAM}
|
|||||||
tables one can freely mix @code{INSERT} and @code{SELECT} without locks
|
tables one can freely mix @code{INSERT} and @code{SELECT} without locks
|
||||||
(@code{Versioning}).
|
(@code{Versioning}).
|
||||||
|
|
||||||
|
Starting in version 3.23.33, you can analyze the table lock contention
|
||||||
|
on your system by checkining @code{Table_locks_waited} and
|
||||||
|
@code{Table_locks_immediate} environemt variables.
|
||||||
|
|
||||||
Some database users claim that @strong{MySQL} cannot support near the
|
Some database users claim that @strong{MySQL} cannot support near the
|
||||||
number of concurrent users because it lacks row-level locking. This is
|
number of concurrent users because it lacks row-level locking. This is
|
||||||
a may be true for some specific applications, but is' not generally
|
a may be true for some specific applications, but is' not generally
|
||||||
true. As always this depends totally on what the application does and what is the access/update pattern of the data.
|
true. As always this depends totally on what the application does and what
|
||||||
|
is the access/update pattern of the data.
|
||||||
|
|
||||||
Pros for row locking:
|
Pros for row locking:
|
||||||
|
|
||||||
|
@ -692,6 +692,10 @@ static int get_options(int argc, char **argv)
|
|||||||
skip_column_names=1;
|
skip_column_names=1;
|
||||||
break;
|
break;
|
||||||
case 'P':
|
case 'P':
|
||||||
|
if(!current_host) {
|
||||||
|
my_free(current_host, MYF(MY_ALLOW_ZERO_PTR));
|
||||||
|
current_host=my_strdup("127.0.0.1", MYF(MY_WME));
|
||||||
|
};
|
||||||
opt_mysql_port= (unsigned int) atoi(optarg);
|
opt_mysql_port= (unsigned int) atoi(optarg);
|
||||||
break;
|
break;
|
||||||
case 'S':
|
case 'S':
|
||||||
|
@ -185,6 +185,10 @@ int main(int argc,char *argv[])
|
|||||||
interval=atoi(optarg);
|
interval=atoi(optarg);
|
||||||
break;
|
break;
|
||||||
case 'P':
|
case 'P':
|
||||||
|
if(!host) {
|
||||||
|
my_free(host, MYF(MY_ALLOW_ZERO_PTR));
|
||||||
|
host=my_strdup("127.0.0.1", MYF(MY_WME));
|
||||||
|
};
|
||||||
tcp_port= (unsigned int) atoi(optarg);
|
tcp_port= (unsigned int) atoi(optarg);
|
||||||
break;
|
break;
|
||||||
case 'r':
|
case 'r':
|
||||||
|
@ -344,6 +344,10 @@ static int get_options(int *argc,char ***argv)
|
|||||||
tty_password=1;
|
tty_password=1;
|
||||||
break;
|
break;
|
||||||
case 'P':
|
case 'P':
|
||||||
|
if(!current_host) {
|
||||||
|
my_free(current_host, MYF(MY_ALLOW_ZERO_PTR));
|
||||||
|
current_host=my_strdup("127.0.0.1", MYF(MY_WME));
|
||||||
|
};
|
||||||
opt_mysql_port= (unsigned int) atoi(optarg);
|
opt_mysql_port= (unsigned int) atoi(optarg);
|
||||||
break;
|
break;
|
||||||
case 'S':
|
case 'S':
|
||||||
|
@ -238,6 +238,10 @@ get_options(int *argc,char ***argv)
|
|||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case 'P':
|
case 'P':
|
||||||
|
if(!host) {
|
||||||
|
my_free(host, MYF(MY_ALLOW_ZERO_PTR));
|
||||||
|
host=my_strdup("127.0.0.1", MYF(MY_WME));
|
||||||
|
};
|
||||||
opt_mysql_port= (unsigned int) atoi(optarg);
|
opt_mysql_port= (unsigned int) atoi(optarg);
|
||||||
break;
|
break;
|
||||||
case 'S':
|
case 'S':
|
||||||
|
@ -1154,6 +1154,10 @@ int parse_args(int argc, char **argv)
|
|||||||
tty_password=1;
|
tty_password=1;
|
||||||
break;
|
break;
|
||||||
case 'P':
|
case 'P':
|
||||||
|
if(!host) {
|
||||||
|
my_free(host, MYF(MY_ALLOW_ZERO_PTR));
|
||||||
|
host=my_strdup("127.0.0.1", MYF(MY_WME));
|
||||||
|
};
|
||||||
port = atoi(optarg);
|
port = atoi(optarg);
|
||||||
break;
|
break;
|
||||||
case 'S':
|
case 'S':
|
||||||
|
35
include/my_bitmap.h
Normal file
35
include/my_bitmap.h
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library 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
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with this library; if not, write to the Free
|
||||||
|
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||||||
|
MA 02111-1307, USA */
|
||||||
|
|
||||||
|
#ifndef _my_bitmap_h_
|
||||||
|
#define _my_bitmap_h_
|
||||||
|
|
||||||
|
#define MY_BIT_NONE ~(uint)0
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern void bitmap_set_bit(uchar *bitmap, uint bitmap_size, uint bitmap_bit);
|
||||||
|
extern uint bitmap_set_next(uchar *bitmap, uint bitmap_size);
|
||||||
|
extern void bitmap_clear_bit(uchar *bitmap,uint bitmap_size,uint bitmap_bit);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
@ -27,7 +27,8 @@ extern "C" {
|
|||||||
#include <my_list.h>
|
#include <my_list.h>
|
||||||
|
|
||||||
struct st_thr_lock;
|
struct st_thr_lock;
|
||||||
|
extern ulong locks_immediate,locks_waited ;
|
||||||
|
|
||||||
enum thr_lock_type { TL_IGNORE=-1,
|
enum thr_lock_type { TL_IGNORE=-1,
|
||||||
TL_UNLOCK, /* UNLOCK ANY LOCK */
|
TL_UNLOCK, /* UNLOCK ANY LOCK */
|
||||||
TL_READ, /* Read lock */
|
TL_READ, /* Read lock */
|
||||||
|
@ -36,7 +36,7 @@ const char *client_errors[]=
|
|||||||
"MySQL client got out of memory",
|
"MySQL client got out of memory",
|
||||||
"Wrong host info",
|
"Wrong host info",
|
||||||
"Localhost via UNIX socket",
|
"Localhost via UNIX socket",
|
||||||
"%s via TCP/IP",
|
"%-.64s via TCP/IP",
|
||||||
"Error in server handshake",
|
"Error in server handshake",
|
||||||
"Lost connection to MySQL server during query",
|
"Lost connection to MySQL server during query",
|
||||||
"Commands out of sync; You can't run this command now",
|
"Commands out of sync; You can't run this command now",
|
||||||
@ -62,11 +62,11 @@ const char *client_errors[]=
|
|||||||
"MySQL client run out of memory",
|
"MySQL client run out of memory",
|
||||||
"Wrong host info",
|
"Wrong host info",
|
||||||
"Localhost via UNIX socket",
|
"Localhost via UNIX socket",
|
||||||
"%s via TCP/IP",
|
"%-.64s via TCP/IP",
|
||||||
"Error in server handshake",
|
"Error in server handshake",
|
||||||
"Lost connection to MySQL server during query",
|
"Lost connection to MySQL server during query",
|
||||||
"Commands out of sync; You can't run this command now",
|
"Commands out of sync; You can't run this command now",
|
||||||
"%s via named pipe",
|
"%-.64s via named pipe",
|
||||||
"Can't wait for named pipe to host: %-.64s pipe: %-.32s (%lu)",
|
"Can't wait for named pipe to host: %-.64s pipe: %-.32s (%lu)",
|
||||||
"Can't open named pipe to host: %-.64s pipe: %-.32s (%lu)",
|
"Can't open named pipe to host: %-.64s pipe: %-.32s (%lu)",
|
||||||
"Can't set state of named pipe to host: %-.64s pipe: %-.32s (%lu)",
|
"Can't set state of named pipe to host: %-.64s pipe: %-.32s (%lu)",
|
||||||
|
@ -376,7 +376,7 @@ int chk_key(MI_CHECK *param, register MI_INFO *info)
|
|||||||
if ((!(param->testflag & T_SILENT)))
|
if ((!(param->testflag & T_SILENT)))
|
||||||
printf ("- check data record references index: %d\n",key+1);
|
printf ("- check data record references index: %d\n",key+1);
|
||||||
if (share->state.key_root[key] == HA_OFFSET_ERROR &&
|
if (share->state.key_root[key] == HA_OFFSET_ERROR &&
|
||||||
info->state->records == 0)
|
(info->state->records == 0 || keyinfo->flag & HA_FULLTEXT))
|
||||||
continue;
|
continue;
|
||||||
if (!_mi_fetch_keypage(info,keyinfo,share->state.key_root[key],info->buff,
|
if (!_mi_fetch_keypage(info,keyinfo,share->state.key_root[key],info->buff,
|
||||||
0))
|
0))
|
||||||
|
5
mysql-test/r/rpl000018.result
Normal file
5
mysql-test/r/rpl000018.result
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
Log_name
|
||||||
|
master-bin.001
|
||||||
|
master-bin.002
|
||||||
|
n
|
||||||
|
3351
|
6
mysql-test/r/status.result
Normal file
6
mysql-test/r/status.result
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
Variable_name Value
|
||||||
|
Table_locks_immediate 0
|
||||||
|
Table_locks_waited 0
|
||||||
|
Variable_name Value
|
||||||
|
Table_locks_immediate 3
|
||||||
|
Table_locks_waited 1
|
BIN
mysql-test/std_data/master-bin.001
Normal file
BIN
mysql-test/std_data/master-bin.001
Normal file
Binary file not shown.
4
mysql-test/t/overflow.test
Normal file
4
mysql-test/t/overflow.test
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
connect (con1,localhost,boo,,test,0,mysql-master.sock);
|
||||||
|
connection con1;
|
||||||
|
-- error 1064;
|
||||||
|
drop database AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA;
|
1
mysql-test/t/rpl000018-master.opt
Normal file
1
mysql-test/t/rpl000018-master.opt
Normal file
@ -0,0 +1 @@
|
|||||||
|
-O max_binlog_size=4096
|
3
mysql-test/t/rpl000018-master.sh
Executable file
3
mysql-test/t/rpl000018-master.sh
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
rm -f $MYSQL_TEST_DIR/var/lib/master-bin.*
|
||||||
|
cp $MYSQL_TEST_DIR/std_data/master-bin.001 $MYSQL_TEST_DIR/var/lib/
|
||||||
|
echo ./master-bin.001 > $MYSQL_TEST_DIR/var/lib/master-bin.index
|
1
mysql-test/t/rpl000018-slave.opt
Normal file
1
mysql-test/t/rpl000018-slave.opt
Normal file
@ -0,0 +1 @@
|
|||||||
|
--skip-slave-start --abort-slave-event-count=1
|
19
mysql-test/t/rpl000018.test
Normal file
19
mysql-test/t/rpl000018.test
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
connect (master,localhost,root,,test,0,mysql-master.sock);
|
||||||
|
connect (slave,localhost,root,,test,0,mysql-slave.sock);
|
||||||
|
connection slave;
|
||||||
|
reset slave;
|
||||||
|
slave start;
|
||||||
|
connection master;
|
||||||
|
show master logs;
|
||||||
|
drop table if exists t1;
|
||||||
|
create table t1(n int);
|
||||||
|
insert into t1 values (3351);
|
||||||
|
save_master_pos;
|
||||||
|
connection slave;
|
||||||
|
sync_with_master;
|
||||||
|
select * from t1;
|
||||||
|
connection master;
|
||||||
|
drop table t1;
|
||||||
|
save_master_pos;
|
||||||
|
connection slave;
|
||||||
|
sync_with_master;
|
23
mysql-test/t/status.test
Normal file
23
mysql-test/t/status.test
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
connect (con1,localhost,root,,test,0,mysql-master.sock);
|
||||||
|
connect (con2,localhost,root,,test,0,mysql-master.sock);
|
||||||
|
|
||||||
|
flush status;
|
||||||
|
show status like 'Table_lock%';
|
||||||
|
connection con1;
|
||||||
|
SET SQL_LOG_BIN=0;
|
||||||
|
drop table if exists t1;
|
||||||
|
create table t1(n int);
|
||||||
|
insert into t1 values(1);
|
||||||
|
connection con2;
|
||||||
|
lock tables t1 read;
|
||||||
|
unlock tables;
|
||||||
|
lock tables t1 read;
|
||||||
|
connection con1;
|
||||||
|
send update t1 set n = 3;
|
||||||
|
connection con2;
|
||||||
|
sleep 0.5;
|
||||||
|
unlock tables;
|
||||||
|
connection con1;
|
||||||
|
reap;
|
||||||
|
show status like 'Table_lock%';
|
||||||
|
drop table t1;
|
@ -44,7 +44,7 @@ libmysys_a_SOURCES = my_init.c my_getwd.c mf_getdate.c\
|
|||||||
my_quick.c my_lockmem.c my_static.c \
|
my_quick.c my_lockmem.c my_static.c \
|
||||||
getopt.c getopt1.c getvar.c my_mkdir.c \
|
getopt.c getopt1.c getvar.c my_mkdir.c \
|
||||||
default.c my_compress.c checksum.c raid.cc my_net.c \
|
default.c my_compress.c checksum.c raid.cc my_net.c \
|
||||||
my_vsnprintf.c charset.c
|
my_vsnprintf.c charset.c my_bitmap.c
|
||||||
EXTRA_DIST = thr_alarm.c thr_lock.c my_pthread.c my_thr_init.c \
|
EXTRA_DIST = thr_alarm.c thr_lock.c my_pthread.c my_thr_init.c \
|
||||||
thr_mutex.c thr_rwlock.c
|
thr_mutex.c thr_rwlock.c
|
||||||
libmysys_a_LIBADD = @THREAD_LOBJECTS@
|
libmysys_a_LIBADD = @THREAD_LOBJECTS@
|
||||||
|
60
mysys/my_bitmap.c
Normal file
60
mysys/my_bitmap.c
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library 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
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with this library; if not, write to the Free
|
||||||
|
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||||||
|
MA 02111-1307, USA */
|
||||||
|
|
||||||
|
/*
|
||||||
|
Handling of uchar arrays as large bitmaps.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "mysys_priv.h"
|
||||||
|
#include <my_bitmap.h>
|
||||||
|
|
||||||
|
pthread_mutex_t LOCK_bitmap;
|
||||||
|
|
||||||
|
void bitmap_set_bit(uchar *bitmap, uint bitmap_size, uint bitmap_bit) {
|
||||||
|
if((bitmap_bit != MY_BIT_NONE) && (bitmap_bit < bitmap_size*8)) {
|
||||||
|
pthread_mutex_lock(&LOCK_bitmap);
|
||||||
|
bitmap[bitmap_bit / 8] |= (1 << bitmap_bit % 8);
|
||||||
|
pthread_mutex_unlock(&LOCK_bitmap);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
uint bitmap_set_next(uchar *bitmap, uint bitmap_size) {
|
||||||
|
uint bit_found = MY_BIT_NONE;
|
||||||
|
int i, b;
|
||||||
|
|
||||||
|
pthread_mutex_lock(&LOCK_bitmap);
|
||||||
|
for(i=0; (i<bitmap_size) && (bit_found==MY_BIT_NONE); i++) {
|
||||||
|
if(bitmap[i] == 0xff) continue;
|
||||||
|
for(b=0; (b<8) && (bit_found==MY_BIT_NONE); b++)
|
||||||
|
if((bitmap[i] & 1<<b) == 0) {
|
||||||
|
bit_found = (i*8)+b;
|
||||||
|
bitmap[i] |= 1<<b;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
pthread_mutex_unlock(&LOCK_bitmap);
|
||||||
|
|
||||||
|
return bit_found;
|
||||||
|
};
|
||||||
|
|
||||||
|
void bitmap_clear_bit(uchar *bitmap, uint bitmap_size, uint bitmap_bit) {
|
||||||
|
if((bitmap_bit != MY_BIT_NONE) && (bitmap_bit < bitmap_size*8)) {
|
||||||
|
pthread_mutex_lock(&LOCK_bitmap);
|
||||||
|
bitmap[bitmap_bit / 8] &= ~(1 << bitmap_bit % 8);
|
||||||
|
pthread_mutex_unlock(&LOCK_bitmap);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
@ -48,6 +48,7 @@ static my_bool win32_init_tcp_ip();
|
|||||||
static my_bool my_init_done=0;
|
static my_bool my_init_done=0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static ulong atoi_octal(const char *str)
|
static ulong atoi_octal(const char *str)
|
||||||
{
|
{
|
||||||
long int tmp;
|
long int tmp;
|
||||||
@ -76,6 +77,7 @@ void my_init(void)
|
|||||||
#ifndef __WIN__
|
#ifndef __WIN__
|
||||||
sigfillset(&my_signals); /* signals blocked by mf_brkhant */
|
sigfillset(&my_signals); /* signals blocked by mf_brkhant */
|
||||||
#endif
|
#endif
|
||||||
|
pthread_mutex_init(&LOCK_bitmap, NULL);
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
DBUG_ENTER("my_init");
|
DBUG_ENTER("my_init");
|
||||||
@ -127,7 +129,12 @@ void my_end(int infoflag)
|
|||||||
#ifdef HAVE_GETRUSAGE
|
#ifdef HAVE_GETRUSAGE
|
||||||
struct rusage rus;
|
struct rusage rus;
|
||||||
if (!getrusage(RUSAGE_SELF, &rus))
|
if (!getrusage(RUSAGE_SELF, &rus))
|
||||||
fprintf(info_file,"\nUser time %.2f, System time %.2f\nMaximum resident set size %ld, Integral resident set size %ld\nNon physical pagefaults %ld, Physical pagefaults %ld, Swaps %ld\nBlocks in %ld out %ld, Messages in %ld out %ld, Signals %ld\nVouluntary context switches %ld, Invouluntary context switches %ld\n",
|
fprintf(info_file,"\n\
|
||||||
|
User time %.2f, System time %.2f\n\
|
||||||
|
Maximum resident set size %ld, Integral resident set size %ld\n\
|
||||||
|
Non-physical pagefaults %ld, Physical pagefaults %ld, Swaps %ld\n\
|
||||||
|
Blocks in %ld out %ld, Messages in %ld out %ld, Signals %ld\n\
|
||||||
|
Voluntary context switches %ld, Involuntary context switches %ld\n",
|
||||||
(rus.ru_utime.tv_sec * SCALE_SEC +
|
(rus.ru_utime.tv_sec * SCALE_SEC +
|
||||||
rus.ru_utime.tv_usec / SCALE_USEC) / 100.0,
|
rus.ru_utime.tv_usec / SCALE_USEC) / 100.0,
|
||||||
(rus.ru_stime.tv_sec * SCALE_SEC +
|
(rus.ru_stime.tv_sec * SCALE_SEC +
|
||||||
@ -159,6 +166,7 @@ void my_end(int infoflag)
|
|||||||
pthread_mutex_destroy(&THR_LOCK_keycache);
|
pthread_mutex_destroy(&THR_LOCK_keycache);
|
||||||
pthread_mutex_destroy(&THR_LOCK_malloc);
|
pthread_mutex_destroy(&THR_LOCK_malloc);
|
||||||
pthread_mutex_destroy(&THR_LOCK_open);
|
pthread_mutex_destroy(&THR_LOCK_open);
|
||||||
|
pthread_mutex_destroy(&LOCK_bitmap);
|
||||||
DBUG_POP(); /* Must be done before my_thread_end */
|
DBUG_POP(); /* Must be done before my_thread_end */
|
||||||
my_thread_end();
|
my_thread_end();
|
||||||
my_thread_global_end();
|
my_thread_global_end();
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
#ifdef THREAD
|
#ifdef THREAD
|
||||||
extern pthread_mutex_t THR_LOCK_malloc,THR_LOCK_open,THR_LOCK_keycache,
|
extern pthread_mutex_t THR_LOCK_malloc,THR_LOCK_open,THR_LOCK_keycache,
|
||||||
THR_LOCK_lock,THR_LOCK_isam,THR_LOCK_net,THR_LOCK_charset;
|
THR_LOCK_lock,THR_LOCK_isam,THR_LOCK_net,THR_LOCK_charset;
|
||||||
|
extern pthread_mutex_t LOCK_bitmap;
|
||||||
#else /* THREAD */
|
#else /* THREAD */
|
||||||
#define pthread_mutex_lock(A)
|
#define pthread_mutex_lock(A)
|
||||||
#define pthread_mutex_unlock(A)
|
#define pthread_mutex_unlock(A)
|
||||||
|
@ -83,7 +83,7 @@ multiple read locks.
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
my_bool thr_lock_inited=0;
|
my_bool thr_lock_inited=0;
|
||||||
|
ulong locks_immediate = 0L, locks_waited = 0L;
|
||||||
|
|
||||||
/* The following constants are only for debug output */
|
/* The following constants are only for debug output */
|
||||||
#define MAX_THREADS 100
|
#define MAX_THREADS 100
|
||||||
@ -387,6 +387,7 @@ static my_bool wait_for_lock(struct st_lock_list *wait, THR_LOCK_DATA *data,
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
result=0;
|
result=0;
|
||||||
|
statistic_increment(locks_waited, &THR_LOCK_lock);
|
||||||
if (data->lock->get_status)
|
if (data->lock->get_status)
|
||||||
(*data->lock->get_status)(data->status_param);
|
(*data->lock->get_status)(data->status_param);
|
||||||
check_locks(data->lock,"got wait_for_lock",0);
|
check_locks(data->lock,"got wait_for_lock",0);
|
||||||
@ -447,6 +448,7 @@ int thr_lock(THR_LOCK_DATA *data,enum thr_lock_type lock_type)
|
|||||||
check_locks(lock,"read lock with old write lock",0);
|
check_locks(lock,"read lock with old write lock",0);
|
||||||
if (lock->get_status)
|
if (lock->get_status)
|
||||||
(*lock->get_status)(data->status_param);
|
(*lock->get_status)(data->status_param);
|
||||||
|
++locks_immediate;
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
if (lock->write.data->type == TL_WRITE_ONLY)
|
if (lock->write.data->type == TL_WRITE_ONLY)
|
||||||
@ -470,6 +472,7 @@ int thr_lock(THR_LOCK_DATA *data,enum thr_lock_type lock_type)
|
|||||||
if ((int) lock_type == (int) TL_READ_NO_INSERT)
|
if ((int) lock_type == (int) TL_READ_NO_INSERT)
|
||||||
lock->read_no_write_count++;
|
lock->read_no_write_count++;
|
||||||
check_locks(lock,"read lock with no write locks",0);
|
check_locks(lock,"read lock with no write locks",0);
|
||||||
|
++locks_immediate;
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
/* Can't get lock yet; Wait for it */
|
/* Can't get lock yet; Wait for it */
|
||||||
@ -501,6 +504,7 @@ int thr_lock(THR_LOCK_DATA *data,enum thr_lock_type lock_type)
|
|||||||
data->cond=get_cond();
|
data->cond=get_cond();
|
||||||
if (lock->get_status)
|
if (lock->get_status)
|
||||||
(*lock->get_status)(data->status_param);
|
(*lock->get_status)(data->status_param);
|
||||||
|
++locks_immediate;
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -535,6 +539,7 @@ int thr_lock(THR_LOCK_DATA *data,enum thr_lock_type lock_type)
|
|||||||
check_locks(lock,"second write lock",0);
|
check_locks(lock,"second write lock",0);
|
||||||
if (data->lock->get_status)
|
if (data->lock->get_status)
|
||||||
(*data->lock->get_status)(data->status_param);
|
(*data->lock->get_status)(data->status_param);
|
||||||
|
++locks_immediate;
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
DBUG_PRINT("lock",("write locked by thread: %ld",
|
DBUG_PRINT("lock",("write locked by thread: %ld",
|
||||||
@ -560,6 +565,7 @@ int thr_lock(THR_LOCK_DATA *data,enum thr_lock_type lock_type)
|
|||||||
if (data->lock->get_status)
|
if (data->lock->get_status)
|
||||||
(*data->lock->get_status)(data->status_param);
|
(*data->lock->get_status)(data->status_param);
|
||||||
check_locks(lock,"only write lock",0);
|
check_locks(lock,"only write lock",0);
|
||||||
|
++locks_immediate;
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -73,6 +73,7 @@ void kill_one_thread(THD *thd, ulong id);
|
|||||||
#ifndef MYSQLD_NET_RETRY_COUNT
|
#ifndef MYSQLD_NET_RETRY_COUNT
|
||||||
#define MYSQLD_NET_RETRY_COUNT 10 // Abort read after this many int.
|
#define MYSQLD_NET_RETRY_COUNT 10 // Abort read after this many int.
|
||||||
#endif
|
#endif
|
||||||
|
#define TEMP_POOL_SIZE 128
|
||||||
/* The following parameters is to decide when to use an extra cache to
|
/* The following parameters is to decide when to use an extra cache to
|
||||||
optimise seeks when reading a big table in sorted order */
|
optimise seeks when reading a big table in sorted order */
|
||||||
#define MIN_FILE_LENGTH_TO_USE_ROW_CACHE (16L*1024*1024)
|
#define MIN_FILE_LENGTH_TO_USE_ROW_CACHE (16L*1024*1024)
|
||||||
@ -507,7 +508,8 @@ extern ulong ha_read_count, ha_write_count, ha_delete_count, ha_update_count,
|
|||||||
ha_read_key_count, ha_read_next_count, ha_read_prev_count,
|
ha_read_key_count, ha_read_next_count, ha_read_prev_count,
|
||||||
ha_read_first_count, ha_read_last_count,
|
ha_read_first_count, ha_read_last_count,
|
||||||
ha_read_rnd_count, ha_read_rnd_next_count;
|
ha_read_rnd_count, ha_read_rnd_next_count;
|
||||||
|
extern uchar temp_pool[TEMP_POOL_SIZE];
|
||||||
|
extern bool use_temp_pool;
|
||||||
extern char f_fyllchar;
|
extern char f_fyllchar;
|
||||||
extern uchar *days_in_month;
|
extern uchar *days_in_month;
|
||||||
extern DATE_FORMAT dayord;
|
extern DATE_FORMAT dayord;
|
||||||
|
@ -287,6 +287,9 @@ I_List<THD> threads,thread_cache;
|
|||||||
time_t start_time;
|
time_t start_time;
|
||||||
|
|
||||||
|
|
||||||
|
uchar temp_pool[TEMP_POOL_SIZE];
|
||||||
|
bool use_temp_pool;
|
||||||
|
|
||||||
pthread_key(MEM_ROOT*,THR_MALLOC);
|
pthread_key(MEM_ROOT*,THR_MALLOC);
|
||||||
pthread_key(THD*, THR_THD);
|
pthread_key(THD*, THR_THD);
|
||||||
pthread_key(NET*, THR_NET);
|
pthread_key(NET*, THR_NET);
|
||||||
@ -1532,6 +1535,9 @@ int main(int argc, char **argv)
|
|||||||
if (!mysql_tmpdir || !mysql_tmpdir[0])
|
if (!mysql_tmpdir || !mysql_tmpdir[0])
|
||||||
mysql_tmpdir=(char*) P_tmpdir; /* purecov: inspected */
|
mysql_tmpdir=(char*) P_tmpdir; /* purecov: inspected */
|
||||||
|
|
||||||
|
bzero(temp_pool, TEMP_POOL_SIZE);
|
||||||
|
use_temp_pool = 0;
|
||||||
|
|
||||||
set_options();
|
set_options();
|
||||||
#ifdef __WIN__
|
#ifdef __WIN__
|
||||||
/* service parameters can be overwritten by options */
|
/* service parameters can be overwritten by options */
|
||||||
@ -2404,7 +2410,8 @@ enum options {
|
|||||||
OPT_INNOBASE_LOG_GROUP_HOME_DIR,
|
OPT_INNOBASE_LOG_GROUP_HOME_DIR,
|
||||||
OPT_INNOBASE_LOG_ARCH_DIR, OPT_INNOBASE_LOG_ARCHIVE,
|
OPT_INNOBASE_LOG_ARCH_DIR, OPT_INNOBASE_LOG_ARCHIVE,
|
||||||
OPT_INNOBASE_FLUSH_LOG_AT_TRX_COMMIT, OPT_SAFE_SHOW_DB,
|
OPT_INNOBASE_FLUSH_LOG_AT_TRX_COMMIT, OPT_SAFE_SHOW_DB,
|
||||||
OPT_GEMINI_SKIP
|
OPT_GEMINI_SKIP,
|
||||||
|
OPT_TEMP_POOL
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct option long_options[] = {
|
static struct option long_options[] = {
|
||||||
@ -2535,6 +2542,7 @@ static struct option long_options[] = {
|
|||||||
#ifdef __WIN__
|
#ifdef __WIN__
|
||||||
{"standalone", no_argument, 0, (int) OPT_STANDALONE},
|
{"standalone", no_argument, 0, (int) OPT_STANDALONE},
|
||||||
#endif
|
#endif
|
||||||
|
{"temp-pool", no_argument, 0, (int) OPT_TEMP_POOL},
|
||||||
{"tmpdir", required_argument, 0, 't'},
|
{"tmpdir", required_argument, 0, 't'},
|
||||||
{"use-locking", no_argument, 0, (int) OPT_USE_LOCKING},
|
{"use-locking", no_argument, 0, (int) OPT_USE_LOCKING},
|
||||||
#ifdef USE_SYMDIR
|
#ifdef USE_SYMDIR
|
||||||
@ -2803,6 +2811,8 @@ struct show_var_st status_vars[]= {
|
|||||||
{"Sort_range", (char*) &filesort_range_count, SHOW_LONG},
|
{"Sort_range", (char*) &filesort_range_count, SHOW_LONG},
|
||||||
{"Sort_rows", (char*) &filesort_rows, SHOW_LONG},
|
{"Sort_rows", (char*) &filesort_rows, SHOW_LONG},
|
||||||
{"Sort_scan", (char*) &filesort_scan_count, SHOW_LONG},
|
{"Sort_scan", (char*) &filesort_scan_count, SHOW_LONG},
|
||||||
|
{"Table_locks_immediate", (char*) &locks_immediate, SHOW_LONG},
|
||||||
|
{"Table_locks_waited", (char*) &locks_waited, SHOW_LONG},
|
||||||
{"Threads_cached", (char*) &cached_thread_count, SHOW_LONG_CONST},
|
{"Threads_cached", (char*) &cached_thread_count, SHOW_LONG_CONST},
|
||||||
{"Threads_created", (char*) &thread_created, SHOW_LONG_CONST},
|
{"Threads_created", (char*) &thread_created, SHOW_LONG_CONST},
|
||||||
{"Threads_connected", (char*) &thread_count, SHOW_INT_CONST},
|
{"Threads_connected", (char*) &thread_count, SHOW_INT_CONST},
|
||||||
@ -2911,6 +2921,7 @@ static void usage(void)
|
|||||||
Don't give threads different priorities.\n\
|
Don't give threads different priorities.\n\
|
||||||
--socket=... Socket file to use for connection\n\
|
--socket=... Socket file to use for connection\n\
|
||||||
-t, --tmpdir=path Path for temporary files\n\
|
-t, --tmpdir=path Path for temporary files\n\
|
||||||
|
--temp-pool Use a pool of temporary files\n\
|
||||||
-u, --user=user_name Run mysqld daemon as user\n\
|
-u, --user=user_name Run mysqld daemon as user\n\
|
||||||
-V, --version output version information and exit");
|
-V, --version output version information and exit");
|
||||||
#ifdef __WIN__
|
#ifdef __WIN__
|
||||||
@ -3086,6 +3097,9 @@ static void get_options(int argc,char **argv)
|
|||||||
case 't':
|
case 't':
|
||||||
mysql_tmpdir=optarg;
|
mysql_tmpdir=optarg;
|
||||||
break;
|
break;
|
||||||
|
case OPT_TEMP_POOL:
|
||||||
|
use_temp_pool=1;
|
||||||
|
break;
|
||||||
case 'u':
|
case 'u':
|
||||||
mysqld_user=optarg;
|
mysqld_user=optarg;
|
||||||
break;
|
break;
|
||||||
|
@ -1055,9 +1055,12 @@ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case STOP_EVENT:
|
case STOP_EVENT:
|
||||||
close_temporary_tables(thd);
|
if(mi->pos > 4) // stop event should be ignored after rotate event
|
||||||
mi->inc_pos(event_len);
|
{
|
||||||
flush_master_info(mi);
|
close_temporary_tables(thd);
|
||||||
|
mi->inc_pos(event_len);
|
||||||
|
flush_master_info(mi);
|
||||||
|
}
|
||||||
delete ev;
|
delete ev;
|
||||||
break;
|
break;
|
||||||
case ROTATE_EVENT:
|
case ROTATE_EVENT:
|
||||||
|
@ -1167,6 +1167,7 @@ bool wait_for_tables(THD *thd)
|
|||||||
/* Now we can open all tables without any interference */
|
/* Now we can open all tables without any interference */
|
||||||
thd->proc_info="Reopen tables";
|
thd->proc_info="Reopen tables";
|
||||||
result=reopen_tables(thd,0,0);
|
result=reopen_tables(thd,0,0);
|
||||||
|
|
||||||
}
|
}
|
||||||
pthread_mutex_unlock(&LOCK_open);
|
pthread_mutex_unlock(&LOCK_open);
|
||||||
thd->proc_info=0;
|
thd->proc_info=0;
|
||||||
|
@ -1886,6 +1886,13 @@ check_access(THD *thd,uint want_access,const char *db, uint *save_priv,
|
|||||||
|
|
||||||
if (db == any_db)
|
if (db == any_db)
|
||||||
return FALSE; // Allow select on anything
|
return FALSE; // Allow select on anything
|
||||||
|
|
||||||
|
if (strlen(db) > NAME_LEN || check_db_name(db))
|
||||||
|
{
|
||||||
|
net_printf(&thd->net,ER_WRONG_DB_NAME, db);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
if (db && (!thd->db || strcmp(db,thd->db)))
|
if (db && (!thd->db || strcmp(db,thd->db)))
|
||||||
db_access=acl_get(thd->host, thd->ip, (char*) &thd->remote.sin_addr,
|
db_access=acl_get(thd->host, thd->ip, (char*) &thd->remote.sin_addr,
|
||||||
thd->priv_user, db); /* purecov: inspected */
|
thd->priv_user, db); /* purecov: inspected */
|
||||||
|
@ -391,7 +391,7 @@ sweepstakes if you report the bug";
|
|||||||
thd->mysys_var->current_mutex = log_lock;
|
thd->mysys_var->current_mutex = log_lock;
|
||||||
thd->mysys_var->current_cond = &COND_binlog_update;
|
thd->mysys_var->current_cond = &COND_binlog_update;
|
||||||
const char* proc_info = thd->proc_info;
|
const char* proc_info = thd->proc_info;
|
||||||
thd->proc_info = "Waiting for update";
|
thd->proc_info = "Slave connection: waiting for binlog update";
|
||||||
pthread_mutex_unlock(&thd->mysys_var->mutex);
|
pthread_mutex_unlock(&thd->mysys_var->mutex);
|
||||||
|
|
||||||
bool read_packet = 0, fatal_error = 0;
|
bool read_packet = 0, fatal_error = 0;
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
#include <hash.h>
|
#include <hash.h>
|
||||||
#include <ft_global.h>
|
#include <ft_global.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
#include <my_bitmap.h>
|
||||||
|
|
||||||
const char *join_type_str[]={ "UNKNOWN","system","const","eq_ref","ref",
|
const char *join_type_str[]={ "UNKNOWN","system","const","eq_ref","ref",
|
||||||
"MAYBE_REF","ALL","range","index","fulltext" };
|
"MAYBE_REF","ALL","range","index","fulltext" };
|
||||||
@ -3287,14 +3288,28 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
|
|||||||
KEY_PART_INFO *key_part_info;
|
KEY_PART_INFO *key_part_info;
|
||||||
Item_result_field **copy_func;
|
Item_result_field **copy_func;
|
||||||
MI_COLUMNDEF *recinfo;
|
MI_COLUMNDEF *recinfo;
|
||||||
|
uint temp_pool_slot;
|
||||||
|
|
||||||
DBUG_ENTER("create_tmp_table");
|
DBUG_ENTER("create_tmp_table");
|
||||||
DBUG_PRINT("enter",("distinct: %d save_sum_fields: %d allow_distinct_limit: %d group: %d",
|
DBUG_PRINT("enter",("distinct: %d save_sum_fields: %d allow_distinct_limit: %d group: %d",
|
||||||
(int) distinct, (int) save_sum_fields,
|
(int) distinct, (int) save_sum_fields,
|
||||||
(int) allow_distinct_limit,test(group)));
|
(int) allow_distinct_limit,test(group)));
|
||||||
|
|
||||||
statistic_increment(created_tmp_tables, &LOCK_status);
|
statistic_increment(created_tmp_tables, &LOCK_status);
|
||||||
sprintf(path,"%s%s%lx_%lx_%x",mysql_tmpdir,tmp_file_prefix,current_pid,
|
|
||||||
thd->thread_id, thd->tmp_table++);
|
if(use_temp_pool) {
|
||||||
|
temp_pool_slot = bitmap_set_next(temp_pool, TEMP_POOL_SIZE);
|
||||||
|
if(temp_pool_slot != MY_BIT_NONE) // we got a slot
|
||||||
|
sprintf(path, "%s%s_%lx_%i", mysql_tmpdir, tmp_file_prefix,
|
||||||
|
current_pid, temp_pool_slot);
|
||||||
|
else // if we run out of slots in the pool, fall back to old behavior
|
||||||
|
sprintf(path,"%s%s%lx_%lx_%x",mysql_tmpdir,tmp_file_prefix,current_pid,
|
||||||
|
thd->thread_id, thd->tmp_table++);
|
||||||
|
} else {
|
||||||
|
sprintf(path,"%s%s%lx_%lx_%x",mysql_tmpdir,tmp_file_prefix,current_pid,
|
||||||
|
thd->thread_id, thd->tmp_table++);
|
||||||
|
};
|
||||||
|
|
||||||
if (group)
|
if (group)
|
||||||
{
|
{
|
||||||
if (!param->quick_group)
|
if (!param->quick_group)
|
||||||
@ -3324,10 +3339,12 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
|
|||||||
param->group_length : 0,
|
param->group_length : 0,
|
||||||
NullS))
|
NullS))
|
||||||
{
|
{
|
||||||
|
bitmap_clear_bit(temp_pool, TEMP_POOL_SIZE, temp_pool_slot);
|
||||||
DBUG_RETURN(NULL); /* purecov: inspected */
|
DBUG_RETURN(NULL); /* purecov: inspected */
|
||||||
}
|
}
|
||||||
if (!(param->copy_field=copy=new Copy_field[field_count]))
|
if (!(param->copy_field=copy=new Copy_field[field_count]))
|
||||||
{
|
{
|
||||||
|
bitmap_clear_bit(temp_pool, TEMP_POOL_SIZE, temp_pool_slot);
|
||||||
my_free((gptr) table,MYF(0)); /* purecov: inspected */
|
my_free((gptr) table,MYF(0)); /* purecov: inspected */
|
||||||
DBUG_RETURN(NULL); /* purecov: inspected */
|
DBUG_RETURN(NULL); /* purecov: inspected */
|
||||||
}
|
}
|
||||||
@ -3347,6 +3364,8 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
|
|||||||
table->map=1;
|
table->map=1;
|
||||||
table->tmp_table=1;
|
table->tmp_table=1;
|
||||||
table->db_low_byte_first=1; // True for HEAP and MyISAM
|
table->db_low_byte_first=1; // True for HEAP and MyISAM
|
||||||
|
table->temp_pool_slot = temp_pool_slot;
|
||||||
|
|
||||||
|
|
||||||
/* Calculate which type of fields we will store in the temporary table */
|
/* Calculate which type of fields we will store in the temporary table */
|
||||||
|
|
||||||
@ -3670,7 +3689,8 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
|
|||||||
DBUG_RETURN(table);
|
DBUG_RETURN(table);
|
||||||
|
|
||||||
err:
|
err:
|
||||||
free_tmp_table(thd,table); /* purecov: inspected */
|
free_tmp_table(thd,table); /* purecov: inspected */
|
||||||
|
bitmap_clear_bit(temp_pool, TEMP_POOL_SIZE, temp_pool_slot);
|
||||||
DBUG_RETURN(NULL); /* purecov: inspected */
|
DBUG_RETURN(NULL); /* purecov: inspected */
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3817,6 +3837,9 @@ free_tmp_table(THD *thd, TABLE *entry)
|
|||||||
delete *ptr;
|
delete *ptr;
|
||||||
my_free((gptr) entry->record[0],MYF(0));
|
my_free((gptr) entry->record[0],MYF(0));
|
||||||
free_io_cache(entry);
|
free_io_cache(entry);
|
||||||
|
|
||||||
|
bitmap_clear_bit(temp_pool, TEMP_POOL_SIZE, entry->temp_pool_slot);
|
||||||
|
|
||||||
my_free((gptr) entry,MYF(0));
|
my_free((gptr) entry,MYF(0));
|
||||||
thd->proc_info=save_proc_info;
|
thd->proc_info=save_proc_info;
|
||||||
|
|
||||||
|
@ -120,6 +120,8 @@ struct st_table {
|
|||||||
key_part_map const_key_parts[MAX_KEY];
|
key_part_map const_key_parts[MAX_KEY];
|
||||||
ulong query_id;
|
ulong query_id;
|
||||||
|
|
||||||
|
uint temp_pool_slot;
|
||||||
|
|
||||||
THD *in_use; /* Which thread uses this */
|
THD *in_use; /* Which thread uses this */
|
||||||
struct st_table *next,*prev;
|
struct st_table *next,*prev;
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user