diff options
author | unknown <tim@threads.polyesthetic.msg> | 2000-11-28 13:46:59 -0500 |
---|---|---|
committer | unknown <tim@threads.polyesthetic.msg> | 2000-11-28 13:46:59 -0500 |
commit | 53c0d95e924c7ea8ef67af2c85856c2e26b6d2da (patch) | |
tree | deea4395a31d3b03972297e4c33d6f7def1e6a9d | |
parent | c1fdd5b55afab11e981929519b96294cac4f1e04 (diff) | |
parent | 289244acf3e507ee4951edc4df816ba4e6f35a24 (diff) | |
download | mariadb-git-53c0d95e924c7ea8ef67af2c85856c2e26b6d2da.tar.gz |
Merge work.mysql.com:/home/bk/mysql
into threads.polyesthetic.msg:/usr/local/src/my/work
Docs/manual.texi:
Auto merged
sql/mysql_priv.h:
Auto merged
sql/mysqld.cc:
Auto merged
-rw-r--r-- | Docs/manual.texi | 118 | ||||
-rw-r--r-- | acinclude.m4 | 3 | ||||
-rw-r--r-- | configure.in | 7 | ||||
-rw-r--r-- | sql/Makefile.am | 4 | ||||
-rw-r--r-- | sql/ha_berkeley.cc | 47 | ||||
-rw-r--r-- | sql/mysql_priv.h | 11 | ||||
-rw-r--r-- | sql/mysqld.cc | 67 | ||||
-rw-r--r-- | sql/sql_manager.cc | 101 | ||||
-rw-r--r-- | sql/sql_manager.h | 19 |
9 files changed, 277 insertions, 100 deletions
diff --git a/Docs/manual.texi b/Docs/manual.texi index f651d4bba33..8ad5a5dec39 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -5364,6 +5364,12 @@ into it. Obtain a distribution file from one of the sites listed in @ref{Getting MySQL, , Getting @strong{MySQL}}. +@item +If you are interested in using Berkeley DB tables with MySQL, you +will need to obtain a patched version of the Berkeley DB source +code. Please read the chapter on Berkeley DB tables before +proceeding. @xref{BDB}. + @strong{MySQL} source distributions are provided as compressed @code{tar} archives and have names like @file{mysql-VERSION.tar.gz}, where @code{VERSION} is a number like @value{mysql_version}. @@ -5708,32 +5714,31 @@ source tree: @itemize @item -Download @strong{BitKeeper} from @uref{http://www.bitmover.com/cgi-bin/download.cgi} +Download @strong{BitKeeper} from @uref{http://www.bitmover.com/cgi-bin/download.cgi}. @item -Follow the instructions to install it +Follow the instructions to install it. @item Once @strong{BitKeeper} is installed, @code{bk clone bk://work.mysql.com:7000 mysql} - the initial download -may take a while, depending on the speed of your connection +may take a while, depending on the speed of your connection. @item @code{cd mysql; bk -r edit; aclocal; autoheader; autoconf; automake; ./configure} with your favorite options, and then -@code{ make} - - you will need GNU autoconf/automake, libtool, and m4 to do this. -. We have a +@code{ make}. +You will need GNU autoconf/automake, libtool, and m4 to do this. +We have a collection of our standard configure scripts in the @code{BUILD/} subdirectory - if you are lazy, you can do @code{BUILD/compile-pentium-debug} . It will actually work on a lot of -none-x86 machines despite its name. +non-x86 machines despite its name. @item Once the build is done, @code{make install}. Be careful with this on a production machine - this may overwrite your live release binary. We recommend that if you have another installation of @strong{MySQL} that -you @code{./configure} with different values for @code{basedir}, -@code{datadir}, @code{bindir}, @code{sbindir}, @code{libexecdir}, -@code{tcp-port}, and @code{unix-socket-path} +you @code{./configure} with different values for @code{prefix}, +@code{tcp-port}, and @code{unix-socket-path}. @item -Play hard with your new installation and try to make the new feature +Play hard with your new installation and try to make the new features crash. Report bugs to @email{bugs@@lists.mysql.com}. As always, make sure you have a full test case for the bug that we can run. @item @@ -5745,18 +5750,18 @@ if you execute @code{aclocal} and get @code{command not found}, or a similar problem, do not report it - make sure all the needed tools are installed and your @code{PATH} variable is set correctly. @item -After the initial @code{bk clone}, do @code{bk pull} to get the updates +After the initial @code{bk clone}, do @code{bk pull} to get the updates. @item -You can examine change history to the tree with all the cool diffs with +You can examine change history of the tree with all the diffs with @code{bk sccstool}. If you see some funny diffs or code that you have a question about, do not hesitate and e-mail @email{internals@@lists.mysql.com}. Also if you think you have a better idea on how to do something, send an email to the same place -with a patch - @code{bk diffs} with produce a patch for you after you +with a patch - @code{bk diffs} will produce a patch for you after you have made changes to the source. If you do not have the time to code your idea, just send a description. @item -@strong{BitKeeper} has a nice help utility - @code{bk helptool} +@strong{BitKeeper} has a nice help utility - @code{bk helptool}. @end itemize @@ -5989,7 +5994,7 @@ Note that on Linux you should NOT use MIT-pthreads but install LinuxThreads! If your system does not provide native thread support, you will need to build @strong{MySQL} using the MIT-pthreads package. This includes -most FreeBSD systems, SunOS 4.x, Solaris 2.4 and earlier, and some others. +older FreeBSD systems, SunOS 4.x, Solaris 2.4 and earlier, and some others. @xref{Which OS}. @itemize @bullet @@ -22230,40 +22235,49 @@ Berkeley DB (@uref{http://www.sleepycat.com}) has provided crashes and also provides @code{COMMIT} and @code{ROLLBACK} on transactions. In order to build MySQL Version 3.23.x (BDB support first appeared in Version 3.23.15) with support for @code{BDB} tables, you -will need Berkeley DB Version 3.1.14 or newer which can be downloaded from -@uref{http://www.mysql.com/downloads/mysql-3.23.html}; or also from -Sleepycat's download page at -@uref{http://www.sleepycat.com/download.html}. +will need Berkeley DB Version 3.2.3d or newer which can be downloaded from +@uref{http://www.mysql.com/downloads/mysql-3.23.html}. This is a patched +version of Berkeley DB that is only available from @strong{MySQL}; the +standard Berkeley DB @strong{will not work with MySQL}. @node BDB install, BDB start, BDB overview, BDB @subsection Installing BDB -To install Berkeley DB, first uncompress the @code{BDB} distribution -and follow the instructions in the README file provided in the distribution -directory. Basically what you need to do is: +If you have downloaded a binary version of @strong{MySQL} that includes +support for Berkeley DB, simply follow the instructions for +installing a binary version of @strong{MySQL}. @xref{Installing binary}. + +To compile MySQL with Berkeley DB support, first uncompress the +@code{BDB} distribution into the @strong{MySQL} top-level source +directory, and follow the instructions for building MySQL from +source. Configure will automatically detect and use the Berkeley +DB source you just uncompressed. @xref{Installing source}. @example -cd build_[your_os] -../dist/configure -make -make install +cd /path/to/source/of/mysql-3.23.29-gamma +gzip -cd /tmp/db-3.2.3d.tar.gz | tar xf - +./configure # this will use Berkeley DB automatically @end example -Please refer to the manual provided by @code{BDB} distribution for -more/updated information. - -After this you need to configure your @strong{MySQL} with -@code{--with-berkeley-db=DIR}. The directory is the one where you installed -@code{BDB} binaries with @code{make install}. (Usually it is -/usr/local/BerkeleyDB.3.1/.) You can give additional options to +If you would like to install Berkeley DB separately, to use with +other applications and MySQL, this is possible. Follow the directions +for installing Berkeley DB in the Berkeley DB README file. Then, pass +the @code{--with-berkeley-db=DIR} option to @code{MySQL}'s @code{configure}, +where @code{DIR} refers to the installation prefix used when installing +Berkeley DB (by default it is +/usr/local/BerkeleyDB.3.2). You can give additional options to @strong{MySQL} configure, @code{--with-berkeley-db-includes=DIR} and @code{--with-berkeley-db-libs=DIR}, if the @code{BDB} includes and/or libs directory is not under the first directory (by default they are). Then complete the @strong{MySQL} installation as normal. -Even if Berkeley DB is in itself very tested and reliable, the -@strong{MySQL} interface is still very alpha, but we are actively -improving and optimizing it to get it this stable real soon. +Please refer to the manual provided by @code{BDB} distribution for +more/updated information. + +Even though Berkeley DB is in itself very tested and reliable, +the @strong{MySQL} interface is still considered beta quality. +We are actively improving and optimizing it to get it stable very +soon. @node BDB start, BDB characteristic, BDB install, BDB @subsection BDB startup options @@ -22272,6 +22286,12 @@ If you are running with @code{AUTOCOMMIT=0} then your changes in @code{BDB} tables will not be updated until you execute @code{COMMIT}. Instead of commit you can execute @code{ROLLBACK} to forget your changes. @xref{COMMIT}. +If you are running with @code{AUTOCOMMIT=1} (the default), your changes +will be committed immediately. You can start an extended transaction with +the @code{BEGIN WORK} SQL command, after which your changes will not be +committed until you execute @code{COMMIT} (or decide to @code{ROLLBACK} +the changes). + The following options to @code{mysqld} can be used to change the behavior of BDB tables: @@ -22284,6 +22304,7 @@ BDB tables: @item @code{--bdb-recover} @tab Start Berkeley DB in recover mode. @item @code{--bdb-tmpdir=directory} @tab Berkeley DB tempfile name. @item @code{--skip-bdb} @tab Don't use berkeley db. +@item @code{-O bdb_lock_max=1000} @tab Set the maximum number of locks possible. @xref{SHOW VARIABLES}. @end multitable If you use @code{--skip-bdb}, @strong{MySQL} will not initialize the @@ -22336,15 +22357,16 @@ read may fail with a deadlock error. @item Keys are not compressed to previous keys as with ISAM or MyISAM tables. In other words, the key information will take a little more -space in @code{BDB} tables compared to MyISAM tables with don't use +space in @code{BDB} tables compared to MyISAM tables which don't use @code{PACK_KEYS=0}. @item -One must do a @code{FLUSH LOGS} from time to time to sync to get checkpoints -for the @code{BDB} tables. -@item -As transaction logs take up more space than ordinary logs, it's more important -to rotate and remove old logs when using @code{BDB} tables than when using other table -types. +@strong{MySQL} performs a checkpoint each time a new Berkeley DB log +file is started, and removes any log files that are not needed for +current transactions. One can also run @code{FLUSH LOGS} at any time +to checkpoint the Berkeley DB tables. + +For disaster recovery, one should use table backups plus MySQL's binary +log. @xref{Backup}. @end itemize @node BDB TODO, BDB errors, BDB characteristic, BDB @@ -22370,8 +22392,9 @@ error file: 001119 23:43:56 bdb: txn_abort: Log undo failed for LSN: 1 3644744: Invalid @end example -This is not fatal but we don't recommend you to delete tables you are -using in not @code{auto_commit} mode. +This is not fatal but we don't recommend that you delete tables if you are +not in @code{auto_commit} mode, until this problem is fixed (the fix is +not trivial). @cindex tutorial @cindex terminal monitor, defined @@ -38906,6 +38929,9 @@ though, so Version 3.23 is not released as a stable version yet. @appendixsubsec Changes in release 3.23.29 @itemize @bullet @item +Automatically remove Berkeley DB transaction logs that are no longer in +use. +@item Applied patches for OS2 by @code{Yuri Dario}. @item @code{FLUSH TABLES table_name} didn't always flush table properly to diff --git a/acinclude.m4 b/acinclude.m4 index 7f039dbf7af..44f3a389326 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -615,7 +615,8 @@ dnl --------------------------------------------------------------------------- AC_DEFUN([MYSQL_CHECK_BDB], [ AC_ARG_WITH([berkeley-db], [\ - --with-berkely-db[=DIR] Use BerkeleyDB located in DIR], + --with-berkeley-db[=DIR] + Use BerkeleyDB located in DIR], [bdb="$withval"], [bdb=default]) diff --git a/configure.in b/configure.in index f75f88fc408..1df599c373a 100644 --- a/configure.in +++ b/configure.in @@ -1821,7 +1821,12 @@ then sql_server_dirs="$have_berkeley_db/build_unix $sql_server_dirs" echo "CONFIGURING FOR BERKELEY DB" - (cd $bdb && cd build_unix && sh ../dist/configure) \ + bdb_conf_flags= + if test $with_debug = "yes" + then + bdb_conf_flags="$bdb_conf_flags --enable-debug --enable-diagnostic" + fi + (cd $bdb && cd build_unix && sh ../dist/configure $bdb_conf_flags) \ || AC_MSG_ERROR([could not configure Berkeley DB]) echo "Modifying Berkeley DB install target" diff --git a/sql/Makefile.am b/sql/Makefile.am index 7b56acbb773..ba091668f1d 100644 --- a/sql/Makefile.am +++ b/sql/Makefile.am @@ -42,7 +42,7 @@ noinst_HEADERS = item.h item_func.h item_sum.h item_cmpfunc.h \ item_strfunc.h item_timefunc.h item_uniq.h \ item_create.h mysql_priv.h \ procedure.h sql_class.h sql_lex.h sql_list.h \ - sql_map.h sql_string.h unireg.h \ + sql_manager.h sql_map.h sql_string.h unireg.h \ field.h handler.h ha_isammrg.h ha_isam.h ha_myisammrg.h\ ha_heap.h ha_myisam.h ha_berkeley.h\ opt_range.h opt_ft.h \ @@ -55,7 +55,7 @@ mysqld_SOURCES = sql_lex.cc \ thr_malloc.cc item_create.cc \ field.cc key.cc sql_class.cc sql_list.cc \ net_serv.cc violite.c net_pkg.cc lock.cc my_lock.c \ - sql_string.cc sql_map.cc \ + sql_string.cc sql_manager.cc sql_map.cc \ mysqld.cc password.c hash_filo.cc hostname.cc \ convert.cc sql_parse.cc sql_yacc.yy \ sql_base.cc table.cc sql_select.cc sql_insert.cc \ diff --git a/sql/ha_berkeley.cc b/sql/ha_berkeley.cc index 60830f4df37..f515b151c8b 100644 --- a/sql/ha_berkeley.cc +++ b/sql/ha_berkeley.cc @@ -57,6 +57,7 @@ #include <assert.h> #include <hash.h> #include "ha_berkeley.h" +#include "sql_manager.h" #define HA_BERKELEY_ROWS_IN_TABLE 10000 /* to get optimization right */ #define HA_BERKELEY_RANGE_COUNT 100 @@ -87,6 +88,7 @@ static byte* bdb_get_key(BDB_SHARE *share,uint *length, my_bool not_used __attribute__((unused))); static BDB_SHARE *get_share(const char *table_name); static void free_share(BDB_SHARE *share); +static void berkeley_noticecall(DB_ENV *db_env, db_notices notice); /* General functions */ @@ -106,6 +108,7 @@ bool berkeley_init(void) DBUG_RETURN(1); db_env->set_errcall(db_env,berkeley_print_error); db_env->set_errpfx(db_env,"bdb"); + db_env->set_noticecall(db_env, berkeley_noticecall); db_env->set_tmp_dir(db_env, berkeley_tmpdir); db_env->set_data_dir(db_env, mysql_data_home); if (berkeley_logdir) @@ -120,6 +123,7 @@ bool berkeley_init(void) db_env->set_lk_detect(db_env, berkeley_lock_type); if (berkeley_lock_max) db_env->set_lk_max(db_env, berkeley_lock_max); + if (db_env->open(db_env, berkeley_home, berkeley_init_flags | DB_INIT_LOCK | @@ -129,6 +133,7 @@ bool berkeley_init(void) db_env->close(db_env,0); db_env=0; } + (void) hash_init(&bdb_open_tables,32,0,0, (hash_get_key) bdb_get_key,0,0); pthread_mutex_init(&bdb_mutex,NULL); @@ -196,6 +201,48 @@ static void berkeley_print_error(const char *db_errpfx, char *buffer) sql_print_error("%s: %s",db_errpfx,buffer); } +static void berkeley_noticecall(DB_ENV *db_env, db_notices notice) +{ + switch (notice) + { + case DB_NOTICE_LOGFILE_CHANGED: + pthread_mutex_lock(&LOCK_manager); + manager_status |= MANAGER_BERKELEY_LOG_CLEANUP; + pthread_mutex_unlock(&LOCK_manager); + pthread_cond_signal(&COND_manager); + break; + } +} + +void berkeley_cleanup_log_files(void) +{ + DBUG_ENTER("berkeley_cleanup_log_files"); + char **names; + int error; + + /* XXX: Probably this should be done somewhere else, and + * should be tunable by the user. */ + if ((error = txn_checkpoint(db_env, 0, 0, 0))) + my_error(ER_ERROR_DURING_CHECKPOINT, MYF(0), error); + + if ((error = log_archive(db_env, &names, DB_ARCH_ABS, NULL)) != 0) + { + DBUG_PRINT("error", ("log_archive failed (error %d)", error)); + db_env->err(db_env, error, "log_archive: DB_ARCH_ABS"); + DBUG_VOID_RETURN; + } + + if (names) + { + char **np; + for (np = names; *np; ++np) + my_delete(*np, MYF(MY_WME)); + + free(names); + } + + DBUG_VOID_RETURN; +} /***************************************************************************** diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 2e2452a0020..ef6f1e7a81e 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -422,6 +422,17 @@ int mysql_load(THD *thd,sql_exchange *ex, TABLE_LIST *table_list, List<Item> &fields, enum enum_duplicates handle_duplicates, bool local_file,thr_lock_type lock_type); int write_record(TABLE *table,COPY_INFO *info); + +/* sql_manager.cc */ +/* bits set in manager_status */ +#define MANAGER_BERKELEY_LOG_CLEANUP (1L << 0) +extern ulong manager_status; +extern bool volatile manager_thread_in_use; +extern pthread_t manager_thread; +extern pthread_mutex_t LOCK_manager; +extern pthread_cond_t COND_manager; +pthread_handler_decl(handle_manager, arg); + /* sql_test.cc */ #ifndef DBUG_OFF void print_where(COND *cond,const char *info); diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 3fe224a4748..88b60ef92ad 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -154,7 +154,6 @@ static my_string opt_logname=0,opt_update_logname=0, opt_binlog_index_name = 0,opt_slow_logname=0; static char mysql_home[FN_REFLEN],pidfile_name[FN_REFLEN]; static pthread_t select_thread; -static pthread_t flush_thread; // Used when debugging static bool opt_log,opt_update_log,opt_bin_log,opt_slow_log,opt_noacl, opt_disable_networking=0, opt_bootstrap=0,opt_skip_show_db=0, opt_ansi_mode=0,opt_myisam_log=0, opt_large_files=sizeof(my_off_t) > 4; @@ -214,7 +213,7 @@ ulong max_tmp_tables,max_heap_table_size; ulong bytes_sent = 0L, bytes_received = 0L; bool opt_endinfo,using_udf_functions,low_priority_updates, locked_in_memory; -bool volatile abort_loop,select_thread_in_use,flush_thread_in_use,grant_option; +bool volatile abort_loop,select_thread_in_use,grant_option; bool volatile ready_to_exit,shutdown_in_progress; ulong refresh_version=1L,flush_version=1L; /* Increments on each reload */ ulong query_id=1L,long_query_count,long_query_time,aborted_threads, @@ -257,10 +256,10 @@ pthread_mutex_t LOCK_mysql_create_db, LOCK_Acl, LOCK_open, LOCK_thread_count, LOCK_mapped_file, LOCK_status, LOCK_grant, LOCK_error_log, LOCK_delayed_insert, LOCK_delayed_status, LOCK_delayed_create, - LOCK_flush, LOCK_crypt, LOCK_bytes_sent, LOCK_bytes_received, + LOCK_crypt, LOCK_bytes_sent, LOCK_bytes_received, LOCK_binlog_update, LOCK_slave, LOCK_server_id; -pthread_cond_t COND_refresh,COND_thread_count,COND_flush, COND_binlog_update, +pthread_cond_t COND_refresh,COND_thread_count,COND_binlog_update, COND_slave_stopped; pthread_cond_t COND_thread_cache,COND_flush_thread_cache; pthread_t signal_thread; @@ -289,7 +288,6 @@ static pthread_handler_decl(handle_connections_namedpipes,arg); #ifdef __WIN__ static int get_service_parameters(); #endif -static pthread_handler_decl(handle_flush,arg); extern pthread_handler_decl(handle_slave,arg); #ifdef SET_RLIMIT_NOFILE static uint set_maximum_open_files(uint max_file_limit); @@ -313,13 +311,13 @@ static void close_connections(void) flush_thread_cache(); /* kill flush thread */ - (void) pthread_mutex_lock(&LOCK_flush); - if (flush_thread_in_use) + (void) pthread_mutex_lock(&LOCK_manager); + if (manager_thread_in_use) { - DBUG_PRINT("quit",("killing flush thread: %lx",flush_thread)); - (void) pthread_cond_signal(&COND_flush); + DBUG_PRINT("quit",("killing manager thread: %lx",manager_thread)); + (void) pthread_cond_signal(&COND_manager); } - (void) pthread_mutex_unlock(&LOCK_flush); + (void) pthread_mutex_unlock(&LOCK_manager); /* kill connection thread */ #if !defined(__WIN__) && !defined(__EMX__) @@ -1398,8 +1396,8 @@ int main(int argc, char **argv) (void) pthread_cond_init(&COND_refresh,NULL); (void) pthread_cond_init(&COND_thread_cache,NULL); (void) pthread_cond_init(&COND_flush_thread_cache,NULL); - (void) pthread_cond_init(&COND_flush,NULL); - (void) pthread_mutex_init(&LOCK_flush,NULL); + (void) pthread_cond_init(&COND_manager,NULL); + (void) pthread_mutex_init(&LOCK_manager,NULL); (void) pthread_mutex_init(&LOCK_crypt,NULL); (void) pthread_mutex_init(&LOCK_bytes_sent,NULL); (void) pthread_mutex_init(&LOCK_bytes_received,NULL); @@ -1606,11 +1604,15 @@ int main(int argc, char **argv) } #endif - if (flush_time && flush_time != ~(ulong) 0L) + if ( +#ifdef HAVE_BERKELEY_DB + !berkeley_skip || +#endif + (flush_time && flush_time != ~(ulong) 0L)) { pthread_t hThread; - if (pthread_create(&hThread,&connection_attrib,handle_flush,0)) - sql_print_error("Warning: Can't create thread to handle flush"); + if (pthread_create(&hThread,&connection_attrib,handle_manager,0)) + sql_print_error("Warning: Can't create thread to manage maintenance"); } // slave thread @@ -2177,41 +2179,6 @@ pthread_handler_decl(handle_connections_namedpipes,arg) } #endif /* __NT__ */ -/**************************************************************************** -** Create thread that automaticly flush all tables after a given time -****************************************************************************/ - -pthread_handler_decl(handle_flush,arg __attribute__((unused))) -{ - my_thread_init(); - DBUG_ENTER("handle_flush"); - - pthread_detach_this_thread(); - flush_thread=pthread_self(); - flush_thread_in_use=1; - - pthread_mutex_lock(&LOCK_flush); - while (flush_time) - { - struct timespec abstime; -#ifdef HAVE_TIMESPEC_TS_SEC - abstime.ts_sec=time(NULL)+flush_time; // Bsd 2.1 - abstime.ts_nsec=0; -#else - abstime.tv_sec=time(NULL)+flush_time; // Linux or Solairs - abstime.tv_nsec=0; -#endif - (void) pthread_cond_timedwait(&COND_flush,&LOCK_flush, &abstime); - if (abort_loop) - break; - flush_tables(); - } - flush_thread_in_use=0; - pthread_mutex_unlock(&LOCK_flush); - my_thread_end(); - DBUG_RETURN(0); -} - /****************************************************************************** ** handle start options diff --git a/sql/sql_manager.cc b/sql/sql_manager.cc new file mode 100644 index 00000000000..13fef76d4ab --- /dev/null +++ b/sql/sql_manager.cc @@ -0,0 +1,101 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + * sql_manager.cc + * This thread manages various maintenance tasks. + * + * o Flushing the tables every flush_time seconds. + * o Berkeley DB: removing unneeded log files. + */ + +#include "mysql_priv.h" +#include "sql_manager.h" + +ulong manager_status; +bool volatile manager_thread_in_use; + +pthread_t manager_thread; +pthread_mutex_t LOCK_manager; +pthread_cond_t COND_manager; + +pthread_handler_decl(handle_manager,arg __attribute__((unused))) +{ + int error = 0; + ulong status; + struct timespec abstime; + bool reset_flush_time = TRUE; + my_thread_init(); + DBUG_ENTER("handle_manager"); + + pthread_detach_this_thread(); + manager_thread = pthread_self(); + manager_status = 0; + manager_thread_in_use = 1; + + for (;;) + { + pthread_mutex_lock(&LOCK_manager); + /* XXX: This will need to be made more general to handle different + * polling needs. */ + if (flush_time) + { + if (reset_flush_time) + { +#ifdef HAVE_TIMESPEC_TS_SEC + abstime.ts_sec = time(NULL)+flush_time; // Bsd 2.1 + abstime.ts_nsec = 0; +#else + abstime.tv_sec = time(NULL)+flush_time; // Linux or Solairs + abstime.tv_nsec = 0; +#endif + reset_flush_time = FALSE; + } + while (!manager_status && !error && !abort_loop) + error = pthread_cond_timedwait(&COND_manager, &LOCK_manager, &abstime); + } + else + while (!manager_status && !error && !abort_loop) + error = pthread_cond_wait(&COND_manager, &LOCK_manager); + status = manager_status; + manager_status = 0; + pthread_mutex_unlock(&LOCK_manager); + + if (abort_loop) + break; + + if (error) /* == ETIMEDOUT */ + { + flush_tables(); + error = 0; + reset_flush_time = TRUE; + } + +#ifdef HAVE_BERKELEY_DB + if (status & MANAGER_BERKELEY_LOG_CLEANUP) + { + berkeley_cleanup_log_files(); + status &= ~MANAGER_BERKELEY_LOG_CLEANUP; + } +#endif + + if (status) + DBUG_PRINT("error", ("manager did not handle something: %lx", status)); + } + manager_thread_in_use = 0; + my_thread_end(); + DBUG_RETURN(NULL); +} diff --git a/sql/sql_manager.h b/sql/sql_manager.h new file mode 100644 index 00000000000..35704705820 --- /dev/null +++ b/sql/sql_manager.h @@ -0,0 +1,19 @@ +/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifdef HAVE_BERKELEY_DB +void berkeley_cleanup_log_files(void); +#endif /* HAVE_BERKELEY_DB */ |