From 51d80960ea52e1c3c99bf6287f331a58e1c2b11c Mon Sep 17 00:00:00 2001 From: "ingo@mysql.com" <> Date: Tue, 31 May 2005 11:08:14 +0200 Subject: [PATCH 1/4] Bug#10224 - ANALYZE TABLE crashing with simultaneous CREATE ... SELECT statement. 1.) Added a new option to mysql_lock_tables() for ignoring FLUSH TABLES. Used the new option in create_table_from_items(). It is necessary to prevent the SELECT table from being reopend. It would get new storage assigned for its fields, while the SELECT part of the command would still use the old (freed) storage. 2.) Protected the CREATE TABLE and CREATE TABLE ... SELECT commands against a global read lock. This prevents a deadlock in CREATE TABLE ... SELECT in conjunction with FLUSH TABLES WITH READ LOCK and avoids the creation of new tables during a global read lock. 3.) Replaced set_protect_against_global_read_lock() and unset_protect_against_global_read_lock() by wait_if_global_read_lock() and start_waiting_global_read_lock() in the INSERT DELAYED handling. --- mysql-test/r/create.result | 8 +++++ mysql-test/t/create.test | 15 +++++++++ sql/lock.cc | 69 ++++++++++++-------------------------- sql/mysql_priv.h | 7 ++-- sql/sql_acl.cc | 4 +-- sql/sql_base.cc | 6 ++-- sql/sql_handler.cc | 2 +- sql/sql_insert.cc | 24 +++++++++---- sql/sql_parse.cc | 37 ++++++++++++++++++-- sql/sql_table.cc | 2 +- 10 files changed, 108 insertions(+), 66 deletions(-) diff --git a/mysql-test/r/create.result b/mysql-test/r/create.result index 7cb79d5a990..c99ad8960dc 100644 --- a/mysql-test/r/create.result +++ b/mysql-test/r/create.result @@ -228,3 +228,11 @@ create table t1 (a int,,b int); You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'b int)' at line 1 create table t1 (,b int); You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'b int)' at line 1 +create table t1 (a int); +create table t1 select * from t1; +INSERT TABLE 't1' isn't allowed in FROM table list +create table t2 union = (t1) select * from t1; +INSERT TABLE 't1' isn't allowed in FROM table list +flush tables with read lock; +unlock tables; +drop table t1; diff --git a/mysql-test/t/create.test b/mysql-test/t/create.test index c71a1e0c177..ed2c76932da 100644 --- a/mysql-test/t/create.test +++ b/mysql-test/t/create.test @@ -203,3 +203,18 @@ create table t1 (a int,); create table t1 (a int,,b int); --error 1064 create table t1 (,b int); + +# +# Bug#10224 - ANALYZE TABLE crashing with simultaneous +# CREATE ... SELECT statement. +# This tests two additional possible errors and a hang if +# an improper fix is present. +# +create table t1 (a int); +--error 1093 +create table t1 select * from t1; +--error 1093 +create table t2 union = (t1) select * from t1; +flush tables with read lock; +unlock tables; +drop table t1; diff --git a/sql/lock.cc b/sql/lock.cc index 951b0e2ff6a..4c6d7c75ae2 100644 --- a/sql/lock.cc +++ b/sql/lock.cc @@ -79,8 +79,24 @@ static int unlock_external(THD *thd, TABLE **table,uint count); static void print_lock_error(int error); -MYSQL_LOCK *mysql_lock_tables(THD *thd, TABLE **tables, uint count, - bool ignore_global_read_lock) +/* + Lock tables. + + SYNOPSIS + mysql_lock_tables() + thd The current thread. + tables An array of pointers to the tables to lock. + count The number of tables to lock. + flags Options: + MYSQL_LOCK_IGNORE_GLOBAL_READ_LOCK Ignore a global read lock + MYSQL_LOCK_IGNORE_FLUSH Ignore a flush tables. + + RETURN + A lock structure pointer on success. + NULL on error. +*/ + +MYSQL_LOCK *mysql_lock_tables(THD *thd, TABLE **tables, uint count, uint flags) { MYSQL_LOCK *sql_lock; TABLE *write_lock_used; @@ -91,7 +107,8 @@ MYSQL_LOCK *mysql_lock_tables(THD *thd, TABLE **tables, uint count, if (!(sql_lock = get_lock_data(thd,tables,count, 0,&write_lock_used))) break; - if (global_read_lock && write_lock_used && ! ignore_global_read_lock) + if (global_read_lock && write_lock_used && + ! (flags & MYSQL_LOCK_IGNORE_GLOBAL_READ_LOCK)) { /* Someone has issued LOCK ALL TABLES FOR READ and we want a write lock @@ -125,7 +142,7 @@ MYSQL_LOCK *mysql_lock_tables(THD *thd, TABLE **tables, uint count, thd->some_tables_deleted=1; // Try again sql_lock->lock_count=0; // Locks are alread freed } - else if (!thd->some_tables_deleted) + else if (!thd->some_tables_deleted || (flags & MYSQL_LOCK_IGNORE_FLUSH)) { thd->locked=0; break; @@ -868,47 +885,3 @@ void make_global_read_lock_block_commit(THD *thd) } -/* - Set protection against global read lock. - - SYNOPSIS - set_protect_against_global_read_lock() - void - - RETURN - FALSE OK, no global read lock exists. - TRUE Error, global read lock exists already. -*/ - -my_bool set_protect_against_global_read_lock(void) -{ - my_bool global_read_lock_exists; - - pthread_mutex_lock(&LOCK_open); - if (! (global_read_lock_exists= test(global_read_lock))) - protect_against_global_read_lock++; - pthread_mutex_unlock(&LOCK_open); - return global_read_lock_exists; -} - - -/* - Unset protection against global read lock. - - SYNOPSIS - unset_protect_against_global_read_lock() - void - - RETURN - void -*/ - -void unset_protect_against_global_read_lock(void) -{ - pthread_mutex_lock(&LOCK_open); - protect_against_global_read_lock--; - pthread_mutex_unlock(&LOCK_open); - pthread_cond_broadcast(&COND_refresh); -} - - diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 6a25536b3f1..75ec3482d8d 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -766,8 +766,11 @@ extern pthread_t signal_thread; extern struct st_VioSSLAcceptorFd * ssl_acceptor_fd; #endif /* HAVE_OPENSSL */ -MYSQL_LOCK *mysql_lock_tables(THD *thd, TABLE **table, uint count, - bool ignore_global_read_lock= FALSE); +MYSQL_LOCK *mysql_lock_tables(THD *thd, TABLE **table, uint count, uint flags); +/* mysql_lock_tables() flags bits */ +#define MYSQL_LOCK_IGNORE_GLOBAL_READ_LOCK 0x0001 +#define MYSQL_LOCK_IGNORE_FLUSH 0x0002 + void mysql_unlock_tables(THD *thd, MYSQL_LOCK *sql_lock); void mysql_unlock_read_tables(THD *thd, MYSQL_LOCK *sql_lock); void mysql_unlock_some_tables(THD *thd, TABLE **table,uint count); diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index acdd07b2fc5..46b29f252a6 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -177,7 +177,7 @@ my_bool acl_init(THD *org_thd, bool dont_read_acl_tables) ptr[0]= tables[0].table; ptr[1]= tables[1].table; ptr[2]= tables[2].table; - if (!(lock=mysql_lock_tables(thd,ptr,3))) + if (! (lock= mysql_lock_tables(thd, ptr, 3, 0))) { sql_print_error("Fatal error: Can't lock privilege tables: %s", thd->net.last_error); @@ -2514,7 +2514,7 @@ my_bool grant_init(THD *org_thd) TABLE *ptr[2]; // Lock tables for quick update ptr[0]= tables[0].table; ptr[1]= tables[1].table; - if (!(lock=mysql_lock_tables(thd,ptr,2))) + if (! (lock= mysql_lock_tables(thd, ptr, 2, 0))) goto end; t_table = tables[0].table; c_table = tables[1].table; diff --git a/sql/sql_base.cc b/sql/sql_base.cc index c8eb2338294..9c5f73697fd 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -1161,7 +1161,7 @@ bool reopen_tables(THD *thd,bool get_locks,bool in_refresh) MYSQL_LOCK *lock; /* We should always get these locks */ thd->some_tables_deleted=0; - if ((lock=mysql_lock_tables(thd,tables,(uint) (tables_ptr-tables)))) + if ((lock= mysql_lock_tables(thd, tables, (uint) (tables_ptr-tables), 0))) { thd->locked_tables=mysql_lock_merge(thd->locked_tables,lock); } @@ -1602,7 +1602,7 @@ TABLE *open_ltable(THD *thd, TABLE_LIST *table_list, thr_lock_type lock_type) else { if ((table->reginfo.lock_type= lock_type) != TL_UNLOCK) - if (!(thd->lock=mysql_lock_tables(thd,&table_list->table,1))) + if (! (thd->lock= mysql_lock_tables(thd, &table_list->table, 1, 0))) table= 0; } } @@ -1653,7 +1653,7 @@ int lock_tables(THD *thd,TABLE_LIST *tables) return -1; for (table = tables ; table ; table=table->next) *(ptr++)= table->table; - if (!(thd->lock=mysql_lock_tables(thd,start,count))) + if (! (thd->lock= mysql_lock_tables(thd, start, count, 0))) return -1; /* purecov: inspected */ } else diff --git a/sql/sql_handler.cc b/sql/sql_handler.cc index 5bfcc897fc7..fcdb2aeb668 100644 --- a/sql/sql_handler.cc +++ b/sql/sql_handler.cc @@ -448,7 +448,7 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables, send_fields(thd,list,1); HANDLER_TABLES_HACK(thd); - lock= mysql_lock_tables(thd, &tables->table, 1); + lock= mysql_lock_tables(thd, &tables->table, 1, 0); HANDLER_TABLES_HACK(thd); byte *key; diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index c6b7b1d6c15..b61c766120e 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -674,10 +674,13 @@ static TABLE *delayed_get_table(THD *thd,TABLE_LIST *table_list) Avoid that a global read lock steps in while we are creating the new thread. It would block trying to open the table. Hence, the DI thread and this thread would wait until after the global - readlock is gone. If the read lock exists already, we leave with - no table and then switch to non-delayed insert. + readlock is gone. Since the insert thread needs to wait for a + global read lock anyway, we do it right now. Note that + wait_if_global_read_lock() sets a protection against a new + global read lock when it succeeds. This needs to be released by + start_waiting_global_read_lock(). */ - if (set_protect_against_global_read_lock()) + if (wait_if_global_read_lock(thd, 0, 1)) goto err; if (!(tmp=new delayed_insert())) { @@ -719,7 +722,11 @@ static TABLE *delayed_get_table(THD *thd,TABLE_LIST *table_list) pthread_cond_wait(&tmp->cond_client,&tmp->mutex); } pthread_mutex_unlock(&tmp->mutex); - unset_protect_against_global_read_lock(); + /* + Release the protection against the global read lock and wake + everyone, who might want to set a global read lock. + */ + start_waiting_global_read_lock(thd); thd->proc_info="got old table"; if (tmp->thd.killed) { @@ -755,7 +762,11 @@ static TABLE *delayed_get_table(THD *thd,TABLE_LIST *table_list) err1: thd->fatal_error= 1; - unset_protect_against_global_read_lock(); + /* + Release the protection against the global read lock and wake + everyone, who might want to set a global read lock. + */ + start_waiting_global_read_lock(thd); err: pthread_mutex_unlock(&LOCK_delayed_create); DBUG_RETURN(0); // Continue with normal insert @@ -1105,7 +1116,8 @@ extern "C" pthread_handler_decl(handle_delayed_insert,arg) handler will close the table and finish when the outstanding inserts are done. */ - if (! (thd->lock= mysql_lock_tables(thd, &di->table, 1, TRUE))) + if (! (thd->lock= mysql_lock_tables(thd, &di->table, 1, + MYSQL_LOCK_IGNORE_GLOBAL_READ_LOCK))) { di->dead=thd->killed=1; // Fatal error } diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 8f56b7cfcff..aac442d35a2 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1673,6 +1673,24 @@ mysql_execute_command(void) break; } #endif + /* + The create-select command will open and read-lock the select table + and then create, open and write-lock the new table. If a global + read lock steps in, we get a deadlock. The write lock waits for + the global read lock, while the global read lock waits for the + select table to be closed. So we wait until the global readlock is + gone before starting both steps. Note that + wait_if_global_read_lock() sets a protection against a new global + read lock when it succeeds. This needs to be released by + start_waiting_global_read_lock(). We protect the normal CREATE + TABLE in the same way. That way we avoid that a new table is + created during a gobal read lock. + */ + if (wait_if_global_read_lock(thd, 0, 1)) + { + res= -1; + break; + } if (select_lex->item_list.elements) // With select { select_result *result; @@ -1681,7 +1699,7 @@ mysql_execute_command(void) check_dup(tables->db, tables->real_name, tables->next)) { net_printf(&thd->net,ER_INSERT_TABLE_USED,tables->real_name); - DBUG_VOID_RETURN; + goto error1; } if (lex->create_info.used_fields & HA_CREATE_USED_UNION) { @@ -1692,7 +1710,7 @@ mysql_execute_command(void) (TABLE_LIST*)lex->create_info.merge_list.first)) { net_printf(&thd->net, ER_INSERT_TABLE_USED, tab->real_name); - DBUG_VOID_RETURN; + goto error1; } } } @@ -1700,7 +1718,7 @@ mysql_execute_command(void) { TABLE_LIST *table; if (check_table_access(thd, SELECT_ACL, tables->next)) - goto error; // Error message is given + goto error1; // Error message is given /* TODO: Delete the following loop when locks is set by sql_yacc */ for (table = tables->next ; table ; table=table->next) table->lock_type= lex->lock_option; @@ -1737,6 +1755,11 @@ mysql_execute_command(void) if (!res) send_ok(&thd->net); } + /* + Release the protection against the global read lock and wake + everyone, who might want to set a global read lock. + */ + start_waiting_global_read_lock(thd); break; } case SQLCOM_CREATE_INDEX: @@ -2674,6 +2697,14 @@ error: thd->lock= 0; } DBUG_VOID_RETURN; + + error1: + /* + Release the protection against the global read lock and wake + everyone, who might want to set a global read lock. + */ + start_waiting_global_read_lock(thd); + DBUG_VOID_RETURN; } diff --git a/sql/sql_table.cc b/sql/sql_table.cc index e275f902abd..a9af8144df0 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -896,7 +896,7 @@ TABLE *create_table_from_items(THD *thd, HA_CREATE_INFO *create_info, if (!table) DBUG_RETURN(0); table->reginfo.lock_type=TL_WRITE; - if (!((*lock)=mysql_lock_tables(thd,&table,1))) + if (! ((*lock)= mysql_lock_tables(thd, &table, 1, MYSQL_LOCK_IGNORE_FLUSH))) { VOID(pthread_mutex_lock(&LOCK_open)); hash_delete(&open_cache,(byte*) table); From 7bd3dd7cb319e901290846544c6a518dfcef0baa Mon Sep 17 00:00:00 2001 From: "lenz@mysql.com" <> Date: Wed, 1 Jun 2005 12:59:10 +0200 Subject: [PATCH 2/4] - removed references to some obsolete files (BUG#10824) - removed obsolete mysql-max.spec.sc RPM spec file (Max is built out of the standard spec file) --- configure.in | 8 +- scripts/make_binary_distribution.sh | 3 - support-files/mysql-max.spec.sh | 263 ---------------------------- 3 files changed, 1 insertion(+), 273 deletions(-) delete mode 100644 support-files/mysql-max.spec.sh diff --git a/configure.in b/configure.in index 938f2f5776f..b291200c114 100644 --- a/configure.in +++ b/configure.in @@ -1193,16 +1193,10 @@ EOF # echo -n "making sure specific build files are writable... " for file in \ - Docs/include.texi \ Docs/mysql.info \ - Docs/manual.txt \ - Docs/manual_toc.html \ - Docs/manual.html \ Docs/INSTALL-BINARY \ INSTALL-SOURCE \ - COPYING \ - COPYING.LIB \ - MIRRORS + COPYING do if test -e $file; then chmod +w $file diff --git a/scripts/make_binary_distribution.sh b/scripts/make_binary_distribution.sh index 8ea9a16f56b..ffef1648954 100644 --- a/scripts/make_binary_distribution.sh +++ b/scripts/make_binary_distribution.sh @@ -74,9 +74,6 @@ if [ $BASE_SYSTEM != "netware" ] ; then fi for i in ChangeLog \ - Docs/manual.html \ - Docs/manual.txt \ - Docs/manual_toc.html \ Docs/mysql.info do if [ -f $i ] diff --git a/support-files/mysql-max.spec.sh b/support-files/mysql-max.spec.sh deleted file mode 100644 index 5c4b16f0e9d..00000000000 --- a/support-files/mysql-max.spec.sh +++ /dev/null @@ -1,263 +0,0 @@ -%define mysql_version @VERSION@ -%define shared_lib_version @SHARED_LIB_VERSION@ -%define release 2 -%define mysqld_user mysql - -%define see_base For a description of MySQL see the base MySQL RPM or http://www.mysql.com - -Name: MySQL -Summary: MySQL: a very fast and reliable SQL database engine -Group: Applications/Databases -Summary(pt_BR): MySQL: Um servidor SQL rápido e confiável. -Group(pt_BR): Aplicações/Banco_de_Dados -Version: @MYSQL_NO_DASH_VERSION@ -Release: %{release} -Copyright: GPL / LGPL -Source: http://www.mysql.com/Downloads/MySQL-@MYSQL_BASE_VERSION@/mysql-%{mysql_version}.tar.gz -Icon: mysql.gif -URL: http://www.mysql.com/ -Packager: David Axmark , Monty -Provides: msqlormysql MySQL-server -Obsoletes: mysql - -# Think about what you use here since the first step is to -# run a rm -rf -BuildRoot: /var/tmp/mysql-max - -# From the manual -%description -MySQL is a true multi-user, multi-threaded SQL (Structured Query -Language) database server. MySQL is a client/server implementation -that consists of a server daemon (mysqld) and many different client -programs/libraries. - -The main goals of MySQL are speed, robustness and ease of use. MySQL -was originally developed because we needed a SQL server that could -handle very big databases with magnitude higher speed than what any -database vendor could offer to us. And since we did not need all the -features that made their server slow we made our own. We have now been -using MySQL since 1996 in a environment with more than 40 databases, -10,000 tables, of which more than 500 have more than 7 million -rows. This is about 200G of data. - -The base upon which MySQL is built is a set of routines that have been -used in a highly demanding production environment for many -years. While MySQL is still in development, it already offers a rich -and highly useful function set. - -The MySQL-max version differs from the normal MySQL server distribution -in that the BDB and Innobase table handlers are enabled by default. -You can use any normal MySQL client with the MySQL-max server. - -See the documentation for more information. - -%description -l pt_BR -O MySQL é um servidor de banco de dados SQL realmente multiusuário e\ -multi-tarefa. A linguagem SQL é a mais popular linguagem para banco de\ -dados no mundo. O MySQL é uma implementação cliente/servidor que\ -consiste de um servidor chamado mysqld e diversos\ -programas/bibliotecas clientes. Os principais objetivos do MySQL são:\ -velocidade, robustez e facilidade de uso. O MySQL foi originalmente\ -desenvolvido porque nós na Tcx precisávamos de um servidor SQL que\ -pudesse lidar com grandes bases de dados e com uma velocidade muito\ -maior do que a que qualquer vendedor podia nos oferecer. Estamos\ -usando\ -o MySQL desde 1996 em um ambiente com mais de 40 bases de dados com 10.000\ -tabelas, das quais mais de 500 têm mais de 7 milhões de linhas. Isto é o\ -equivalente a aproximadamente 50G de dados críticos. A base da construção do\ -MySQL é uma série de rotinas que foram usadas em um ambiente de produção com\ -alta demanda por muitos anos. Mesmo o MySQL estando ainda em desenvolvimento,\ -ele já oferece um conjunto de funções muito ricas e úteis. Veja a documentação\ -para maiores informações. - -%prep -%setup -n mysql-max-%{mysql_version} -# %setup -T -D -a 1 -n mysql-max-%{mysql_version} - -%build -# The all-static flag is to make the RPM work on different -# distributions. This version tries to put shared mysqlclient libraries -# in a separate package. - -BuildMySQL() { -# The --enable-assembler simply does nothing on systems that does not -# support assembler speedups. -sh -c "PATH=\"${MYSQL_BUILD_PATH:-/bin:/usr/bin}\" \ - CC=\"${MYSQL_BUILD_CC:-egcs}\" \ - CFLAGS=\"${MYSQL_BUILD_CFLAGS:- -O6 -fno-omit-frame-pointer}\" \ - CXX=\"${MYSQL_BUILD_CXX:-egcs}\" \ - CXXFLAGS=\"${MYSQL_BUILD_CXXFLAGS:- -O6 \ - -felide-constructors -fno-exceptions -fno-rtti \ - -fno-omit-frame-pointer}\" \ - ./configure \ - $* \ - --enable-assembler \ - --with-mysqld-user=%{mysqld_user} \ - --with-unix-socket-path=/var/lib/mysql/mysql.sock \ - --prefix=/ \ - --with-extra-charsets=complex \ - --exec-prefix=/usr \ - --libexecdir=/usr/sbin \ - --sysconfdir=/etc \ - --datadir=/usr/share \ - --localstatedir=/var/lib/mysql \ - --infodir=/usr/info \ - --includedir=/usr/include \ - --mandir=/usr/man \ - --with-berkeley-db \ - --with-innodb \ - --with-comment=\"Official MySQL-Max RPM\"; - # Add this for more debugging support - # --with-debug - # Add this for MyISAM RAID support: - # --with-raid - " - make -} - -# Use the build root for temporary storage of the shared libraries. - -RBR=$RPM_BUILD_ROOT -MBD=$RPM_BUILD_DIR/mysql-max-%{mysql_version} -if test -z "$RBR" -o "$RBR" = "/" -then - echo "RPM_BUILD_ROOT has stupid value" - exit 1 -fi -rm -rf $RBR -mkdir -p $RBR - -#cd $MBD/db-%{db_version}/dist -#./configure --prefix=$RBR/usr/BDB -#make install -# -#echo $RBR $MBD -#cd $MBD - -BuildMySQL "--disable-shared" \ - "--with-mysqld-ldflags='-all-static'" \ - "--with-client-ldflags='-all-static'" - -%install -n mysql-max-%{mysql_version} -RBR=$RPM_BUILD_ROOT -MBD=$RPM_BUILD_DIR/mysql-max-%{mysql_version} -# Ensure that needed directories exists -install -d $RBR/etc/{logrotate.d,rc.d/init.d} -install -d $RBR/var/lib/mysql/mysql -install -d $RBR/usr/share/sql-bench -install -d $RBR/usr/share/mysql-test -install -d $RBR/usr/{sbin,share,man,include} -install -d $RBR/usr/doc/MySQL-%{mysql_version} -install -d $RBR/usr/lib -# Make install -make install DESTDIR=$RBR benchdir_root=/usr/share/ - -# Install logrotate and autostart -install -m644 $MBD/support-files/mysql-log-rotate $RBR/etc/logrotate.d/mysql -install -m755 $MBD/support-files/mysql.server $RBR/etc/rc.d/init.d/mysql - -# Install docs -install -m644 $RPM_BUILD_DIR/mysql-max-%{mysql_version}/Docs/mysql.info \ - $RBR/usr/info/mysql.info -for file in README COPYING COPYING.LIB Docs/manual_toc.html Docs/manual.html \ - Docs/manual.txt Docs/manual.texi Docs/manual.ps \ - support-files/my-huge.cnf support-files/my-large.cnf \ - support-files/my-medium.cnf support-files/my-small.cnf -do - b=`basename $file` - install -m644 $MBD/$file $RBR/usr/doc/MySQL-%{mysql_version}/$b -done - -%pre -if test -x /etc/rc.d/init.d/mysql -then - /etc/rc.d/init.d/mysql stop > /dev/null 2>&1 - echo "Giving mysqld a couple of seconds to exit nicely" - sleep 5 -fi - -%post -mysql_datadir=/var/lib/mysql - -# Create data directory if needed -if test ! -d $mysql_datadir; then mkdir $mysql_datadir; fi -if test ! -d $mysql_datadir/mysql; then mkdir $mysql_datadir/mysql; fi -if test ! -d $mysql_datadir/test; then mkdir $mysql_datadir/test; fi - -# Make MySQL start/shutdown automatically when the machine does it. -/sbin/chkconfig --add mysql - -# Create a MySQL user. Do not report any problems if it already -# exists. This is redhat specific and should be handled more portable -useradd -M -r -d $mysql_datadir -s /bin/bash -c "MySQL server" mysql 2> /dev/null || true - -# Change permissions so that the user that will run the MySQL daemon -# owns all database files. -chown -R mysql $mysql_datadir - -# Initiate databases -mysql_install_db -IN-RPM - -# Change permissions again to fix any new files. -chown -R mysql $mysql_datadir - -# Fix permissions for the permission database so that only the user -# can read them. -chmod -R og-rw $mysql_datadir/mysql - -# Restart in the same way that mysqld will be started normally. -/etc/rc.d/init.d/mysql start - -# Allow mysqld_safe to start mysqld and print a message before we exit -sleep 2 - -%preun -if test -x /etc/rc.d/init.d/mysql -then - /etc/rc.d/init.d/mysql stop > /dev/null -fi -# Remove autostart of mysql -if test $1 = 0 -then - /sbin/chkconfig --del mysql -fi -# We do not remove the mysql user since it may still own a lot of -# database files. - -%files -%attr(-, root, root) %doc /usr/doc/MySQL-%{mysql_version}/ - -%attr(755, root, root) /usr/bin/isamchk -%attr(755, root, root) /usr/bin/isamlog -%attr(755, root, root) /usr/bin/pack_isam -%attr(755, root, root) /usr/bin/myisamchk -%attr(755, root, root) /usr/bin/myisamlog -%attr(755, root, root) /usr/bin/myisampack -%attr(755, root, root) /usr/bin/mysql_fix_privilege_tables -%attr(755, root, root) /usr/bin/mysql_convert_table_format -%attr(755, root, root) /usr/bin/mysql_install_db -%attr(755, root, root) /usr/bin/mysql_setpermission -%attr(755, root, root) /usr/bin/mysql_zap -%attr(755, root, root) /usr/bin/mysqlbug -%attr(755, root, root) /usr/bin/mysqltest -%attr(755, root, root) /usr/bin/mysqlhotcopy -%attr(755, root, root) /usr/bin/perror -%attr(755, root, root) /usr/bin/replace -%attr(755, root, root) /usr/bin/resolveip -%attr(755, root, root) /usr/bin/mysqld_safe -%attr(755, root, root) /usr/bin/mysqld_multi -%attr(755, root, root) /usr/bin/my_print_defaults - -%attr(644, root, root) /usr/info/mysql.info* - -%attr(755, root, root) /usr/sbin/mysqld - -%attr(644, root, root) /etc/logrotate.d/mysql -%attr(755, root, root) /etc/rc.d/init.d/mysql - -%attr(755, root, root) /usr/share/mysql/ - -%changelog - -* Fri Apr 13 2001 Monty - First version of mysql-max.spec.sh based on mysql.spec.sh From 25cb14234a71bad4527807a22959c7a66dd83680 Mon Sep 17 00:00:00 2001 From: "ndbdev@dl145b.mysql.com" <> Date: Fri, 3 Jun 2005 11:16:37 +0200 Subject: [PATCH 3/4] sql_repl.cc: Bug #11064 some read error not detected in replication on 64-bit platform --- BitKeeper/etc/logging_ok | 1 + sql/sql_repl.cc | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index 499e3cdd4f5..185f84cc772 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -110,6 +110,7 @@ mwagner@here.mwagner.org mwagner@ultrafly.mysql.com mwagner@work.mysql.com mysqldev@build.mysql2.com +ndbdev@dl145b.mysql.com nick@mysql.com nick@nick.leippe.com patg@krsna.patg.net diff --git a/sql/sql_repl.cc b/sql/sql_repl.cc index 9485031c144..ed2d477fc5d 100644 --- a/sql/sql_repl.cc +++ b/sql/sql_repl.cc @@ -84,7 +84,7 @@ static int send_file(THD *thd) char fname[FN_REFLEN+1]; const char *errmsg = 0; int old_timeout; - uint packet_len; + unsigned long packet_len; char buf[IO_SIZE]; // It's safe to alloc this DBUG_ENTER("send_file"); From f55a378e9a4724a25966829c0c54acb11b362296 Mon Sep 17 00:00:00 2001 From: "serg@serg.mylan" <> Date: Fri, 3 Jun 2005 15:05:18 +0200 Subject: [PATCH 4/4] *don't* mess with kernel defines, boy. and HAVE_ATOMIC_ADD/HAVE_ATOMIC_SUB is tested in configure --- include/my_global.h | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/include/my_global.h b/include/my_global.h index 0d6f52a3376..f24bcd528ca 100644 --- a/include/my_global.h +++ b/include/my_global.h @@ -203,18 +203,6 @@ C_MODE_END #define BAD_MEMCPY #endif -/* In Linux-alpha we have atomic.h if we are using gcc */ -#if defined(HAVE_LINUXTHREADS) && defined(__GNUC__) && defined(__alpha__) && (__GNUC__ > 2 || ( __GNUC__ == 2 && __GNUC_MINOR__ >= 95)) && !defined(HAVE_ATOMIC_ADD) -#define HAVE_ATOMIC_ADD -#define HAVE_ATOMIC_SUB -#endif - -/* In Linux-ia64 including atomic.h will give us an error */ -#if (defined(HAVE_LINUXTHREADS) && defined(__GNUC__) && (defined(__ia64__)||defined(__powerpc64__))) || !defined(THREAD) -#undef HAVE_ATOMIC_ADD -#undef HAVE_ATOMIC_SUB -#endif - #if defined(_lint) && !defined(lint) #define lint #endif @@ -276,16 +264,17 @@ C_MODE_END #include #endif #ifdef HAVE_ATOMIC_ADD -#define __SMP__ -#ifdef HAVE_LINUX_CONFIG_H -#include /* May define CONFIG_SMP */ -#endif -#ifndef CONFIG_SMP -#define CONFIG_SMP +#if defined(__ia64__) +#define new my_arg_new +#define need_to_restore_new 1 #endif C_MODE_START #include C_MODE_END +#ifdef need_to_restore_new /* probably safer than #ifdef new */ +#undef new +#undef need_to_restore_new +#endif #endif #include /* Recommended by debian */ /* We need the following to go around a problem with openssl on solaris */