From 7c3f8447c0972fce278ad92302f28af8ce2dee84 Mon Sep 17 00:00:00 2001 From: "monty@hundin.mysql.fi" <> Date: Wed, 28 Nov 2001 22:47:58 +0200 Subject: [PATCH 1/2] Extended manual section about MySQL states --- Docs/manual.texi | 121 ++++++++++++++++++++++++++++++++---------- client/get_password.c | 26 ++++----- tests/mail_to_db.pl | 9 ++-- tools/mysqlmanager.c | 4 +- 4 files changed, 115 insertions(+), 45 deletions(-) diff --git a/Docs/manual.texi b/Docs/manual.texi index 0a4095b124d..db82b029848 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -9419,7 +9419,7 @@ work: CC="cc -pthread" CFLAGS="-O4 -ansi_alias -ansi_args -fast -inline speed all -arch host" CXX="cxx -pthread" -CXXFLAGS="-O4 -ansi_alias -ansi_args -fast -inline speed all -arch host" +CXXFLAGS="-O4 -ansi_alias -ansi_args -fast -inline speed all -arch host -noexceptions -nortti" export CC CFLAGS CXX CXXFLAGS ./configure \ --prefix=/usr/local/mysql \ @@ -18622,36 +18622,103 @@ one extra connection for a client with the @code{Process_priv} privilege to ensure that you should always be able to login and check the system (assuming you are not giving this privilege to all your users). -Some frequently asked states in @code{mysqladmin processlist} +Some frequently states in @code{mysqladmin processlist} -@code{WAITING FOR TABLES} +@itemize @bullet +@item @code{Checking table} +The thread doing an [automatic ?] checking of the table. +@item @code{Closing tables} +Means that the thread is flushing the changed table data to disk and +closing the used tables. This should be a fast operation. If not, then +you should check that you don't have a full disk or that the disk is not +in very heavy use. +@item @code{Copying to tmp table on disk} +The temporary result set was larger than @code{tmp_table_size} and the +thread is now changing the in memory based temporary table to a disk +based one to save memory. +@item @code{Creating tmp table} +The thread is creating a temporary table to hold a part of the result for +the query. +@item @code{deleting from main table} +When executing the first part of a multi-table delete and we are only +deleting from the first table. +@item @code{deleting from reference tables} +When executing the second part of a multi-table delete and we are deleting +the matched rows from the other tables. +@item @code{Flushing tables} +The thread is executing @code{FLUSH TABLES} and is waiting for all +threads to close their tables. +@item @code{Killed} +Someone has sent a kill to the thread and it should abort next time it +checks the kill flag. The flag is checked in each major loop in MySQL, +but in some cases it may still take a short time for the thread to die. +If the thread is locked by some other thread, the kill will take affect +as soon as the other thread releases it's lock. +@item @code{Sending data} +The thread is processing rows for a @code{SELECT} statement and is +also sending data to the client. +@item @code{Sorting for group} +The thread is doing a sort to satsify a @code{GROUP BY}. +@item @code{Sorting for order} +The thread is doing a sort to satsify a @code{ORDER BY}. +@item @code{Opening tables} +This simply means that the thread is trying to open a table. This is +should be very fast procedure, unless something prevents opening. For +example an @code{ALTER TABLE} or a @code{LOCK TABLE} can prevent opening +a table until the command is finished. +@item @code{Removing duplicates} +The query was using @code{SELECT DISTINCT} in such a way that MySQL +couldn't optimize that distinct away at an early stage. Because of this +MySQL has to do an extra stage to remove all duplicated rows before +sending the result to the client. +@item @code{Reopen table} +The thread got a lock for the table, but noticed after getting the lock +that the underlying table structure changed. It has freed the lock, +closed the table and is now trying to reopen it. +@item @code{Repair by sorting} +The repair code is using sorting to create indexes. +@item @code{Repair with keycache} +The repair code is using creating keys one by one through the key cache. +This is much slower than @code{Repair by sorting}. +@item @code{Searching rows for update} +The thread is doing a first phase to find all matching rows before +updating them. This has to be done if the @code{UPDATE} is changing +the index that is used to find the involved rows. +@item @code{Sleeping} +The thread is wating for the client to send a new command to it. +@item @code{System lock} +The thread is waiting for getting to get a external system lock for the +table. If you are not using multiple mysqld servers that are accessing +the same tables, you can disable system locks with the +@code{--skip-locking} option. +@item @code{Upgrading lock} +The @code{INSERT DELAYED} handler is trying to get a lock for the table +to insert rows. +@item @code{Updating} +The thread is searching for rows to update and updating them. +@item @code{User Lock} +The thread is waiting on a @code{GET_LOCK()}. +@item @code{Waiting for tables} +The thread got a notification that the underlying structure for a table +has changed and it needs to reopen the table to get the new structure. +To be able to reopen the table it must however wait until all other +threads have closed the table in question. -This means that the server is trying to get a lock of a -table(s). Usually this should happen very fast, unless there is some -problem around, such as another program holding table files open (e.g -@code{myisamchk}, anohter instance of @code{mysqld}), @code{mysqld} is -run without @code{--skip-locking}, table files are nfs mounted for -@code{mysqld}, etc. +This notification happens if another thread has used @code{FLUSH TABLES} +or one of the following commands on the table in question: @code{FLUSH +TABLES table_name}, @code{ALTER TABLE}, @code{RENAME TABLE}, +@code{REPAIR TABLE}, @code{ANALYZE TABLE} or @code{OPTIMIZE TABLE}. +@item @code{waiting for handler insert} +The @code{INSERT DELAYED} handler has processed all inserts and are +waiting to get new ones. +@end itemize -@code{OPENING TABLES} +Most states are very quick operations. If threads last in any of these +states for many seconds, there may be a problem around that needs to be +investigated. -This simply means that the thread is trying to open a table. This also -should be very instant procedure, unless something prevents opening. An -@code{ALTER TABLE}, for example, can prevent opening a table until the -command is finished. If someone runs @code{FLUSH TABLES} simultaneously -with an @code{ALTER TABLE}, then all the threads that are trying to use -the table in @code{ALTER TABLE} query will be in this state. - -@code{CLOSING TABLES} - -Means that the thread is closing the tables that the thread was using. -If this is taking long, please check for the above for possible reasons -why it might be taking long. - -All of the above are usually very quick operations. If threads last -in any of these states for many seconds, there may be a problem around -that needs to be investigated. Check also that you have not run out -of harddisk space. +There are some other states that are not mentioned above, but most of +these are only useful to find bugs in @code{mysqld}. @node SHOW GRANTS, SHOW CREATE TABLE, SHOW PROCESSLIST, SHOW @subsubsection @code{SHOW GRANTS} diff --git a/client/get_password.c b/client/get_password.c index e47cf7b3783..185399d3df2 100644 --- a/client/get_password.c +++ b/client/get_password.c @@ -72,7 +72,7 @@ char *get_tty_password(char *opt_message) char *pos=to,*end=to+sizeof(to)-1; int i=0; DBUG_ENTER("get_tty_password"); - fprintf(stdout,opt_message ? opt_message : "Enter password: "); + fprintf(stderr,opt_message ? opt_message : "Enter password: "); for (;;) { char tmp; @@ -125,8 +125,8 @@ static void get_password(char *to,uint length,int fd,bool echo) { if (echo) { - fputs("\b \b",stdout); - fflush(stdout); + fputs("\b \b",stderr); + fflush(stderr); } pos--; continue; @@ -138,8 +138,8 @@ static void get_password(char *to,uint length,int fd,bool echo) continue; if (echo) { - fputc('*',stdout); - fflush(stdout); + fputc('*',stderr); + fflush(stderr); } *(pos++) = tmp; } @@ -172,10 +172,10 @@ char *get_tty_password(char *opt_message) memset(passbuff, 0, _PASSWORD_LEN); #endif #else - if (isatty(fileno(stdout))) + if (isatty(fileno(stderr))) { - fputs(opt_message ? opt_message : "Enter password: ",stdout); - fflush(stdout); + fputs(opt_message ? opt_message : "Enter password: ",stderr); + fflush(stderr); } #if defined(HAVE_TERMIOS_H) tcgetattr(fileno(stdin), &org); @@ -184,7 +184,7 @@ char *get_tty_password(char *opt_message) tmp.c_cc[VMIN] = 1; tmp.c_cc[VTIME] = 0; tcsetattr(fileno(stdin), TCSADRAIN, &tmp); - get_password(buff, sizeof(buff)-1, fileno(stdin), isatty(fileno(stdout))); + get_password(buff, sizeof(buff)-1, fileno(stdin), isatty(fileno(stderr))); tcsetattr(fileno(stdin), TCSADRAIN, &org); #elif defined(HAVE_TERMIO_H) ioctl(fileno(stdin), (int) TCGETA, &org); @@ -193,7 +193,7 @@ char *get_tty_password(char *opt_message) tmp.c_cc[VMIN] = 1; tmp.c_cc[VTIME]= 0; ioctl(fileno(stdin),(int) TCSETA, &tmp); - get_password(buff,sizeof(buff)-1,fileno(stdin),isatty(fileno(stdout))); + get_password(buff,sizeof(buff)-1,fileno(stdin),isatty(fileno(stderr))); ioctl(fileno(stdin),(int) TCSETA, &org); #else gtty(fileno(stdin), &org); @@ -201,11 +201,11 @@ char *get_tty_password(char *opt_message) tmp.sg_flags &= ~ECHO; tmp.sg_flags |= RAW; stty(fileno(stdin), &tmp); - get_password(buff,sizeof(buff)-1,fileno(stdin),isatty(fileno(stdout))); + get_password(buff,sizeof(buff)-1,fileno(stdin),isatty(fileno(stderr))); stty(fileno(stdin), &org); #endif - if (isatty(fileno(stdout))) - fputc('\n',stdout); + if (isatty(fileno(stderr))) + fputc('\n',stderr); #endif /* HAVE_GETPASS */ DBUG_RETURN(my_strdup(buff,MYF(MY_FAE))); diff --git a/tests/mail_to_db.pl b/tests/mail_to_db.pl index b758a171c77..fa2af91d9b2 100755 --- a/tests/mail_to_db.pl +++ b/tests/mail_to_db.pl @@ -218,7 +218,7 @@ sub process_mail_file { chop; if ($type ne "message") - { + { if (/^Reply-To: (.*)/i) { $type = "reply"; @@ -288,8 +288,11 @@ sub process_mail_file $values{$type} .= "\n" . $_; } } - $values{'hash'} = checksum("$values{'message'}"); - update_table($dbh, $file_name, \%values); + if (defined($values{'message'})) + { + $values{'hash'} = checksum("$values{'message'}"); + update_table($dbh, $file_name, \%values); + } } #### diff --git a/tools/mysqlmanager.c b/tools/mysqlmanager.c index 31df66d10c6..c2011696776 100644 --- a/tools/mysqlmanager.c +++ b/tools/mysqlmanager.c @@ -342,17 +342,17 @@ static void handle_sigterm(int sig __attribute__((unused))) exit(0); } +#ifdef DO_STACKTRACE static void handle_segfault(int sig) { if (in_segfault) exit(1); in_segfault=1; fprintf(errfp,"Got fatal signal %d\n",sig); -#ifdef DO_STACKTRACE print_stacktrace(); -#endif exit(1); } +#endif static void handle_sigpipe(int __attribute__((unused)) sig) { From ce7a0a029364b688d84ef9860a39b0e89abbc001 Mon Sep 17 00:00:00 2001 From: "monty@hundin.mysql.fi" <> Date: Thu, 29 Nov 2001 21:46:51 +0200 Subject: [PATCH 2/2] Fix not critical MyISAM bug in locking. Free character sets properly (for embedded). Add missing mutex in HANDLER CLOSE --- Build-tools/Do-compile | 7 ++-- Docs/manual.texi | 7 +++- myisam/mi_locking.c | 7 ++-- myisam/myisamdef.h | 2 +- mysys/my_init.c | 2 +- mysys/my_seek.c | 2 +- sql-bench/server-cfg.sh | 76 +++++++++++++++++++++++++++++++++++++++-- sql/sql_handler.cc | 4 +++ sql/sql_update.cc | 4 +-- 9 files changed, 97 insertions(+), 14 deletions(-) diff --git a/Build-tools/Do-compile b/Build-tools/Do-compile index 76b94f314c8..b3b401d7e8d 100755 --- a/Build-tools/Do-compile +++ b/Build-tools/Do-compile @@ -19,7 +19,7 @@ if ($opt_innodb || $opt_bdb) chomp($host=`hostname`); $full_host_name=$host; -info("Compiling MySQL$version_suffix at $host, stage: $opt_stage\n"); +info("Compiling MySQL$version_suffix at $host$suffix, stage: $opt_stage\n"); $connect_option= ($opt_tcpip ? "--host=$host" : ""); $host =~ /^([^.-]*)/; $host=$1 . $opt_suffix; @@ -36,6 +36,10 @@ if (defined($gcc_version) && ! $opt_config_env) { $opt_config_env= 'CC=gcc CFLAGS="-O2 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O2 -fno-omit-frame-pointer"'; } + elsif ($tmp =~ /version 3\.0\./) + { + $opt_config_env= 'CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti"'; + } else { $opt_config_env= 'CC=gcc CFLAGS="-O3 -fno-omit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -fno-omit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti"'; @@ -107,7 +111,6 @@ $|=1; safe_cd("$host"); if ($opt_stage == 0 && ! $opt_use_old_distribution) { - my ($name); safe_system("gunzip < $opt_distribution | $tar xf -"); # Fix file times; This is needed because the time for files may be diff --git a/Docs/manual.texi b/Docs/manual.texi index db82b029848..9b46fe246bd 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -7704,6 +7704,11 @@ also work. There have been some problems with the @code{glibc} RPMs from RedHat, so if you have problems, check whether or not there are any updates! The @code{glibc} 2.0.7-19 and 2.0.7-29 RPMs are known to work. +If you are using gcc 3.0 and above to compile MySQL, you must install +the @code{libstdc++v3} library before compiling MySQL; If you don't do +this you will get an error about a missing @code{__cxa_pure_virtual} +symbol during linking! + On some older Linux distributions, @code{configure} may produce an error like this: @@ -7757,7 +7762,7 @@ shell> CXX=gcc ./configure @end example If you are running gcc 3.0 and above, you can't use the above trick with -CXX=gcc, but you have to install libstd++. +setting to CXX=gcc. @node Linux-SPARC, Linux-Alpha, Linux-x86, Linux @subsubsection Linux SPARC Notes diff --git a/myisam/mi_locking.c b/myisam/mi_locking.c index b8ffc300fa9..68ef52ea819 100644 --- a/myisam/mi_locking.c +++ b/myisam/mi_locking.c @@ -305,10 +305,9 @@ int _mi_readinfo(register MI_INFO *info, int lock_type, int check_keybuffer) MYISAM_SHARE *share=info->s; if (!share->tot_locks) { - if ((info->tmp_lock_type=lock_type) != F_RDLCK) - if (my_lock(share->kfile,lock_type,0L,F_TO_EOF, - info->lock_wait | MY_SEEK_NOT_DONE)) - DBUG_RETURN(1); + if (my_lock(share->kfile,lock_type,0L,F_TO_EOF, + info->lock_wait | MY_SEEK_NOT_DONE)) + DBUG_RETURN(1); if (mi_state_info_read_dsk(share->kfile, &share->state, 1)) { int error=my_errno ? my_errno : -1; diff --git a/myisam/myisamdef.h b/myisam/myisamdef.h index 0f48216ccbf..e8b9c1b83ec 100644 --- a/myisam/myisamdef.h +++ b/myisam/myisamdef.h @@ -589,7 +589,7 @@ enum myisam_log_commands { #define myisam_log_record(a,b,c,d,e) if (myisam_log_file >= 0) _myisam_log_record(a,b,c,d,e) #define fast_mi_writeinfo(INFO) if (!(INFO)->s->tot_locks) (void) _mi_writeinfo((INFO),0) -#define fast_mi_readinfo(INFO) (!(INFO)->lock_type == F_UNLCK) && _mi_readinfo((INFO),F_RDLCK,1) +#define fast_mi_readinfo(INFO) ((INFO)->lock_type == F_UNLCK) && _mi_readinfo((INFO),F_RDLCK,1) #ifdef __cplusplus extern "C" { diff --git a/mysys/my_init.c b/mysys/my_init.c index f39b3f0ed6d..87121f35bb3 100644 --- a/mysys/my_init.c +++ b/mysys/my_init.c @@ -125,6 +125,7 @@ void my_end(int infoflag) DBUG_PRINT("error",("%s",errbuff[0])); } } + free_charsets(); if (infoflag & MY_GIVE_INFO || info_file != stderr) { #ifdef HAVE_GETRUSAGE @@ -149,7 +150,6 @@ Voluntary context switches %ld, Involuntary context switches %ld\n", #if defined(MSDOS) && !defined(__WIN__) fprintf(info_file,"\nRun time: %.1f\n",(double) clock()/CLOCKS_PER_SEC); #endif - free_charsets(); #if defined(SAFEMALLOC) TERMINATE(stderr); /* Give statistic on screen */ #elif defined(__WIN__) && defined(_MSC_VER) diff --git a/mysys/my_seek.c b/mysys/my_seek.c index 87da4d93cb7..5ee094c1be4 100644 --- a/mysys/my_seek.c +++ b/mysys/my_seek.c @@ -35,7 +35,7 @@ my_off_t my_seek(File fd, my_off_t pos, int whence, DBUG_PRINT("error",("lseek: %lu, errno: %d",newpos,errno)); DBUG_RETURN(MY_FILEPOS_ERROR); } - if (newpos != pos) + if ((my_off_t) newpos != pos) { DBUG_PRINT("exit",("pos: %lu", (ulong) newpos)); } diff --git a/sql-bench/server-cfg.sh b/sql-bench/server-cfg.sh index 1e755be8f43..744a2217a96 100644 --- a/sql-bench/server-cfg.sh +++ b/sql-bench/server-cfg.sh @@ -335,6 +335,12 @@ sub reconnect_on_errors return 0; } +sub fix_for_insert +{ + my ($self,$cmd) = @_; + return $cmd; +} + # # Optimize tables for better performance # @@ -354,7 +360,6 @@ sub vacuum } } - ############################################################################# # Definitions for mSQL ############################################################################# @@ -548,6 +553,12 @@ sub reconnect_on_errors return 0; } +sub fix_for_insert +{ + my ($self,$cmd) = @_; + return $cmd; +} + ############################################################################# # Definitions for PostgreSQL # ############################################################################# @@ -806,6 +817,12 @@ sub reconnect_on_errors return 0; } +sub fix_for_insert +{ + my ($self,$cmd) = @_; + return $cmd; +} + sub vacuum { my ($self,$full_vacuum,$dbh_ref,@tables)=@_; @@ -1072,6 +1089,12 @@ sub small_rollback_segment return 0; } +sub fix_for_insert +{ + my ($self,$cmd) = @_; + return $cmd; +} + sub reconnect_on_errors { return 0; @@ -1811,7 +1834,7 @@ sub query { sub fix_for_insert { my ($self,$cmd) = @_; - $cmd =~ s/\\'//g; + $cmd =~ s/\\\'//g; return $cmd; } @@ -1844,6 +1867,7 @@ sub reconnect_on_errors return 0; } + ############################################################################# # Configuration for Access ############################################################################# @@ -2021,6 +2045,12 @@ sub reconnect_on_errors return 1; } +sub fix_for_insert +{ + my ($self,$cmd) = @_; + return $cmd; +} + ############################################################################# # Configuration for Microsoft SQL server ############################################################################# @@ -2209,6 +2239,12 @@ sub reconnect_on_errors return 0; } +sub fix_for_insert +{ + my ($self,$cmd) = @_; + return $cmd; +} + ############################################################################# # Configuration for Sybase ############################################################################# @@ -2384,6 +2420,12 @@ sub reconnect_on_errors return 0; } +sub fix_for_insert +{ + my ($self,$cmd) = @_; + return $cmd; +} + # # optimize the tables .... # @@ -2617,6 +2659,12 @@ sub reconnect_on_errors return 0; } +sub fix_for_insert +{ + my ($self,$cmd) = @_; + return $cmd; +} + ############################################################################# # Configuration for IBM DB2 ############################################################################# @@ -2791,6 +2839,12 @@ sub reconnect_on_errors return 0; } +sub fix_for_insert +{ + my ($self,$cmd) = @_; + return $cmd; +} + ############################################################################# # Configuration for MIMER ############################################################################# @@ -2992,6 +3046,12 @@ sub reconnect_on_errors return 0; } +sub fix_for_insert +{ + my ($self,$cmd) = @_; + return $cmd; +} + ############################################################################# # Configuration for InterBase ############################################################################# @@ -3205,6 +3265,12 @@ sub reconnect_on_errors return 1; } +sub fix_for_insert +{ + my ($self,$cmd) = @_; + return $cmd; +} + ############################################################################# # Configuration for FrontBase ############################################################################# @@ -3410,4 +3476,10 @@ sub reconnect_on_errors return 1; } +sub fix_for_insert +{ + my ($self,$cmd) = @_; + return $cmd; +} + 1; diff --git a/sql/sql_handler.cc b/sql/sql_handler.cc index c7fb237ccf2..46cbe5e44d3 100644 --- a/sql/sql_handler.cc +++ b/sql/sql_handler.cc @@ -63,7 +63,11 @@ int mysql_ha_close(THD *thd, TABLE_LIST *tables) TABLE **ptr=find_table_ptr_by_name(thd, tables->db, tables->name); if (*ptr) + { + VOID(pthread_mutex_lock(&LOCK_open)); close_thread_table(thd, ptr); + VOID(pthread_mutex_unlock(&LOCK_open)); + } send_ok(&thd->net); return 0; diff --git a/sql/sql_update.cc b/sql/sql_update.cc index 3111268849f..0422d9664b6 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -199,7 +199,7 @@ int mysql_update(THD *thd, } init_read_record(&info,thd,table,select,0,1); - thd->proc_info="searching"; + thd->proc_info="Searching rows for update"; while (!(error=info.read_record(&info)) && !thd->killed) { @@ -261,7 +261,7 @@ int mysql_update(THD *thd, ha_rows updated=0L,found=0L; thd->count_cuted_fields=1; /* calc cuted fields */ thd->cuted_fields=0L; - thd->proc_info="updating"; + thd->proc_info="Updating"; query_id=thd->query_id; while (!(error=info.read_record(&info)) && !thd->killed)