Commit ea0a7491 authored by tim@threads.polyesthetic.msg's avatar tim@threads.polyesthetic.msg

Merge work.mysql.com:/home/bk/mysql

into threads.polyesthetic.msg:/usr/local/src/my/work
parents b01622e3 b8dfb28e
...@@ -5364,6 +5364,12 @@ into it. ...@@ -5364,6 +5364,12 @@ into it.
Obtain a distribution file from one of the sites listed in Obtain a distribution file from one of the sites listed in
@ref{Getting MySQL, , Getting @strong{MySQL}}. @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} @strong{MySQL} source distributions are provided as compressed @code{tar}
archives and have names like @file{mysql-VERSION.tar.gz}, where archives and have names like @file{mysql-VERSION.tar.gz}, where
@code{VERSION} is a number like @value{mysql_version}. @code{VERSION} is a number like @value{mysql_version}.
...@@ -5708,32 +5714,31 @@ source tree: ...@@ -5708,32 +5714,31 @@ source tree:
@itemize @itemize
@item @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 @item
Follow the instructions to install it Follow the instructions to install it.
@item @item
Once @strong{BitKeeper} is installed, Once @strong{BitKeeper} is installed,
@code{bk clone bk://work.mysql.com:7000 mysql} - the initial download @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 @item
@code{cd mysql; bk -r edit; aclocal; autoheader; autoconf; @code{cd mysql; bk -r edit; aclocal; autoheader; autoconf;
automake; ./configure} with your favorite options, and then automake; ./configure} with your favorite options, and then
@code{ make} @code{ make}.
- you will need GNU autoconf/automake, libtool, and m4 to do this. You will need GNU autoconf/automake, libtool, and m4 to do this.
. We have a We have a
collection of our standard configure scripts in the @code{BUILD/} collection of our standard configure scripts in the @code{BUILD/}
subdirectory - if you are lazy, you can do subdirectory - if you are lazy, you can do
@code{BUILD/compile-pentium-debug} . It will actually work on a lot of @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 @item
Once the build is done, @code{make install}. Be careful with this on Once the build is done, @code{make install}. Be careful with this on
a production machine - this may overwrite your live release binary. We a production machine - this may overwrite your live release binary. We
recommend that if you have another installation of @strong{MySQL} that recommend that if you have another installation of @strong{MySQL} that
you @code{./configure} with different values for @code{basedir}, you @code{./configure} with different values for @code{prefix},
@code{datadir}, @code{bindir}, @code{sbindir}, @code{libexecdir}, @code{tcp-port}, and @code{unix-socket-path}.
@code{tcp-port}, and @code{unix-socket-path}
@item @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 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. sure you have a full test case for the bug that we can run.
@item @item
...@@ -5745,18 +5750,18 @@ if you execute @code{aclocal} and get @code{command not found}, or a ...@@ -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 similar problem, do not report it - make sure all the needed tools are
installed and your @code{PATH} variable is set correctly. installed and your @code{PATH} variable is set correctly.
@item @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 @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 @code{bk sccstool}. If you see some funny diffs or code that you have a
question about, do not hesitate and e-mail question about, do not hesitate and e-mail
@email{internals@@lists.mysql.com}. Also if you think you have a @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 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 have made changes to the source. If you do not have the time to code
your idea, just send a description. your idea, just send a description.
@item @item
@strong{BitKeeper} has a nice help utility - @code{bk helptool} @strong{BitKeeper} has a nice help utility - @code{bk helptool}.
@end itemize @end itemize
...@@ -5989,7 +5994,7 @@ Note that on Linux you should NOT use MIT-pthreads but install LinuxThreads! ...@@ -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 If your system does not provide native thread support, you will need to
build @strong{MySQL} using the MIT-pthreads package. This includes 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}. @xref{Which OS}.
@itemize @bullet @itemize @bullet
...@@ -22230,40 +22235,49 @@ Berkeley DB (@uref{http://www.sleepycat.com}) has provided ...@@ -22230,40 +22235,49 @@ Berkeley DB (@uref{http://www.sleepycat.com}) has provided
crashes and also provides @code{COMMIT} and @code{ROLLBACK} on crashes and also provides @code{COMMIT} and @code{ROLLBACK} on
transactions. In order to build MySQL Version 3.23.x (BDB support first 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 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 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}; or also from @uref{http://www.mysql.com/downloads/mysql-3.23.html}. This is a patched
Sleepycat's download page at version of Berkeley DB that is only available from @strong{MySQL}; the
@uref{http://www.sleepycat.com/download.html}. standard Berkeley DB @strong{will not work with MySQL}.
@node BDB install, BDB start, BDB overview, BDB @node BDB install, BDB start, BDB overview, BDB
@subsection Installing BDB @subsection Installing BDB
To install Berkeley DB, first uncompress the @code{BDB} distribution If you have downloaded a binary version of @strong{MySQL} that includes
and follow the instructions in the README file provided in the distribution support for Berkeley DB, simply follow the instructions for
directory. Basically what you need to do is: 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 @example
cd build_[your_os] cd /path/to/source/of/mysql-3.23.29-gamma
../dist/configure gzip -cd /tmp/db-3.2.3d.tar.gz | tar xf -
make ./configure # this will use Berkeley DB automatically
make install
@end example @end example
Please refer to the manual provided by @code{BDB} distribution for If you would like to install Berkeley DB separately, to use with
more/updated information. other applications and MySQL, this is possible. Follow the directions
for installing Berkeley DB in the Berkeley DB README file. Then, pass
After this you need to configure your @strong{MySQL} with the @code{--with-berkeley-db=DIR} option to @code{MySQL}'s @code{configure},
@code{--with-berkeley-db=DIR}. The directory is the one where you installed where @code{DIR} refers to the installation prefix used when installing
@code{BDB} binaries with @code{make install}. (Usually it is Berkeley DB (by default it is
/usr/local/BerkeleyDB.3.1/.) You can give additional options to /usr/local/BerkeleyDB.3.2). You can give additional options to
@strong{MySQL} configure, @code{--with-berkeley-db-includes=DIR} and @strong{MySQL} configure, @code{--with-berkeley-db-includes=DIR} and
@code{--with-berkeley-db-libs=DIR}, if the @code{BDB} includes and/or libs @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). directory is not under the first directory (by default they are).
Then complete the @strong{MySQL} installation as normal. Then complete the @strong{MySQL} installation as normal.
Even if Berkeley DB is in itself very tested and reliable, the Please refer to the manual provided by @code{BDB} distribution for
@strong{MySQL} interface is still very alpha, but we are actively more/updated information.
improving and optimizing it to get it this stable real soon.
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 @node BDB start, BDB characteristic, BDB install, BDB
@subsection BDB startup options @subsection BDB startup options
...@@ -22272,6 +22286,12 @@ If you are running with @code{AUTOCOMMIT=0} then your changes in @code{BDB} ...@@ -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 tables will not be updated until you execute @code{COMMIT}. Instead of commit
you can execute @code{ROLLBACK} to forget your changes. @xref{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 The following options to @code{mysqld} can be used to change the behavior of
BDB tables: BDB tables:
...@@ -22284,6 +22304,7 @@ BDB tables: ...@@ -22284,6 +22304,7 @@ BDB tables:
@item @code{--bdb-recover} @tab Start Berkeley DB in recover mode. @item @code{--bdb-recover} @tab Start Berkeley DB in recover mode.
@item @code{--bdb-tmpdir=directory} @tab Berkeley DB tempfile name. @item @code{--bdb-tmpdir=directory} @tab Berkeley DB tempfile name.
@item @code{--skip-bdb} @tab Don't use berkeley db. @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 @end multitable
If you use @code{--skip-bdb}, @strong{MySQL} will not initialize the If you use @code{--skip-bdb}, @strong{MySQL} will not initialize the
...@@ -22336,15 +22357,16 @@ read may fail with a deadlock error. ...@@ -22336,15 +22357,16 @@ read may fail with a deadlock error.
@item @item
Keys are not compressed to previous keys as with ISAM or MyISAM Keys are not compressed to previous keys as with ISAM or MyISAM
tables. In other words, the key information will take a little more 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}. @code{PACK_KEYS=0}.
@item @item
One must do a @code{FLUSH LOGS} from time to time to sync to get checkpoints @strong{MySQL} performs a checkpoint each time a new Berkeley DB log
for the @code{BDB} tables. file is started, and removes any log files that are not needed for
@item current transactions. One can also run @code{FLUSH LOGS} at any time
As transaction logs take up more space than ordinary logs, it's more important to checkpoint the Berkeley DB tables.
to rotate and remove old logs when using @code{BDB} tables than when using other table
types. For disaster recovery, one should use table backups plus MySQL's binary
log. @xref{Backup}.
@end itemize @end itemize
@node BDB TODO, BDB errors, BDB characteristic, BDB @node BDB TODO, BDB errors, BDB characteristic, BDB
...@@ -22370,8 +22392,9 @@ error file: ...@@ -22370,8 +22392,9 @@ error file:
001119 23:43:56 bdb: txn_abort: Log undo failed for LSN: 1 3644744: Invalid 001119 23:43:56 bdb: txn_abort: Log undo failed for LSN: 1 3644744: Invalid
@end example @end example
This is not fatal but we don't recommend you to delete tables you are This is not fatal but we don't recommend that you delete tables if you are
using in not @code{auto_commit} mode. not in @code{auto_commit} mode, until this problem is fixed (the fix is
not trivial).
@cindex tutorial @cindex tutorial
@cindex terminal monitor, defined @cindex terminal monitor, defined
...@@ -38906,6 +38929,9 @@ though, so Version 3.23 is not released as a stable version yet. ...@@ -38906,6 +38929,9 @@ though, so Version 3.23 is not released as a stable version yet.
@appendixsubsec Changes in release 3.23.29 @appendixsubsec Changes in release 3.23.29
@itemize @bullet @itemize @bullet
@item @item
Automatically remove Berkeley DB transaction logs that are no longer in
use.
@item
Applied patches for OS2 by @code{Yuri Dario}. Applied patches for OS2 by @code{Yuri Dario}.
@item @item
@code{FLUSH TABLES table_name} didn't always flush table properly to @code{FLUSH TABLES table_name} didn't always flush table properly to
...@@ -615,7 +615,8 @@ dnl --------------------------------------------------------------------------- ...@@ -615,7 +615,8 @@ dnl ---------------------------------------------------------------------------
AC_DEFUN([MYSQL_CHECK_BDB], [ AC_DEFUN([MYSQL_CHECK_BDB], [
AC_ARG_WITH([berkeley-db], 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="$withval"],
[bdb=default]) [bdb=default])
......
...@@ -1821,7 +1821,12 @@ then ...@@ -1821,7 +1821,12 @@ then
sql_server_dirs="$have_berkeley_db/build_unix $sql_server_dirs" sql_server_dirs="$have_berkeley_db/build_unix $sql_server_dirs"
echo "CONFIGURING FOR BERKELEY DB" 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]) || AC_MSG_ERROR([could not configure Berkeley DB])
echo "Modifying Berkeley DB install target" echo "Modifying Berkeley DB install target"
......
...@@ -42,7 +42,7 @@ noinst_HEADERS = item.h item_func.h item_sum.h item_cmpfunc.h \ ...@@ -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_strfunc.h item_timefunc.h item_uniq.h \
item_create.h mysql_priv.h \ item_create.h mysql_priv.h \
procedure.h sql_class.h sql_lex.h sql_list.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\ field.h handler.h ha_isammrg.h ha_isam.h ha_myisammrg.h\
ha_heap.h ha_myisam.h ha_berkeley.h\ ha_heap.h ha_myisam.h ha_berkeley.h\
opt_range.h opt_ft.h \ opt_range.h opt_ft.h \
...@@ -55,7 +55,7 @@ mysqld_SOURCES = sql_lex.cc \ ...@@ -55,7 +55,7 @@ mysqld_SOURCES = sql_lex.cc \
thr_malloc.cc item_create.cc \ thr_malloc.cc item_create.cc \
field.cc key.cc sql_class.cc sql_list.cc \ field.cc key.cc sql_class.cc sql_list.cc \
net_serv.cc violite.c net_pkg.cc lock.cc my_lock.c \ 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 \ mysqld.cc password.c hash_filo.cc hostname.cc \
convert.cc sql_parse.cc sql_yacc.yy \ convert.cc sql_parse.cc sql_yacc.yy \
sql_base.cc table.cc sql_select.cc sql_insert.cc \ sql_base.cc table.cc sql_select.cc sql_insert.cc \
......
...@@ -57,6 +57,7 @@ ...@@ -57,6 +57,7 @@
#include <assert.h> #include <assert.h>
#include <hash.h> #include <hash.h>
#include "ha_berkeley.h" #include "ha_berkeley.h"
#include "sql_manager.h"
#define HA_BERKELEY_ROWS_IN_TABLE 10000 /* to get optimization right */ #define HA_BERKELEY_ROWS_IN_TABLE 10000 /* to get optimization right */
#define HA_BERKELEY_RANGE_COUNT 100 #define HA_BERKELEY_RANGE_COUNT 100
...@@ -87,6 +88,7 @@ static byte* bdb_get_key(BDB_SHARE *share,uint *length, ...@@ -87,6 +88,7 @@ static byte* bdb_get_key(BDB_SHARE *share,uint *length,
my_bool not_used __attribute__((unused))); my_bool not_used __attribute__((unused)));
static BDB_SHARE *get_share(const char *table_name); static BDB_SHARE *get_share(const char *table_name);
static void free_share(BDB_SHARE *share); static void free_share(BDB_SHARE *share);
static void berkeley_noticecall(DB_ENV *db_env, db_notices notice);
/* General functions */ /* General functions */
...@@ -106,6 +108,7 @@ bool berkeley_init(void) ...@@ -106,6 +108,7 @@ bool berkeley_init(void)
DBUG_RETURN(1); DBUG_RETURN(1);
db_env->set_errcall(db_env,berkeley_print_error); db_env->set_errcall(db_env,berkeley_print_error);
db_env->set_errpfx(db_env,"bdb"); 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_tmp_dir(db_env, berkeley_tmpdir);
db_env->set_data_dir(db_env, mysql_data_home); db_env->set_data_dir(db_env, mysql_data_home);
if (berkeley_logdir) if (berkeley_logdir)
...@@ -120,6 +123,7 @@ bool berkeley_init(void) ...@@ -120,6 +123,7 @@ bool berkeley_init(void)
db_env->set_lk_detect(db_env, berkeley_lock_type); db_env->set_lk_detect(db_env, berkeley_lock_type);
if (berkeley_lock_max) if (berkeley_lock_max)
db_env->set_lk_max(db_env, berkeley_lock_max); db_env->set_lk_max(db_env, berkeley_lock_max);
if (db_env->open(db_env, if (db_env->open(db_env,
berkeley_home, berkeley_home,
berkeley_init_flags | DB_INIT_LOCK | berkeley_init_flags | DB_INIT_LOCK |
...@@ -129,6 +133,7 @@ bool berkeley_init(void) ...@@ -129,6 +133,7 @@ bool berkeley_init(void)
db_env->close(db_env,0); db_env->close(db_env,0);
db_env=0; db_env=0;
} }
(void) hash_init(&bdb_open_tables,32,0,0, (void) hash_init(&bdb_open_tables,32,0,0,
(hash_get_key) bdb_get_key,0,0); (hash_get_key) bdb_get_key,0,0);
pthread_mutex_init(&bdb_mutex,NULL); pthread_mutex_init(&bdb_mutex,NULL);
...@@ -196,6 +201,48 @@ static void berkeley_print_error(const char *db_errpfx, char *buffer) ...@@ -196,6 +201,48 @@ static void berkeley_print_error(const char *db_errpfx, char *buffer)
sql_print_error("%s: %s",db_errpfx,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;
}
/***************************************************************************** /*****************************************************************************
......
...@@ -422,6 +422,17 @@ int mysql_load(THD *thd,sql_exchange *ex, TABLE_LIST *table_list, ...@@ -422,6 +422,17 @@ int mysql_load(THD *thd,sql_exchange *ex, TABLE_LIST *table_list,
List<Item> &fields, enum enum_duplicates handle_duplicates, List<Item> &fields, enum enum_duplicates handle_duplicates,
bool local_file,thr_lock_type lock_type); bool local_file,thr_lock_type lock_type);
int write_record(TABLE *table,COPY_INFO *info); 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 */ /* sql_test.cc */
#ifndef DBUG_OFF #ifndef DBUG_OFF
void print_where(COND *cond,const char *info); void print_where(COND *cond,const char *info);
......
...@@ -154,7 +154,6 @@ static my_string opt_logname=0,opt_update_logname=0, ...@@ -154,7 +154,6 @@ static my_string opt_logname=0,opt_update_logname=0,
opt_binlog_index_name = 0,opt_slow_logname=0; opt_binlog_index_name = 0,opt_slow_logname=0;
static char mysql_home[FN_REFLEN],pidfile_name[FN_REFLEN]; static char mysql_home[FN_REFLEN],pidfile_name[FN_REFLEN];
static pthread_t select_thread; 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, 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_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; 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; ...@@ -214,7 +213,7 @@ ulong max_tmp_tables,max_heap_table_size;
ulong bytes_sent = 0L, bytes_received = 0L; ulong bytes_sent = 0L, bytes_received = 0L;
bool opt_endinfo,using_udf_functions,low_priority_updates, locked_in_memory; 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; bool volatile ready_to_exit,shutdown_in_progress;
ulong refresh_version=1L,flush_version=1L; /* Increments on each reload */ ulong refresh_version=1L,flush_version=1L; /* Increments on each reload */
ulong query_id=1L,long_query_count,long_query_time,aborted_threads, 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, ...@@ -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_mapped_file, LOCK_status, LOCK_grant,
LOCK_error_log, LOCK_error_log,
LOCK_delayed_insert, LOCK_delayed_status, LOCK_delayed_create, 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; 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; COND_slave_stopped;
pthread_cond_t COND_thread_cache,COND_flush_thread_cache; pthread_cond_t COND_thread_cache,COND_flush_thread_cache;
pthread_t signal_thread; pthread_t signal_thread;
...@@ -289,7 +288,6 @@ static pthread_handler_decl(handle_connections_namedpipes,arg); ...@@ -289,7 +288,6 @@ static pthread_handler_decl(handle_connections_namedpipes,arg);
#ifdef __WIN__ #ifdef __WIN__
static int get_service_parameters(); static int get_service_parameters();
#endif #endif
static pthread_handler_decl(handle_flush,arg);
extern pthread_handler_decl(handle_slave,arg); extern pthread_handler_decl(handle_slave,arg);
#ifdef SET_RLIMIT_NOFILE #ifdef SET_RLIMIT_NOFILE
static uint set_maximum_open_files(uint max_file_limit); static uint set_maximum_open_files(uint max_file_limit);
...@@ -313,13 +311,13 @@ static void close_connections(void) ...@@ -313,13 +311,13 @@ static void close_connections(void)
flush_thread_cache(); flush_thread_cache();
/* kill flush thread */ /* kill flush thread */
(void) pthread_mutex_lock(&LOCK_flush); (void) pthread_mutex_lock(&LOCK_manager);
if (flush_thread_in_use) if (manager_thread_in_use)
{ {
DBUG_PRINT("quit",("killing flush thread: %lx",flush_thread)); DBUG_PRINT("quit",("killing manager thread: %lx",manager_thread));
(void) pthread_cond_signal(&COND_flush); (void) pthread_cond_signal(&COND_manager);
} }
(void) pthread_mutex_unlock(&LOCK_flush); (void) pthread_mutex_unlock(&LOCK_manager);
/* kill connection thread */ /* kill connection thread */
#if !defined(__WIN__) && !defined(__EMX__) #if !defined(__WIN__) && !defined(__EMX__)
...@@ -1398,8 +1396,8 @@ int main(int argc, char **argv) ...@@ -1398,8 +1396,8 @@ int main(int argc, char **argv)
(void) pthread_cond_init(&COND_refresh,NULL); (void) pthread_cond_init(&COND_refresh,NULL);
(void) pthread_cond_init(&COND_thread_cache,NULL); (void) pthread_cond_init(&COND_thread_cache,NULL);
(void) pthread_cond_init(&COND_flush_thread_cache,NULL); (void) pthread_cond_init(&COND_flush_thread_cache,NULL);
(void) pthread_cond_init(&COND_flush,NULL); (void) pthread_cond_init(&COND_manager,NULL);
(void) pthread_mutex_init(&LOCK_flush,NULL); (void) pthread_mutex_init(&LOCK_manager,NULL);
(void) pthread_mutex_init(&LOCK_crypt,NULL); (void) pthread_mutex_init(&LOCK_crypt,NULL);
(void) pthread_mutex_init(&LOCK_bytes_sent,NULL); (void) pthread_mutex_init(&LOCK_bytes_sent,NULL);
(void) pthread_mutex_init(&LOCK_bytes_received,NULL); (void) pthread_mutex_init(&LOCK_bytes_received,NULL);
...@@ -1606,11 +1604,15 @@ int main(int argc, char **argv) ...@@ -1606,11 +1604,15 @@ int main(int argc, char **argv)
} }
#endif #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; pthread_t hThread;
if (pthread_create(&hThread,&connection_attrib,handle_flush,0)) if (pthread_create(&hThread,&connection_attrib,handle_manager,0))
sql_print_error("Warning: Can't create thread to handle flush"); sql_print_error("Warning: Can't create thread to manage maintenance");
} }
// slave thread // slave thread
...@@ -2177,41 +2179,6 @@ pthread_handler_decl(handle_connections_namedpipes,arg) ...@@ -2177,41 +2179,6 @@ pthread_handler_decl(handle_connections_namedpipes,arg)
} }
#endif /* __NT__ */ #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 ** handle start options
......
/* 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);
}
/* 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 */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment