diff options
Diffstat (limited to 'sql')
-rw-r--r-- | sql/ha_berkeley.cc | 35 | ||||
-rw-r--r-- | sql/ha_berkeley.h | 2 | ||||
-rw-r--r-- | sql/log.cc | 2 | ||||
-rw-r--r-- | sql/mysqld.cc | 11 | ||||
-rw-r--r-- | sql/sql_select.cc | 6 |
5 files changed, 44 insertions, 12 deletions
diff --git a/sql/ha_berkeley.cc b/sql/ha_berkeley.cc index 1aa34052152..981526910af 100644 --- a/sql/ha_berkeley.cc +++ b/sql/ha_berkeley.cc @@ -78,7 +78,7 @@ const char *ha_berkeley_ext=".db"; bool berkeley_skip=0,berkeley_shared_data=0; u_int32_t berkeley_init_flags= DB_PRIVATE | DB_RECOVER, berkeley_env_flags=0, berkeley_lock_type=DB_LOCK_DEFAULT; -ulong berkeley_cache_size; +ulong berkeley_cache_size, berkeley_log_buffer_size, berkeley_log_file_size=0; char *berkeley_home, *berkeley_tmpdir, *berkeley_logdir; long berkeley_lock_scan_time=0; ulong berkeley_trans_retry=1; @@ -99,7 +99,8 @@ static void berkeley_print_error(const char *db_errpfx, char *buffer); 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, TABLE *table); -static int free_share(BDB_SHARE *share, TABLE *table, uint hidden_primary_key); +static int free_share(BDB_SHARE *share, TABLE *table, uint hidden_primary_key, + bool mutex_is_locked); static int write_status(DB *status_block, char *buff, uint length); static void update_status(BDB_SHARE *share, TABLE *table); static void berkeley_noticecall(DB_ENV *db_env, db_notices notice); @@ -118,6 +119,23 @@ bool berkeley_init(void) berkeley_tmpdir=mysql_tmpdir; if (!berkeley_home) berkeley_home=mysql_real_data_home; + /* + If we don't set set_lg_bsize() we will get into trouble when + trying to use many open BDB tables. + If log buffer is not set, assume that the we will need 512 byte per + open table. This is a number that we have reached by testing. + */ + if (!berkeley_log_buffer_size) + { + berkeley_log_buffer_size= max(table_cache_size*512,32*1024); + } + /* + Berkeley DB require that + berkeley_log_file_size >= berkeley_log_buffer_size*4 + */ + berkeley_log_file_size= berkeley_log_buffer_size*4; + berkeley_log_file_size= MY_ALIGN(berkeley_log_file_size,1024*1024L); + berkeley_log_file_size= max(berkeley_log_file_size, 10*1024*1024L); if (db_env_create(&db_env,0)) DBUG_RETURN(1); @@ -136,6 +154,8 @@ bool berkeley_init(void) 1); db_env->set_cachesize(db_env, 0, berkeley_cache_size, 0); + db_env->set_lg_max(db_env, berkeley_log_file_size); + db_env->set_lg_bsize(db_env, berkeley_log_buffer_size); db_env->set_lk_detect(db_env, berkeley_lock_type); if (berkeley_max_lock) db_env->set_lk_max(db_env, berkeley_max_lock); @@ -465,7 +485,7 @@ int ha_berkeley::open(const char *name, int mode, uint test_if_locked) { if ((error=db_create(&file, db_env, 0))) { - free_share(share,table, hidden_primary_key); + free_share(share,table, hidden_primary_key,1); my_free(rec_buff,MYF(0)); my_free(alloc_ptr,MYF(0)); my_errno=error; @@ -482,7 +502,7 @@ int ha_berkeley::open(const char *name, int mode, uint test_if_locked) 2 | 4), "main", DB_BTREE, open_mode,0)))) { - free_share(share,table, hidden_primary_key); + free_share(share,table, hidden_primary_key,1); my_free(rec_buff,MYF(0)); my_free(alloc_ptr,MYF(0)); my_errno=error; @@ -555,7 +575,7 @@ int ha_berkeley::close(void) my_free(rec_buff,MYF(MY_ALLOW_ZERO_PTR)); my_free(alloc_ptr,MYF(MY_ALLOW_ZERO_PTR)); - DBUG_RETURN(free_share(share,table, hidden_primary_key)); + DBUG_RETURN(free_share(share,table, hidden_primary_key,0)); } @@ -2077,11 +2097,14 @@ static BDB_SHARE *get_share(const char *table_name, TABLE *table) return share; } -static int free_share(BDB_SHARE *share, TABLE *table, uint hidden_primary_key) +static int free_share(BDB_SHARE *share, TABLE *table, uint hidden_primary_key, + bool mutex_is_locked) { int error, result = 0; uint keys=table->keys + test(hidden_primary_key); pthread_mutex_lock(&bdb_mutex); + if (mutex_is_locked) + pthread_mutex_unlock(&share->mutex); if (!--share->use_count) { DB **key_file = share->key_file; diff --git a/sql/ha_berkeley.h b/sql/ha_berkeley.h index 8684bbb0442..12879383261 100644 --- a/sql/ha_berkeley.h +++ b/sql/ha_berkeley.h @@ -168,7 +168,7 @@ class ha_berkeley: public handler extern bool berkeley_skip, berkeley_shared_data; extern u_int32_t berkeley_init_flags,berkeley_env_flags, berkeley_lock_type, berkeley_lock_types[]; -extern ulong berkeley_cache_size, berkeley_max_lock; +extern ulong berkeley_cache_size, berkeley_max_lock, berkeley_log_buffer_size; extern char *berkeley_home, *berkeley_tmpdir, *berkeley_logdir; extern long berkeley_lock_scan_time; extern TYPELIB berkeley_lock_typelib; diff --git a/sql/log.cc b/sql/log.cc index 41fb4bfb856..df3168c02cf 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -952,7 +952,7 @@ void sql_print_error(const char *format,...) #ifndef DBUG_OFF { char buff[1024]; - vsprintf(buff,format,args); + vsnprintf(buff,sizeof(buff)-1,format,args); DBUG_PRINT("error",("%s",buff)); } #endif diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 1d72f21df1d..4d9b7982f48 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -1190,7 +1190,11 @@ static void init_signals(void) struct sigaction sa; sa.sa_flags = 0; sigemptyset(&sa.sa_mask); sigprocmask(SIG_SETMASK,&sa.sa_mask,NULL); - sa.sa_handler=handle_segfault; +#ifdef HAVE_DARWIN_THREADS + sa.sa_handler=( void (*)() ) handle_segfault; +#else + sa.sa_handler=handle_segfault; +#endif sigaction(SIGSEGV, &sa, NULL); (void) sigemptyset(&set); #ifdef THREAD_SPECIFIC_SIGPIPE @@ -2512,6 +2516,8 @@ CHANGEABLE_VAR changeable_vars[] = { #ifdef HAVE_BERKELEY_DB { "bdb_cache_size", (long*) &berkeley_cache_size, KEY_CACHE_SIZE, 20*1024, (long) ~0, 0, IO_SIZE }, + {"bdb_log_buffer_size", (long*) &berkeley_log_buffer_size, 0, 256*1024L, + ~0L, 0, 1024}, { "bdb_max_lock", (long*) &berkeley_max_lock, 10000, 0, (long) ~0, 0, 1 }, /* QQ: The following should be removed soon! */ @@ -2622,6 +2628,7 @@ struct show_var_st init_vars[]= { {"basedir", mysql_home, SHOW_CHAR}, #ifdef HAVE_BERKELEY_DB {"bdb_cache_size", (char*) &berkeley_cache_size, SHOW_LONG}, + {"bdb_log_buffer_size", (char*) &berkeley_log_buffer_size, SHOW_LONG}, {"bdb_home", (char*) &berkeley_home, SHOW_CHAR_PTR}, {"bdb_max_lock", (char*) &berkeley_max_lock, SHOW_LONG}, {"bdb_logdir", (char*) &berkeley_logdir, SHOW_CHAR_PTR}, @@ -2812,7 +2819,7 @@ static void usage(void) Don't flush key buffers between writes for any MyISAM\n\ table\n\ --enable-locking Enable system locking\n\ - -T, --exit-info Print some debug info at exit\n\ + -T, --exit-info Used for debugging; Use at your own risk!\n\ --flush Flush tables to disk between SQL commands\n\ -?, --help Display this help and exit\n\ --init-file=file Read SQL commands from this file at startup\n\ diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 8e11d60fb6e..7cbd022a7b7 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -4837,7 +4837,8 @@ end_write_group(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)), /***************************************************************************** ** Remove calculation with tables that aren't yet read. Remove also tests -** against fields that are read through key. +** against fields that are read through key where the table is not a +** outer join table. ** We can't remove tests that are made against columns which are stored ** in sorted order. *****************************************************************************/ @@ -4853,7 +4854,8 @@ static bool test_if_ref(Item_field *left_item,Item *right_item) if (ref_item && ref_item->eq(right_item)) { if (right_item->type() == Item::FIELD_ITEM) - return field->eq_def(((Item_field *) right_item)->field); + return (field->eq_def(((Item_field *) right_item)->field) && + !field->table->maybe_null); if (right_item->const_item()) { // We can remove binary fields and numerical fields except float, |