branches/innodb+: Merge revisions 4150:4528 from branches/zip:
------------------------------------------------------------------------
r4152 | marko | 2009-02-10 12:52:27 +0200 (Tue, 10 Feb 2009) | 12 lines
branches/zip: When innodb_use_sys_malloc is set, ignore
innodb_additional_mem_pool_size, because nothing will
be allocated from mem_comm_pool.
mem_pool_create(): Remove the assertion about size. The function will
work with any size. However, an assertion would fail in ut_malloc_low()
when size==0.
mem_init(): When srv_use_sys_malloc is set, pass size=1 to mem_pool_create().
mem0mem.c: Add #include "srv0srv.h" that is needed by mem0dbg.c.
------------------------------------------------------------------------
r4153 | vasil | 2009-02-10 22:58:17 +0200 (Tue, 10 Feb 2009) | 14 lines
branches/zip:
(followup to r4145) Non-functional change:
Change the os_atomic_increment() and os_compare_and_swap() functions
to macros to avoid artificial limitations on the types of those
functions' arguments. As a consequence typecasts from the source
code can be removed.
Also remove Google's copyright from os0sync.ic because that file no longer
contains code from Google.
Approved by: Marko (rb://88), also ok from Inaam via IM
------------------------------------------------------------------------
r4163 | marko | 2009-02-12 00:14:19 +0200 (Thu, 12 Feb 2009) | 4 lines
branches/zip: Make innodb_thread_concurrency=0 the default.
The old default was 8.
------------------------------------------------------------------------
r4169 | calvin | 2009-02-12 10:37:10 +0200 (Thu, 12 Feb 2009) | 3 lines
branches/zip: Adjust the result file of innodb_thread_concurrency_basic
test. The default value of innodb_thread_concurrency is changed to 0
(from 8) via r4163.
------------------------------------------------------------------------
r4174 | vasil | 2009-02-12 17:38:27 +0200 (Thu, 12 Feb 2009) | 4 lines
branches/zip:
Fix pathname of the file to patch.
------------------------------------------------------------------------
r4176 | vasil | 2009-02-13 10:06:31 +0200 (Fri, 13 Feb 2009) | 7 lines
branches/zip:
Fix the failing mysql-test partition_innodb, which failed only if run after
innodb_trx_weight (or other test that would leave LATEST DEADLOCK ERROR into
the output of SHOW ENGINE INNODB STATUS). Find further explanation for the
failure at the top of the added patch partition_innodb.diff.
------------------------------------------------------------------------
r4198 | vasil | 2009-02-17 09:06:07 +0200 (Tue, 17 Feb 2009) | 8 lines
branches/zip:
Add the full text of the GPLv2 license into the root directory of the
plugin. In previous releases this file was copied from an external source
(https://svn.innodb.com/svn/plugin/trunk/support/COPYING) "manually" when
creating the source and binary archives. It is less confusing to have this
present in the root directory of the SVN branch.
------------------------------------------------------------------------
r4199 | vasil | 2009-02-17 09:11:58 +0200 (Tue, 17 Feb 2009) | 4 lines
branches/zip:
Add Google's license into COPYING.Google.
------------------------------------------------------------------------
r4200 | vasil | 2009-02-17 09:56:33 +0200 (Tue, 17 Feb 2009) | 11 lines
branches/zip:
To the files touched by the Google patch from c4144 (excluding
include/os0sync.ic because later we removed Google code from that file):
* Remove the Google license
* Remove old Innobase copyright lines
* Add a reference to the Google license and to the GPLv2 license at the top,
as recommended by the lawyers at Oracle Legal.
------------------------------------------------------------------------
r4201 | vasil | 2009-02-17 10:12:02 +0200 (Tue, 17 Feb 2009) | 8 lines
branches/zip:
* Remove old Innobase copyright lines from C source files
* Add a reference to the GPLv2 license as recommended by the lawyers
at Oracle Legal
[Step 1/28]
------------------------------------------------------------------------
r4202 | vasil | 2009-02-17 10:15:06 +0200 (Tue, 17 Feb 2009) | 8 lines
branches/zip:
* Remove old Innobase copyright lines from C source files
* Add a reference to the GPLv2 license as recommended by the lawyers
at Oracle Legal
[Step 2/28]
------------------------------------------------------------------------
r4203 | vasil | 2009-02-17 10:25:45 +0200 (Tue, 17 Feb 2009) | 8 lines
branches/zip:
* Remove old Innobase copyright lines from C source files
* Add a reference to the GPLv2 license as recommended by the lawyers
at Oracle Legal
[Step 3/28]
------------------------------------------------------------------------
r4204 | vasil | 2009-02-17 10:55:41 +0200 (Tue, 17 Feb 2009) | 8 lines
branches/zip:
* Remove old Innobase copyright lines from C source files
* Add a reference to the GPLv2 license as recommended by the lawyers
at Oracle Legal
[Step 4/28]
------------------------------------------------------------------------
r4205 | vasil | 2009-02-17 10:59:22 +0200 (Tue, 17 Feb 2009) | 8 lines
branches/zip:
* Remove old Innobase copyright lines from C source files
* Add a reference to the GPLv2 license as recommended by the lawyers
at Oracle Legal
[Step 5/28]
------------------------------------------------------------------------
r4206 | vasil | 2009-02-17 11:02:27 +0200 (Tue, 17 Feb 2009) | 8 lines
branches/zip:
* Remove old Innobase copyright lines from C source files
* Add a reference to the GPLv2 license as recommended by the lawyers
at Oracle Legal
[Step 6/28]
------------------------------------------------------------------------
r4207 | vasil | 2009-02-17 11:04:28 +0200 (Tue, 17 Feb 2009) | 8 lines
branches/zip:
* Remove old Innobase copyright lines from C source files
* Add a reference to the GPLv2 license as recommended by the lawyers
at Oracle Legal
[Step 7/28]
------------------------------------------------------------------------
r4208 | vasil | 2009-02-17 11:06:49 +0200 (Tue, 17 Feb 2009) | 8 lines
branches/zip:
* Remove old Innobase copyright lines from C source files
* Add a reference to the GPLv2 license as recommended by the lawyers
at Oracle Legal
[Step 8/28]
------------------------------------------------------------------------
r4209 | vasil | 2009-02-17 11:10:18 +0200 (Tue, 17 Feb 2009) | 8 lines
branches/zip:
* Remove old Innobase copyright lines from C source files
* Add a reference to the GPLv2 license as recommended by the lawyers
at Oracle Legal
[Step 9/28]
------------------------------------------------------------------------
r4210 | vasil | 2009-02-17 11:12:41 +0200 (Tue, 17 Feb 2009) | 8 lines
branches/zip:
* Remove old Innobase copyright lines from C source files
* Add a reference to the GPLv2 license as recommended by the lawyers
at Oracle Legal
[Step 10/28]
------------------------------------------------------------------------
r4211 | vasil | 2009-02-17 11:14:40 +0200 (Tue, 17 Feb 2009) | 8 lines
branches/zip:
* Remove old Innobase copyright lines from C source files
* Add a reference to the GPLv2 license as recommended by the lawyers
at Oracle Legal
[Step 11/28]
------------------------------------------------------------------------
r4212 | vasil | 2009-02-17 11:18:35 +0200 (Tue, 17 Feb 2009) | 8 lines
branches/zip:
* Remove old Innobase copyright lines from C source files
* Add a reference to the GPLv2 license as recommended by the lawyers
at Oracle Legal
[Step 12/28]
------------------------------------------------------------------------
r4213 | vasil | 2009-02-17 11:24:40 +0200 (Tue, 17 Feb 2009) | 8 lines
branches/zip:
* Remove old Innobase copyright lines from C source files
* Add a reference to the GPLv2 license as recommended by the lawyers
at Oracle Legal
[Step 13/28]
------------------------------------------------------------------------
r4214 | vasil | 2009-02-17 11:27:31 +0200 (Tue, 17 Feb 2009) | 8 lines
branches/zip:
* Remove old Innobase copyright lines from C source files
* Add a reference to the GPLv2 license as recommended by the lawyers
at Oracle Legal
[Step 13/28]
------------------------------------------------------------------------
r4215 | vasil | 2009-02-17 11:29:55 +0200 (Tue, 17 Feb 2009) | 8 lines
branches/zip:
* Remove old Innobase copyright lines from C source files
* Add a reference to the GPLv2 license as recommended by the lawyers
at Oracle Legal
[Step 15/28]
------------------------------------------------------------------------
r4216 | vasil | 2009-02-17 11:33:38 +0200 (Tue, 17 Feb 2009) | 8 lines
branches/zip:
* Remove old Innobase copyright lines from C source files
* Add a reference to the GPLv2 license as recommended by the lawyers
at Oracle Legal
[Step 16/28]
------------------------------------------------------------------------
r4217 | vasil | 2009-02-17 11:36:44 +0200 (Tue, 17 Feb 2009) | 8 lines
branches/zip:
* Remove old Innobase copyright lines from C source files
* Add a reference to the GPLv2 license as recommended by the lawyers
at Oracle Legal
[Step 17/28]
------------------------------------------------------------------------
r4218 | vasil | 2009-02-17 11:39:11 +0200 (Tue, 17 Feb 2009) | 8 lines
branches/zip:
* Remove old Innobase copyright lines from C source files
* Add a reference to the GPLv2 license as recommended by the lawyers
at Oracle Legal
[Step 18/28]
------------------------------------------------------------------------
r4219 | vasil | 2009-02-17 11:41:24 +0200 (Tue, 17 Feb 2009) | 8 lines
branches/zip:
* Remove old Innobase copyright lines from C source files
* Add a reference to the GPLv2 license as recommended by the lawyers
at Oracle Legal
[Step 19/28]
------------------------------------------------------------------------
r4220 | vasil | 2009-02-17 11:43:50 +0200 (Tue, 17 Feb 2009) | 8 lines
branches/zip:
* Remove old Innobase copyright lines from C source files
* Add a reference to the GPLv2 license as recommended by the lawyers
at Oracle Legal
[Step 20/28]
------------------------------------------------------------------------
r4221 | vasil | 2009-02-17 11:46:52 +0200 (Tue, 17 Feb 2009) | 8 lines
branches/zip:
* Remove old Innobase copyright lines from C source files
* Add a reference to the GPLv2 license as recommended by the lawyers
at Oracle Legal
[Step 21/28]
------------------------------------------------------------------------
r4222 | vasil | 2009-02-17 11:50:12 +0200 (Tue, 17 Feb 2009) | 8 lines
branches/zip:
* Remove old Innobase copyright lines from C source files
* Add a reference to the GPLv2 license as recommended by the lawyers
at Oracle Legal
[Step 22/28]
------------------------------------------------------------------------
r4223 | vasil | 2009-02-17 11:53:58 +0200 (Tue, 17 Feb 2009) | 8 lines
branches/zip:
* Remove old Innobase copyright lines from C source files
* Add a reference to the GPLv2 license as recommended by the lawyers
at Oracle Legal
[Step 23/28]
------------------------------------------------------------------------
r4224 | vasil | 2009-02-17 12:01:41 +0200 (Tue, 17 Feb 2009) | 8 lines
branches/zip:
* Remove old Innobase copyright lines from C source files
* Add a reference to the GPLv2 license as recommended by the lawyers
at Oracle Legal
[Step 24/28]
------------------------------------------------------------------------
r4225 | vasil | 2009-02-17 12:05:45 +0200 (Tue, 17 Feb 2009) | 8 lines
branches/zip:
* Remove old Innobase copyright lines from C source files
* Add a reference to the GPLv2 license as recommended by the lawyers
at Oracle Legal
[Step 25/28]
------------------------------------------------------------------------
r4226 | vasil | 2009-02-17 12:09:16 +0200 (Tue, 17 Feb 2009) | 8 lines
branches/zip:
* Remove old Innobase copyright lines from C source files
* Add a reference to the GPLv2 license as recommended by the lawyers
at Oracle Legal
[Step 26/28]
------------------------------------------------------------------------
r4227 | vasil | 2009-02-17 12:12:56 +0200 (Tue, 17 Feb 2009) | 8 lines
branches/zip:
* Remove old Innobase copyright lines from C source files
* Add a reference to the GPLv2 license as recommended by the lawyers
at Oracle Legal
[Step 27/28]
------------------------------------------------------------------------
r4228 | vasil | 2009-02-17 12:14:04 +0200 (Tue, 17 Feb 2009) | 8 lines
branches/zip:
* Remove old Innobase copyright lines from C source files
* Add a reference to the GPLv2 license as recommended by the lawyers
at Oracle Legal
[Step 28/28]
------------------------------------------------------------------------
r4229 | vasil | 2009-02-17 12:30:55 +0200 (Tue, 17 Feb 2009) | 4 lines
branches/zip:
Add the copyright notice to the non C files.
------------------------------------------------------------------------
r4231 | marko | 2009-02-17 14:26:53 +0200 (Tue, 17 Feb 2009) | 12 lines
Minor cleanup of the Google SMP patch.
sync_array_object_signalled(): Add a (void) cast to eliminate a gcc warning
about the return value of os_atomic_increment() being ignored.
rw_lock_create_func(): Properly indent the preprocessor directives.
rw_lock_x_lock_low(), rw_lock_x_lock_func_nowait(): Split lines correctly.
rw_lock_set_writer_id_and_recursion_flag(): Silence a Valgrind warning.
Do not mix statements and variable declarations.
------------------------------------------------------------------------
r4232 | marko | 2009-02-17 14:59:54 +0200 (Tue, 17 Feb 2009) | 3 lines
branches/zip: When assigning lock->recursive = FALSE, also flag
lock->writer_thread invalid, so that Valgrind will catch more errors.
This is related to Issue #175.
------------------------------------------------------------------------
r4242 | marko | 2009-02-18 17:01:09 +0200 (Wed, 18 Feb 2009) | 2 lines
branches/zip: UT_DBG_STOP: Use do{} while(0) to silence a g++-4.3.2 warning
about a while(0); statement. This should fix (part of) Issue #176.
------------------------------------------------------------------------
r4243 | marko | 2009-02-18 17:04:03 +0200 (Wed, 18 Feb 2009) | 3 lines
branches/zip: buf_buddy_get_slot(): Fix a gcc 4.3.2 warning
about an empty body of a "for" statement.
This fixes part of Issue #176.
------------------------------------------------------------------------
r4244 | marko | 2009-02-18 17:25:45 +0200 (Wed, 18 Feb 2009) | 11 lines
branches/zip: Protect ut_total_allocated_memory with ut_list_mutex.
Unprotected updates to ut_total_allocated_memory in
os_mem_alloc_large() and os_mem_free_large(), called during
fast index creation, may corrupt the variable and cause assertion failures.
Also, add UNIV_MEM_ALLOC() and UNIV_MEM_FREE() instrumentation around
os_mem_alloc_large() and os_mem_free_large(), so that Valgrind can
detect more errors.
rb://90 approved by Heikki Tuuri. This addresses Issue #177.
------------------------------------------------------------------------
r4248 | marko | 2009-02-19 11:52:39 +0200 (Thu, 19 Feb 2009) | 2 lines
branches/zip: page_zip_set_size(): Fix a g++ 4.3.2 warning
about an empty body in a "for" statement. This closes Issue #176.
------------------------------------------------------------------------
r4251 | inaam | 2009-02-19 15:46:27 +0200 (Thu, 19 Feb 2009) | 8 lines
branches/zip: Issue #178 rb://91
Change plug.in to have same CXXFLAGS as CFLAGS. This is to ensure that
both .c and .cc files get compiled with same flags. To fix the issue
where UNIV_LINUX was defined only in .c files.
Approved by: Marko
------------------------------------------------------------------------
r4258 | vasil | 2009-02-20 11:52:19 +0200 (Fri, 20 Feb 2009) | 7 lines
branches/zip:
Cleanup in ChangeLog:
* Wrap lines at 78 characters
* Changed files are listed alphabetically
* White-space cleanup
------------------------------------------------------------------------
r4259 | vasil | 2009-02-20 11:59:42 +0200 (Fri, 20 Feb 2009) | 6 lines
branches/zip:
ChangeLog: Remove include/os0sync.ic from the entry about the google patch,
this file was modified later to not include Google's code.
------------------------------------------------------------------------
r4262 | vasil | 2009-02-20 14:56:59 +0200 (Fri, 20 Feb 2009) | 373 lines
branches/zip:
Merge revisions 4035:4261 from branches/5.1:
------------------------------------------------------------------------
r4065 | sunny | 2009-01-29 16:01:36 +0200 (Thu, 29 Jan 2009) | 8 lines
Changed paths:
M /branches/5.1/handler/ha_innodb.cc
M /branches/5.1/mysql-test/innodb-autoinc.result
M /branches/5.1/mysql-test/innodb-autoinc.test
branches/5.1: In the last round of AUTOINC cleanup we assumed that AUTOINC
is only defined for integer columns. This caused an assertion failure when
we checked for the maximum value of a column type. We now calculate the
max value for floating-point autoinc columns too.
Fix Bug#42400 - InnoDB autoinc code can't handle floating-point columns
rb://84 and Mantis issue://162
------------------------------------------------------------------------
r4111 | sunny | 2009-02-03 22:06:52 +0200 (Tue, 03 Feb 2009) | 2 lines
Changed paths:
M /branches/5.1/handler/ha_innodb.cc
branches/5.1: Add the ULL suffix otherwise there is an overflow.
------------------------------------------------------------------------
r4128 | vasil | 2009-02-08 21:36:45 +0200 (Sun, 08 Feb 2009) | 18 lines
Changed paths:
M /branches/5.1/mysql-test/innodb-autoinc.result
M /branches/5.1/mysql-test/innodb-autoinc.test
branches/5.1:
Merge a change from MySQL:
------------------------------------------------------------
revno: 2709.20.31
committer: Timothy Smith <timothy.smith@sun.com>
branch nick: 51
timestamp: Fri 2008-12-19 01:28:51 +0100
message:
Disable part of innodb-autoinc.test, because the MySQL server asserts when
compiled --with-debug, due to bug 39828, "autoinc wraps around when offset and
increment > 1". This change should be reverted when that bug is fixed (and a
a few other minor changes to the test as described in comments).
modified:
mysql-test/r/innodb-autoinc.result
mysql-test/t/innodb-autoinc.test
------------------------------------------------------------------------
r4129 | vasil | 2009-02-08 21:54:25 +0200 (Sun, 08 Feb 2009) | 310 lines
Changed paths:
M /branches/5.1/mysql-test/innodb-autoinc.test
branches/5.1:
Merge a change from MySQL:
[looks like the changes to innodb-autoinc.test were made as part of
the following huge merge, but we are merging only changes to that file]
------------------------------------------------------------
revno: 2546.47.1
committer: Luis Soares <luis.soares@sun.com>
branch nick: 5.1-rpl
timestamp: Fri 2009-01-23 13:22:05 +0100
message:
merge: 5.1 -> 5.1-rpl
conflicts:
Text conflict in client/mysqltest.cc
Text conflict in mysql-test/include/wait_until_connected_again.inc
Text conflict in mysql-test/lib/mtr_report.pm
Text conflict in mysql-test/mysql-test-run.pl
Text conflict in mysql-test/r/events_bugs.result
Text conflict in mysql-test/r/log_state.result
Text conflict in mysql-test/r/myisam_data_pointer_size_func.result
Text conflict in mysql-test/r/mysqlcheck.result
Text conflict in mysql-test/r/query_cache.result
Text conflict in mysql-test/r/status.result
Text conflict in mysql-test/suite/binlog/r/binlog_index.result
Text conflict in mysql-test/suite/binlog/r/binlog_innodb.result
Text conflict in mysql-test/suite/rpl/r/rpl_packet.result
Text conflict in mysql-test/suite/rpl/t/rpl_packet.test
Text conflict in mysql-test/t/disabled.def
Text conflict in mysql-test/t/events_bugs.test
Text conflict in mysql-test/t/log_state.test
Text conflict in mysql-test/t/myisam_data_pointer_size_func.test
Text conflict in mysql-test/t/mysqlcheck.test
Text conflict in mysql-test/t/query_cache.test
Text conflict in mysql-test/t/rpl_init_slave_func.test
Text conflict in mysql-test/t/status.test
removed:
mysql-test/suite/parts/r/partition_bit_ndb.result
mysql-test/suite/parts/t/partition_bit_ndb.test
mysql-test/suite/parts/t/partition_sessions.test
mysql-test/suite/sys_vars/inc/tmp_table_size_basic.inc
mysql-test/suite/sys_vars/r/tmp_table_size_basic_32.result
mysql-test/suite/sys_vars/r/tmp_table_size_basic_64.result
mysql-test/suite/sys_vars/t/tmp_table_size_basic_32.test
mysql-test/suite/sys_vars/t/tmp_table_size_basic_64.test
mysql-test/t/log_bin_trust_function_creators_func-master.opt
mysql-test/t/rpl_init_slave_func-slave.opt
added:
mysql-test/include/check_events_off.inc
mysql-test/include/cleanup_fake_relay_log.inc
mysql-test/include/have_simple_parser.inc
mysql-test/include/no_running_event_scheduler.inc
mysql-test/include/no_running_events.inc
mysql-test/include/running_event_scheduler.inc
mysql-test/include/setup_fake_relay_log.inc
mysql-test/include/wait_condition_sp.inc
mysql-test/r/fulltext_plugin.result
mysql-test/r/have_simple_parser.require
mysql-test/r/innodb_bug38231.result
mysql-test/r/innodb_bug39438.result
mysql-test/r/innodb_mysql_rbk.result
mysql-test/r/partition_innodb_semi_consistent.result
mysql-test/r/query_cache_28249.result
mysql-test/r/status2.result
mysql-test/std_data/bug40482-bin.000001
mysql-test/suite/binlog/r/binlog_innodb_row.result
mysql-test/suite/binlog/t/binlog_innodb_row.test
mysql-test/suite/rpl/r/rpl_binlog_corruption.result
mysql-test/suite/rpl/t/rpl_binlog_corruption-master.opt
mysql-test/suite/rpl/t/rpl_binlog_corruption.test
mysql-test/suite/sys_vars/r/tmp_table_size_basic.result
mysql-test/suite/sys_vars/t/tmp_table_size_basic.test
mysql-test/t/fulltext_plugin-master.opt
mysql-test/t/fulltext_plugin.test
mysql-test/t/innodb_bug38231.test
mysql-test/t/innodb_bug39438-master.opt
mysql-test/t/innodb_bug39438.test
mysql-test/t/innodb_mysql_rbk-master.opt
mysql-test/t/innodb_mysql_rbk.test
mysql-test/t/partition_innodb_semi_consistent-master.opt
mysql-test/t/partition_innodb_semi_consistent.test
mysql-test/t/query_cache_28249.test
mysql-test/t/status2.test
renamed:
mysql-test/suite/funcs_1/r/is_collation_character_set_applicability.result => mysql-test/suite/funcs_1/r/is_coll_char_set_appl.result
mysql-test/suite/funcs_1/t/is_collation_character_set_applicability.test => mysql-test/suite/funcs_1/t/is_coll_char_set_appl.test
modified:
.bzr-mysql/default.conf
CMakeLists.txt
client/mysql.cc
client/mysql_upgrade.c
client/mysqlcheck.c
client/mysqltest.cc
configure.in
extra/resolve_stack_dump.c
extra/yassl/include/openssl/ssl.h
include/config-win.h
include/m_ctype.h
include/my_global.h
mysql-test/extra/binlog_tests/database.test
mysql-test/extra/rpl_tests/rpl_auto_increment.test
mysql-test/include/commit.inc
mysql-test/include/have_32bit.inc
mysql-test/include/have_64bit.inc
mysql-test/include/index_merge1.inc
mysql-test/include/linux_sys_vars.inc
mysql-test/include/windows_sys_vars.inc
mysql-test/lib/mtr_report.pm
mysql-test/mysql-test-run.pl
mysql-test/r/alter_table.result
mysql-test/r/commit_1innodb.result
mysql-test/r/create.result
mysql-test/r/csv.result
mysql-test/r/ctype_ucs.result
mysql-test/r/date_formats.result
mysql-test/r/events_bugs.result
mysql-test/r/events_scheduling.result
mysql-test/r/fulltext.result
mysql-test/r/func_if.result
mysql-test/r/func_in.result
mysql-test/r/func_str.result
mysql-test/r/func_time.result
mysql-test/r/grant.result
mysql-test/r/index_merge_myisam.result
mysql-test/r/information_schema.result
mysql-test/r/innodb-autoinc.result
mysql-test/r/innodb.result
mysql-test/r/innodb_mysql.result
mysql-test/r/log_bin_trust_function_creators_func.result
mysql-test/r/log_state.result
mysql-test/r/myisampack.result
mysql-test/r/mysql.result
mysql-test/r/mysqlcheck.result
mysql-test/r/partition_datatype.result
mysql-test/r/partition_mgm.result
mysql-test/r/partition_pruning.result
mysql-test/r/query_cache.result
mysql-test/r/read_buffer_size_basic.result
mysql-test/r/read_rnd_buffer_size_basic.result
mysql-test/r/rpl_init_slave_func.result
mysql-test/r/select.result
mysql-test/r/status.result
mysql-test/r/strict.result
mysql-test/r/temp_table.result
mysql-test/r/type_bit.result
mysql-test/r/type_date.result
mysql-test/r/type_float.result
mysql-test/r/warnings_engine_disabled.result
mysql-test/r/xml.result
mysql-test/suite/binlog/r/binlog_database.result
mysql-test/suite/binlog/r/binlog_index.result
mysql-test/suite/binlog/r/binlog_innodb.result
mysql-test/suite/binlog/r/binlog_row_mix_innodb_myisam.result
mysql-test/suite/binlog/t/binlog_innodb.test
mysql-test/suite/funcs_1/r/is_columns_is.result
mysql-test/suite/funcs_1/r/is_engines.result
mysql-test/suite/funcs_1/r/storedproc.result
mysql-test/suite/funcs_1/storedproc/param_check.inc
mysql-test/suite/funcs_2/t/disabled.def
mysql-test/suite/ndb/t/disabled.def
mysql-test/suite/parts/r/partition_bit_innodb.result
mysql-test/suite/parts/r/partition_bit_myisam.result
mysql-test/suite/parts/r/partition_special_innodb.result
mysql-test/suite/parts/t/disabled.def
mysql-test/suite/parts/t/partition_special_innodb.test
mysql-test/suite/parts/t/partition_value_innodb.test
mysql-test/suite/parts/t/partition_value_myisam.test
mysql-test/suite/parts/t/partition_value_ndb.test
mysql-test/suite/rpl/r/rpl_auto_increment.result
mysql-test/suite/rpl/r/rpl_packet.result
mysql-test/suite/rpl/r/rpl_row_create_table.result
mysql-test/suite/rpl/r/rpl_slave_skip.result
mysql-test/suite/rpl/r/rpl_trigger.result
mysql-test/suite/rpl/t/disabled.def
mysql-test/suite/rpl/t/rpl_packet.test
mysql-test/suite/rpl/t/rpl_row_create_table.test
mysql-test/suite/rpl/t/rpl_slave_skip.test
mysql-test/suite/rpl/t/rpl_trigger.test
mysql-test/suite/rpl_ndb/t/disabled.def
mysql-test/suite/sys_vars/inc/key_buffer_size_basic.inc
mysql-test/suite/sys_vars/inc/sort_buffer_size_basic.inc
mysql-test/suite/sys_vars/r/key_buffer_size_basic_32.result
mysql-test/suite/sys_vars/r/key_buffer_size_basic_64.result
mysql-test/suite/sys_vars/r/sort_buffer_size_basic_32.result
mysql-test/suite/sys_vars/r/sort_buffer_size_basic_64.result
mysql-test/t/alter_table.test
mysql-test/t/create.test
mysql-test/t/csv.test
mysql-test/t/ctype_ucs.test
mysql-test/t/date_formats.test
mysql-test/t/disabled.def
mysql-test/t/events_bugs.test
mysql-test/t/events_scheduling.test
mysql-test/t/fulltext.test
mysql-test/t/func_if.test
mysql-test/t/func_in.test
mysql-test/t/func_str.test
mysql-test/t/func_time.test
mysql-test/t/grant.test
mysql-test/t/information_schema.test
mysql-test/t/innodb-autoinc.test
mysql-test/t/innodb.test
mysql-test/t/innodb_mysql.test
mysql-test/t/log_bin_trust_function_creators_func.test
mysql-test/t/log_state.test
mysql-test/t/myisam_data_pointer_size_func.test
mysql-test/t/myisampack.test
mysql-test/t/mysql.test
mysql-test/t/mysqlcheck.test
mysql-test/t/partition_innodb_stmt.test
mysql-test/t/partition_mgm.test
mysql-test/t/partition_pruning.test
mysql-test/t/query_cache.test
mysql-test/t/rpl_init_slave_func.test
mysql-test/t/select.test
mysql-test/t/status.test
mysql-test/t/strict.test
mysql-test/t/temp_table.test
mysql-test/t/type_bit.test
mysql-test/t/type_date.test
mysql-test/t/type_float.test
mysql-test/t/warnings_engine_disabled.test
mysql-test/t/xml.test
mysys/my_getopt.c
mysys/my_init.c
scripts/mysql_install_db.sh
sql-common/my_time.c
sql/field.cc
sql/field.h
sql/filesort.cc
sql/ha_partition.cc
sql/ha_partition.h
sql/item.cc
sql/item_cmpfunc.cc
sql/item_func.h
sql/item_strfunc.cc
sql/item_sum.cc
sql/item_timefunc.cc
sql/item_timefunc.h
sql/log.cc
sql/log.h
sql/log_event.cc
sql/log_event.h
sql/mysql_priv.h
sql/mysqld.cc
sql/opt_range.cc
sql/partition_info.cc
sql/repl_failsafe.cc
sql/rpl_constants.h
sql/set_var.cc
sql/slave.cc
sql/spatial.h
sql/sql_acl.cc
sql/sql_base.cc
sql/sql_binlog.cc
sql/sql_class.h
sql/sql_cursor.cc
sql/sql_delete.cc
sql/sql_lex.cc
sql/sql_lex.h
sql/sql_locale.cc
sql/sql_parse.cc
sql/sql_partition.cc
sql/sql_plugin.cc
sql/sql_plugin.h
sql/sql_profile.cc
sql/sql_repl.cc
sql/sql_select.cc
sql/sql_select.h
sql/sql_show.cc
sql/sql_table.cc
sql/sql_trigger.cc
sql/sql_trigger.h
sql/table.cc
sql/table.h
sql/unireg.cc
storage/csv/ha_tina.cc
storage/federated/ha_federated.cc
storage/heap/ha_heap.cc
storage/innobase/Makefile.am
storage/innobase/btr/btr0sea.c
storage/innobase/buf/buf0lru.c
storage/innobase/dict/dict0dict.c
storage/innobase/dict/dict0mem.c
storage/innobase/handler/ha_innodb.cc
storage/innobase/handler/ha_innodb.h
storage/innobase/include/btr0sea.h
storage/innobase/include/dict0dict.h
storage/innobase/include/dict0mem.h
storage/innobase/include/ha_prototypes.h
storage/innobase/include/lock0lock.h
storage/innobase/include/row0mysql.h
storage/innobase/include/sync0sync.ic
storage/innobase/include/ut0ut.h
storage/innobase/lock/lock0lock.c
storage/innobase/os/os0file.c
storage/innobase/plug.in
storage/innobase/row/row0mysql.c
storage/innobase/row/row0sel.c
storage/innobase/srv/srv0srv.c
storage/innobase/srv/srv0start.c
storage/innobase/ut/ut0ut.c
storage/myisam/ft_boolean_search.c
strings/ctype.c
strings/xml.c
tests/mysql_client_test.c
win/configure.js
mysql-test/suite/funcs_1/t/is_coll_char_set_appl.test
------------------------------------------------------------------------
r4165 | calvin | 2009-02-12 01:34:27 +0200 (Thu, 12 Feb 2009) | 1 line
Changed paths:
M /branches/5.1/handler/ha_innodb.cc
branches/5.1: minor non-functional changes.
------------------------------------------------------------------------
------------------------------------------------------------------------
r4263 | vasil | 2009-02-20 15:00:46 +0200 (Fri, 20 Feb 2009) | 4 lines
branches/zip:
Add a ChangeLog entry for a change in r4262.
------------------------------------------------------------------------
r4265 | marko | 2009-02-20 22:31:03 +0200 (Fri, 20 Feb 2009) | 5 lines
branches/zip: Make innodb_use_sys_malloc=ON the default.
Replace srv_use_sys_malloc with UNIV_LIKELY(srv_use_sys_malloc)
to improve branch prediction in the default case.
Approved by Ken over the IM.
------------------------------------------------------------------------
r4266 | vasil | 2009-02-20 23:29:32 +0200 (Fri, 20 Feb 2009) | 7 lines
branches/zip:
Add a sentence at the top of COPYING.Google to clarify that this license
does not apply to the whole InnoDB.
Suggested by: Ken
------------------------------------------------------------------------
r4268 | marko | 2009-02-23 12:43:51 +0200 (Mon, 23 Feb 2009) | 9 lines
branches/zip: Initialize ut_list_mutex at startup. Without this fix,
ut_list_mutex would be used uninitialized when innodb_use_sys_malloc=1.
This fix addresses Issue #181.
ut_mem_block_list_init(): Rename to ut_mem_init() and make public.
ut_malloc_low(), ut_free_all_mem(): Add ut_a(ut_mem_block_list_inited).
mem_init(): Call ut_mem_init().
------------------------------------------------------------------------
r4269 | marko | 2009-02-23 15:09:49 +0200 (Mon, 23 Feb 2009) | 7 lines
branches/zip: When freeing an uncompressed BLOB page, tolerate garbage in
FIL_PAGE_TYPE. (Bug #43043, Issue #182)
btr_check_blob_fil_page_type(): New function.
btr_free_externally_stored_field(), btr_copy_blob_prefix():
Call btr_check_blob_fil_page_type() to check FIL_PAGE_TYPE.
------------------------------------------------------------------------
r4272 | marko | 2009-02-23 23:10:18 +0200 (Mon, 23 Feb 2009) | 8 lines
branches/zip: Adjust the fix of Issue #182 in r4269 per Inaam's suggestion.
btr_check_blob_fil_page_type(): Replace the parameter
const char* op
with
ibool read. Do not print anything about page type mismatch
when reading a BLOB page in Antelope format.
Print space id before page number.
------------------------------------------------------------------------
r4273 | marko | 2009-02-24 00:11:11 +0200 (Tue, 24 Feb 2009) | 1 line
branches/zip: ut_mem_init(): Add the assertion !ut_mem_block_list_inited.
------------------------------------------------------------------------
r4274 | marko | 2009-02-24 00:14:38 +0200 (Tue, 24 Feb 2009) | 12 lines
branches/zip: Fix bugs in the fix of Issue #181. Tested inside and
outside Valgrind, with innodb_use_sys_malloc set to 0 and 1.
mem_init(): Invoke ut_mem_init() before mem_pool_create(), because
the latter one will invoke ut_malloc().
srv_general_init(): Do not initialize the memory subsystem (mem_init()).
innobase_init(): Initialize the memory subsystem (mem_init()) before
calling srv_parse_data_file_paths_and_sizes(), which needs ut_malloc().
Call ut_free_all_mem() in error handling to clean up after the mem_init().
------------------------------------------------------------------------
r4280 | marko | 2009-02-24 15:14:59 +0200 (Tue, 24 Feb 2009) | 1 line
branches/zip: Remove unused function os_mem_alloc_nocache().
------------------------------------------------------------------------
r4281 | marko | 2009-02-24 16:02:48 +0200 (Tue, 24 Feb 2009) | 1 line
branches/zip: Remove the unused function dict_index_get_type().
------------------------------------------------------------------------
r4283 | marko | 2009-02-24 23:06:56 +0200 (Tue, 24 Feb 2009) | 1 line
branches/zip: srv0start.c: Remove unnecessary #include "mem0pool.h".
------------------------------------------------------------------------
r4284 | marko | 2009-02-24 23:26:38 +0200 (Tue, 24 Feb 2009) | 1 line
branches/zip: mem0mem.c: Remove unnecessary #include "mach0data.h".
------------------------------------------------------------------------
r4288 | vasil | 2009-02-25 10:48:07 +0200 (Wed, 25 Feb 2009) | 21 lines
branches/zip: Merge revisions 4261:4287 from branches/5.1:
------------------------------------------------------------------------
r4287 | sunny | 2009-02-25 05:32:01 +0200 (Wed, 25 Feb 2009) | 10 lines
Changed paths:
M /branches/5.1/handler/ha_innodb.cc
M /branches/5.1/mysql-test/innodb-autoinc.result
M /branches/5.1/mysql-test/innodb-autoinc.test
branches/5.1: Fix Bug#42714 AUTO_INCREMENT errors in 5.1.31. There are two
changes to the autoinc handling.
1. To fix the immediate problem from the bug report, we must ensure that the
value written to the table is always less than the max value stored in
dict_table_t.
2. The second related change is that according to MySQL documentation when
the offset is greater than the increment, we should ignore the offset.
------------------------------------------------------------------------
------------------------------------------------------------------------
r4289 | vasil | 2009-02-25 10:53:51 +0200 (Wed, 25 Feb 2009) | 4 lines
branches/zip:
Add ChangeLog entry for the fix in r4288.
------------------------------------------------------------------------
r4290 | vasil | 2009-02-25 11:05:44 +0200 (Wed, 25 Feb 2009) | 11 lines
branches/zip:
Make ChangeLog entries for bugs in bugs.mysql.com in the form:
Fix Bug#12345 bug title
(for bugs after 1.0.2 was released and the ChangeLog published)
There is no need to bloat the ChangeLog with information that is available
via bugs.mysql.com.
Discussed with: Marko
------------------------------------------------------------------------
r4291 | vasil | 2009-02-25 11:08:32 +0200 (Wed, 25 Feb 2009) | 4 lines
branches/zip:
Fix Bug synopsis and remove explanation
------------------------------------------------------------------------
r4292 | marko | 2009-02-25 12:09:15 +0200 (Wed, 25 Feb 2009) | 25 lines
branches/zip: Correct the initialization of the memory subsystem once
again, to finally put Issue #181 to rest.
Revert some parts of r4274. It is best not to call ut_malloc() before
srv_general_init().
mem_init(): Do not call ut_mem_init().
srv_general_init(): Initialize the memory subsystem in two phases:
first ut_mem_init(), then mem_init(). This is because os_sync_init()
and sync_init() depend on ut_mem_init() and mem_init() depends on
os_sync_init() or sync_init().
srv_parse_data_file_paths_and_sizes(),
srv_parse_log_group_home_dirs(): Remove the output parameters. Assign
to the global variables directly. Allocate memory with malloc()
instead of ut_malloc(), because these functions will be called before
srv_general_init().
srv_free_paths_and_sizes(): New function, for cleaning up after
srv_parse_data_file_paths_and_sizes() and
srv_parse_log_group_home_dirs().
rb://92 approved by Sunny Bains
------------------------------------------------------------------------
r4297 | vasil | 2009-02-25 17:19:19 +0200 (Wed, 25 Feb 2009) | 4 lines
branches/zip:
White-space cleanup in the ChangeLog
------------------------------------------------------------------------
r4301 | vasil | 2009-02-25 21:33:32 +0200 (Wed, 25 Feb 2009) | 5 lines
branches/zip:
Do not output the commands that restore the environment because they depend
on the state of the environment before the test starts executing.
------------------------------------------------------------------------
r4315 | vasil | 2009-02-26 09:21:20 +0200 (Thu, 26 Feb 2009) | 5 lines
branches/zip:
Apply any necessary patches to the mysql tree at the end of setup.sh
This step was previously done manually (and sometimes forgotten).
------------------------------------------------------------------------
r4319 | marko | 2009-02-26 23:27:51 +0200 (Thu, 26 Feb 2009) | 6 lines
branches/zip: btr_check_blob_fil_page_type(): Do not report
FIL_PAGE_TYPE mismatch even when purging a BLOB.
Heavy users may have large data files created with MySQL 5.0 or earlier,
and they don not want to have the error log flooded with such messages.
This fixes Issue #182.
------------------------------------------------------------------------
r4320 | inaam | 2009-02-27 02:13:19 +0200 (Fri, 27 Feb 2009) | 8 lines
branches/zip
This is to revert the changes made to the plug.in (r4251) as a fix for
issue# 178. Changes to plug.in will not propogate to a plugin
installation unless autotools are rerun which is unacceptable.
A fix for issue# 178 will be committed in a separate commit.
------------------------------------------------------------------------
r4321 | inaam | 2009-02-27 02:16:46 +0200 (Fri, 27 Feb 2009) | 6 lines
branches/zip
This is a fix for issue#178. Instead of using UNIV_LINUX which is
defined through CFLAGS we use compiler generated define __linux__
that is effective for both .c and .cc files.
------------------------------------------------------------------------
r4324 | vasil | 2009-02-27 13:27:18 +0200 (Fri, 27 Feb 2009) | 39 lines
branches/zip:
Add FreeBSD to the list of the operating systems that have
sizeof(pthread_t) == sizeof(void*) (i.e. word size).
On FreeBSD pthread_t is defined like:
/usr/include/sys/_pthreadtypes.h:
typedef struct pthread *pthread_t;
I did the following tests (per Inaam's recommendation):
a) appropriate version of GCC is available on that platform (4.1.2 or
higher for atomics to be available)
On FreeBSD 6.x the default compiler is 3.4.6, on FreeBSD 7.x the default
one is 4.2.1. One can always install the version of choice from the ports
collection. If gcc 3.x is used then HAVE_GCC_ATOMIC_BUILTINS will not be
defined and thus the change I am committing will make no difference.
b) find out if sizeof(pthread_t) == sizeof(long)
On 32 bit both are 4 bytes, on 64 bit both are 8 bytes.
c) find out the compiler generated platform define (e.g.: __aix, __sunos__
etc.)
The macro is __FreeBSD__.
d) patch univ.i with the appropriate platform define
e) build the mysql
f) ensure it is using atomic builtins (look at the err.log message at
system startup. It should say we are using atomics for both mutexes and
rw-locks)
g) do sanity testing (keeping in view the smp changes)
I ran the mysql-test suite. All tests pass.
------------------------------------------------------------------------
r4353 | vasil | 2009-03-05 09:27:29 +0200 (Thu, 05 Mar 2009) | 6 lines
branches/zip:
As suggested by Ken, print a message that says that the Google SMP patch
(GCC atomics) is disabled if it is. Also extend the message when the patch
is partially enabled to make it clear that it is partially enabled.
------------------------------------------------------------------------
r4356 | vasil | 2009-03-05 13:49:51 +0200 (Thu, 05 Mar 2009) | 4 lines
branches/zip:
Fix typo made in r4353.
------------------------------------------------------------------------
r4357 | vasil | 2009-03-05 16:38:59 +0200 (Thu, 05 Mar 2009) | 23 lines
branches/zip:
Implement a check whether pthread_t objects can be used by GCC atomic
builtin functions. This check is implemented in plug.in and defines the
macro HAVE_ATOMIC_PTHREAD_T. This macro is checked in univ.i and the
relevant part of the code enabled (the one that uses GCC atomics against
pthread_t objects).
In addition to this, the same program that is compiled as part of the
plug.in check is added in ut/ut0auxconf.c. In the InnoDB Plugin source
archives that are shipped to the users, a generated Makefile.in is added.
That Makefile.in will be modified to compile ut/ut0auxconf.c and define
the macro HAVE_ATOMIC_PTHREAD_T if the compilation succeeds. I.e.
Makefile.in will emulate the work that is done by plug.in. This is done in
order to make the check happen and HAVE_ATOMIC_PTHREAD_T eventually
defined without regenerating MySQL's ./configure from
./storage/innobase/plug.in. The point is not to ask users to install the
autotools and regenerate ./configure.
rb://95
Approved by: Marko
------------------------------------------------------------------------
r4360 | vasil | 2009-03-05 22:23:17 +0200 (Thu, 05 Mar 2009) | 21 lines
branches/zip: Merge revisions 4287:4357 from branches/5.1:
------------------------------------------------------------------------
r4325 | sunny | 2009-03-02 02:28:52 +0200 (Mon, 02 Mar 2009) | 10 lines
Changed paths:
M /branches/5.1/handler/ha_innodb.cc
M /branches/5.1/mysql-test/innodb-autoinc.result
M /branches/5.1/mysql-test/innodb-autoinc.test
branches/5.1: Bug#43203: Overflow from auto incrementing causes server segv
It was not a SIGSEGV but an assertion failure. The assertion was checking
the invariant that *first_value passed in by MySQL doesn't contain a value
that is greater than the max value for that type. The assertion has been
changed to a check and if the value is greater than the max we report a
generic AUTOINC failure.
rb://93
Approved by Heikki
------------------------------------------------------------------------
------------------------------------------------------------------------
r4361 | vasil | 2009-03-05 22:27:54 +0200 (Thu, 05 Mar 2009) | 30 lines
branches/zip: Merge revision 4358 from branches/5.1 (resolving a conflict):
------------------------------------------------------------------------
r4358 | vasil | 2009-03-05 21:21:10 +0200 (Thu, 05 Mar 2009) | 21 lines
Changed paths:
M /branches/5.1/handler/ha_innodb.cc
branches/5.1:
Merge a change from MySQL:
------------------------------------------------------------
revno: 2728.19.1
committer: Alfranio Correia <alfranio.correia@sun.com>
branch nick: mysql-5.1-bugteam
timestamp: Tue 2009-02-03 11:36:46 +0000
message:
BUG#42445 Warning messages in innobase/handler/ha_innodb.cc
There was a type casting problem in the storage/innobase/handler/ha_innodb.cc,
(int ha_innobase::write_row(...)). Innobase uses has an internal error variable
of type 'ulint' while mysql uses an 'int'.
To fix the problem the function manipulates an error variable of
type 'ulint' and only casts it into 'int' when needs to return the value.
modified:
storage/innobase/handler/ha_innodb.cc
------------------------------------------------------------------------
------------------------------------------------------------------------
r4362 | vasil | 2009-03-05 22:29:07 +0200 (Thu, 05 Mar 2009) | 23 lines
branches/zip: Merge revision 4359 from branches/5.1:
------------------------------------------------------------------------
r4359 | vasil | 2009-03-05 21:42:01 +0200 (Thu, 05 Mar 2009) | 14 lines
Changed paths:
M /branches/5.1/handler/ha_innodb.cc
branches/5.1:
Merge a change from MySQL:
------------------------------------------------------------
revno: 2747
committer: Timothy Smith <timothy.smith@sun.com>
branch nick: 51
timestamp: Fri 2009-01-16 17:49:07 +0100
message:
Add another cast to ignore int/ulong difference in error types, silence warning on Win64
modified:
storage/innobase/handler/ha_innodb.cc
------------------------------------------------------------------------
------------------------------------------------------------------------
r4363 | vasil | 2009-03-05 22:31:37 +0200 (Thu, 05 Mar 2009) | 4 lines
branches/zip:
Add ChangeLog entry for the bugfix in c4360.
------------------------------------------------------------------------
r4378 | calvin | 2009-03-09 10:10:17 +0200 (Mon, 09 Mar 2009) | 7 lines
branches/zip: remove compile flag MYSQL_SERVER for dynamic plugin
The dynamic plugin on Windows used to be built with MYSQL_SERVER
compile flag, while it is not the case for other platforms.
r3797 assumed MYSQL_SERVER was not defined for dynamic plugin,
which introduced the engine crash during dropping a database.
------------------------------------------------------------------------
r4396 | marko | 2009-03-12 09:22:27 +0200 (Thu, 12 Mar 2009) | 3 lines
branches/zip: btr_store_big_rec_extern_fields(): Initialize FIL_PAGE_TYPE
in a separate redo log entry. This will make ibbackup --apply-log
debugging easier.
------------------------------------------------------------------------
r4397 | marko | 2009-03-12 09:26:11 +0200 (Thu, 12 Mar 2009) | 3 lines
branches/zip: trx_sys_create_doublewrite_buf(): As the dummy change,
initialize FIL_PAGE_TYPE. This will make it easier to write the debug
assertions for ibbackup --apply-log.
------------------------------------------------------------------------
r4401 | marko | 2009-03-12 10:26:40 +0200 (Thu, 12 Mar 2009) | 19 lines
branches/zip: Merge revisions 4359:4400 from branches/5.1:
------------------------------------------------------------------------
r4399 | marko | 2009-03-12 09:38:05 +0200 (Thu, 12 Mar 2009) | 2 lines
branches/5.1: row_sel_get_clust_rec_for_mysql(): Store the cursor position
also for unlock_row(). (Bug #39320)
------------------------------------------------------------------------
r4400 | marko | 2009-03-12 10:06:44 +0200 (Thu, 12 Mar 2009) | 5 lines
branches/5.1: Fix a bug in multi-table semi-consistent reads.
Remember the acquired record locks per table handle (row_prebuilt_t)
rather than per transaction (trx_t), so that unlock_row should successfully
unlock all non-matching rows in multi-table operations.
This deficiency was found while investigating Bug #39320.
------------------------------------------------------------------------
These were submitted as rb://94 and rb://96 and approved by Heikki Tuuri.
------------------------------------------------------------------------
r4455 | marko | 2009-03-16 11:43:34 +0200 (Mon, 16 Mar 2009) | 2 lines
branches/zip: UT_LIST_VALIDATE(): Add the parameter ASSERTION and
adjust all callers.
------------------------------------------------------------------------
r4456 | marko | 2009-03-16 12:59:25 +0200 (Mon, 16 Mar 2009) | 6 lines
branches/zip: UT_LIST_VALIDATE(): Assert that the link is non-NULL
before dereferencing it. In this way, ut_list_node_313 will be
pointing to the last non-NULL list item at the time of the assertion
failure. (gcc-4.3.2 -O3 seems to optimize the common subexpressions
and make the variable NULL, though.)
------------------------------------------------------------------------
r4457 | marko | 2009-03-16 14:12:02 +0200 (Mon, 16 Mar 2009) | 2 lines
branches/zip: sync_thread_add_level(): Make the assertions about
level == SYNC_BUF_BLOCK more readable.
------------------------------------------------------------------------
r4461 | vasil | 2009-03-17 09:38:19 +0200 (Tue, 17 Mar 2009) | 6 lines
branches/zip:
Remove mysql-test/patches/bug32625.diff because that bug was fixed in
the mysql repository (1 year and 4 months after sending them the simple
patch!). See http://bugs.mysql.com/32625
------------------------------------------------------------------------
r4465 | marko | 2009-03-17 12:34:19 +0200 (Tue, 17 Mar 2009) | 1 line
branches/zip: buf0buddy.c: Add and adjust some debug assertions.
------------------------------------------------------------------------
r4473 | vasil | 2009-03-17 15:50:30 +0200 (Tue, 17 Mar 2009) | 5 lines
branches/zip:
Increment the InnoDB Plugin version from 1.0.3 to 1.0.4 now that
1.0.3 has been released.
------------------------------------------------------------------------
r4478 | vasil | 2009-03-18 11:53:53 +0200 (Wed, 18 Mar 2009) | 5 lines
branches/zip:
Remove mysql-test/patches/bug41893.diff because that bug has been fixed
in the MySQL repository, see http://bugs.mysql.com/41893.
------------------------------------------------------------------------
r4479 | marko | 2009-03-18 12:43:54 +0200 (Wed, 18 Mar 2009) | 2 lines
branches/zip: buf_LRU_block_remove_hashed_page(): Add some debug assertions.
------------------------------------------------------------------------
r4480 | marko | 2009-03-18 14:32:13 +0200 (Wed, 18 Mar 2009) | 1 line
branches/zip: buf_buddy_free_low(): Correct the function comment.
------------------------------------------------------------------------
r4482 | marko | 2009-03-19 15:23:32 +0200 (Thu, 19 Mar 2009) | 12 lines
branches/zip: Merge revisions 4400:4481 from branches/5.1:
------------------------------------------------------------------------
r4481 | marko | 2009-03-19 15:01:48 +0200 (Thu, 19 Mar 2009) | 6 lines
branches/5.1: row_unlock_for_mysql(): Do not unlock records that were
modified by the current transaction. This bug was introduced or unmasked
in r4400.
rb://97 approved by Heikki Tuuri
------------------------------------------------------------------------
------------------------------------------------------------------------
r4490 | marko | 2009-03-20 12:33:33 +0200 (Fri, 20 Mar 2009) | 4 lines
branches/zip: Non-functional change for reducing dependencies in InnoDB Hot Backup:
Replace srv_sys->dummy_ind1 and srv_sys->dummy_ind2 with
dict_ind_redundant and dict_ind_compact, initialized in dict_init().
------------------------------------------------------------------------
r4491 | marko | 2009-03-20 12:45:18 +0200 (Fri, 20 Mar 2009) | 2 lines
branches/zip: Add const qualifiers or in/out comments to some function
parameters in log0log.
------------------------------------------------------------------------
r4492 | marko | 2009-03-20 12:52:14 +0200 (Fri, 20 Mar 2009) | 5 lines
branches/zip: page_validate(): Always report the space id and the
name of the index.
In Hot Backup, do not invoke comparison functions, as MySQL collations
will be unavailable.
------------------------------------------------------------------------
r4493 | marko | 2009-03-20 13:24:06 +0200 (Fri, 20 Mar 2009) | 1 line
branches/zip: Replace fil_get_space_for_id_low() with fil_space_get_by_id().
------------------------------------------------------------------------
r4494 | marko | 2009-03-20 13:51:35 +0200 (Fri, 20 Mar 2009) | 3 lines
branches/zip: fil0fil.c: Refer to fil_system directly, not via local vars.
This eliminates some "unused variable" warnings when building
InnoDB Hot Backup in such a way that all mutex operations are no-ops.
------------------------------------------------------------------------
r4495 | marko | 2009-03-20 14:15:52 +0200 (Fri, 20 Mar 2009) | 1 line
branches/zip: innobase_get_at_most_n_mbchars(): Declare in ha_prototypes.h.
------------------------------------------------------------------------
r4496 | marko | 2009-03-20 14:48:26 +0200 (Fri, 20 Mar 2009) | 1 line
branches/zip: recv_recover_page(): Remove compile-time constant parameters.
------------------------------------------------------------------------
r4497 | marko | 2009-03-20 14:56:19 +0200 (Fri, 20 Mar 2009) | 1 line
branches/zip: recv_sys_init(): Remove a compile-time constant parameter.
------------------------------------------------------------------------
r4498 | marko | 2009-03-20 15:08:05 +0200 (Fri, 20 Mar 2009) | 4 lines
branches/zip: Non-functional change: Add const qualifiers.
log_block_checksum_is_ok_or_old_format(), recv_sys_add_to_parsing_buf():
The log block is read-only. Make it const.
------------------------------------------------------------------------
r4499 | marko | 2009-03-20 15:10:25 +0200 (Fri, 20 Mar 2009) | 1 line
branches/zip: recv_scan_log_recs(): Remove a compile-time constant parameter.
------------------------------------------------------------------------
r4500 | marko | 2009-03-20 15:47:17 +0200 (Fri, 20 Mar 2009) | 1 line
branches/zip: fil_init(): Add the parameter hash_size.
------------------------------------------------------------------------
r4501 | vasil | 2009-03-20 16:50:41 +0200 (Fri, 20 Mar 2009) | 4 lines
branches/zip:
Add any entry about the release of 1.0.3 in the ChangeLog.
------------------------------------------------------------------------
r4515 | marko | 2009-03-23 10:49:53 +0200 (Mon, 23 Mar 2009) | 1 line
branches/zip: hash_table_t: adaptive: Remove from UNIV_HOTBACKUP builds.
------------------------------------------------------------------------
r4516 | marko | 2009-03-23 10:57:16 +0200 (Mon, 23 Mar 2009) | 2 lines
branches/zip: Define and use ASSERT_HASH_MUTEX_OWN.
Make it a no-op in UNIV_HOTBACKUP builds.
------------------------------------------------------------------------
r4517 | marko | 2009-03-23 11:07:20 +0200 (Mon, 23 Mar 2009) | 2 lines
branches/zip: Define and use PAGE_ZIP_MATCH.
In UNIV_HOTBACKUP builds, assume fixed allocation.
------------------------------------------------------------------------
r4521 | marko | 2009-03-23 12:05:47 +0200 (Mon, 23 Mar 2009) | 1 line
branches/zip: buf_page_print(): Clean up the code #ifdef UNIV_HOTBACKUP.
------------------------------------------------------------------------
r4522 | marko | 2009-03-23 12:20:50 +0200 (Mon, 23 Mar 2009) | 2 lines
branches/zip: Exclude some operating system interface code
from UNIV_HOTBACKUP builds.
------------------------------------------------------------------------
r4523 | marko | 2009-03-23 13:00:43 +0200 (Mon, 23 Mar 2009) | 2 lines
branches/zip: Remove the remaining references to hash_table_t::adapive
from UNIV_HOTBACKUP builds. This should have been done in r4515.
------------------------------------------------------------------------
r4524 | marko | 2009-03-23 14:05:18 +0200 (Mon, 23 Mar 2009) | 2 lines
branches/zip: Enclose recv_recovery_from_backup_on and
recv_recovery_from_backup_is_on() in #ifdef UNIV_LOG_ARCHIVE.
------------------------------------------------------------------------
r4525 | marko | 2009-03-23 14:57:45 +0200 (Mon, 23 Mar 2009) | 2 lines
branches/zip: recv_parse_or_apply_log_rec_body(): Add debug assertions
ensuring that FIL_PAGE_TYPE makes sense when applying log records.
------------------------------------------------------------------------
r4526 | marko | 2009-03-23 16:21:34 +0200 (Mon, 23 Mar 2009) | 2 lines
branches/zip: Remove unneeded definitions and dependencies
from UNIV_HOTBACKUP builds.
------------------------------------------------------------------------
r4527 | calvin | 2009-03-23 23:15:33 +0200 (Mon, 23 Mar 2009) | 5 lines
branches/zip: adjust build files on Windows
Adjust the patch positions based on the latest MySQL source.
Also add the patches to the .bat files for vs9.
------------------------------------------------------------------------
2009-03-24 08:32:21 +00:00
|
|
|
/*****************************************************************************
|
|
|
|
|
|
|
|
Copyright (c) 1996, 2009, Innobase Oy. All Rights Reserved.
|
|
|
|
Copyright (c) 2008, Google Inc.
|
|
|
|
|
|
|
|
Portions of this file contain modifications contributed and copyrighted by
|
|
|
|
Google, Inc. Those modifications are gratefully acknowledged and are described
|
|
|
|
briefly in the InnoDB documentation. The contributions by Google are
|
|
|
|
incorporated with their permission, and subject to the conditions contained in
|
|
|
|
the file COPYING.Google.
|
|
|
|
|
|
|
|
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; version 2 of the License.
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
*****************************************************************************/
|
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
/************************************************************************
|
|
|
|
The index tree adaptive search
|
|
|
|
|
|
|
|
Created 2/17/1996 Heikki Tuuri
|
|
|
|
*************************************************************************/
|
|
|
|
|
|
|
|
#include "btr0sea.h"
|
|
|
|
#ifdef UNIV_NONINL
|
|
|
|
#include "btr0sea.ic"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include "buf0buf.h"
|
|
|
|
#include "page0page.h"
|
|
|
|
#include "page0cur.h"
|
|
|
|
#include "btr0cur.h"
|
|
|
|
#include "btr0pcur.h"
|
|
|
|
#include "btr0btr.h"
|
|
|
|
#include "ha0ha.h"
|
|
|
|
|
branches/innodb+: Merge revisions 4070:4072 from branches/zip:
------------------------------------------------------------------------
r4072 | marko | 2009-01-30 23:30:29 +0200 (Fri, 30 Jan 2009) | 32 lines
branches/zip: Make innodb_adaptive_hash_index settable.
btr_search_disabled: Rename to btr_search_enabled and change the type
to char, so that it can be directly linked to the MySQL parameters.
Note that the variable is protected by btr_search_latch and
btr_search_enabled_mutex, a new mutex introduced in this patch.
btr_search_enabled_mutex: A new mutex, to protect btr_search_enabled
together with btr_search_latch.
buf_pool_drop_hash_index(): New function, to be called from
btr_search_disable().
btr_search_disable(), btr_search_enable(): Fix bugs. These functions
were previously unused.
btr_search_guess_on_hash(), btr_search_build_page_hash_index():
Check btr_search_enabled once more, while holding btr_search_latch.
btr_cur_search_to_nth_level(): Note that the reads of btr_search_enabled
may be dirty and explain why it should not be a problem.
innobase_adaptive_hash_index: Remove. The variable btr_search_enabled will be used directly instead.
innodb_adaptive_hash_index_update(): New function, an update callback for
innodb_adaptive_hash_index. This will call either btr_search_disable()
or btr_search_enable() when the value is assigned. The functions will
be called even if the value does not appear to be changed, e.g., when
setting from TRUE to TRUE or FALSE to FALSE.
rb://85 approved by Heikki Tuuri. This addresses Issue #163.
------------------------------------------------------------------------
2009-01-30 21:45:02 +00:00
|
|
|
/* Flag: has the search system been enabled?
|
|
|
|
Protected by btr_search_latch and btr_search_enabled_mutex. */
|
|
|
|
UNIV_INTERN char btr_search_enabled = TRUE;
|
|
|
|
|
|
|
|
static mutex_t btr_search_enabled_mutex;
|
2006-11-21 14:40:14 +00:00
|
|
|
|
2008-02-06 14:17:36 +00:00
|
|
|
/* A dummy variable to fool the compiler */
|
|
|
|
UNIV_INTERN ulint btr_search_this_is_zero = 0;
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
#ifdef UNIV_SEARCH_PERF_STAT
|
2008-02-06 14:17:36 +00:00
|
|
|
UNIV_INTERN ulint btr_search_n_succ = 0;
|
|
|
|
UNIV_INTERN ulint btr_search_n_hash_fail = 0;
|
2006-04-12 09:32:17 +00:00
|
|
|
#endif /* UNIV_SEARCH_PERF_STAT */
|
2005-10-27 07:29:40 +00:00
|
|
|
|
2008-02-06 14:17:36 +00:00
|
|
|
/* padding to prevent other memory update
|
|
|
|
hotspots from residing on the same memory
|
|
|
|
cache line as btr_search_latch */
|
|
|
|
UNIV_INTERN byte btr_sea_pad1[64];
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
/* The latch protecting the adaptive search system: this latch protects the
|
|
|
|
(1) positions of records on those pages where a hash index has been built.
|
|
|
|
NOTE: It does not protect values of non-ordering fields within a record from
|
|
|
|
being updated in-place! We can use fact (1) to perform unique searches to
|
|
|
|
indexes. */
|
|
|
|
|
2008-02-06 14:17:36 +00:00
|
|
|
/* We will allocate the latch from dynamic memory to get it to the
|
|
|
|
same DRAM page as other hotspot semaphores */
|
|
|
|
UNIV_INTERN rw_lock_t* btr_search_latch_temp;
|
2005-10-27 07:29:40 +00:00
|
|
|
|
2008-02-06 14:17:36 +00:00
|
|
|
/* padding to prevent other memory update hotspots from residing on
|
|
|
|
the same memory cache line */
|
|
|
|
UNIV_INTERN byte btr_sea_pad2[64];
|
2005-10-27 07:29:40 +00:00
|
|
|
|
2008-02-06 14:17:36 +00:00
|
|
|
UNIV_INTERN btr_search_sys_t* btr_search_sys;
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
/* If the number of records on the page divided by this parameter
|
|
|
|
would have been successfully accessed using a hash index, the index
|
|
|
|
is then built on the page, assuming the global limit has been reached */
|
|
|
|
|
|
|
|
#define BTR_SEARCH_PAGE_BUILD_LIMIT 16
|
|
|
|
|
|
|
|
/* The global limit for consecutive potentially successful hash searches,
|
|
|
|
before hash index building is started */
|
|
|
|
|
|
|
|
#define BTR_SEARCH_BUILD_LIMIT 100
|
|
|
|
|
|
|
|
/************************************************************************
|
|
|
|
Builds a hash index on a page with the given parameters. If the page already
|
|
|
|
has a hash index with different parameters, the old hash index is removed.
|
|
|
|
If index is non-NULL, this function checks if n_fields and n_bytes are
|
|
|
|
sensible values, and does not build a hash index if not. */
|
|
|
|
static
|
|
|
|
void
|
|
|
|
btr_search_build_page_hash_index(
|
|
|
|
/*=============================*/
|
2009-05-25 06:46:10 +00:00
|
|
|
dict_index_t* index, /*!< in: index for which to build, or NULL if
|
2005-10-27 07:29:40 +00:00
|
|
|
not known */
|
2009-05-25 06:46:10 +00:00
|
|
|
buf_block_t* block, /*!< in: index page, s- or x-latched */
|
|
|
|
ulint n_fields,/*!< in: hash this many full fields */
|
|
|
|
ulint n_bytes,/*!< in: hash this many bytes from the next
|
2005-10-27 07:29:40 +00:00
|
|
|
field */
|
2009-05-25 06:46:10 +00:00
|
|
|
ibool left_side);/*!< in: hash for searches from left side? */
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
/*********************************************************************
|
|
|
|
This function should be called before reserving any btr search mutex, if
|
|
|
|
the intended operation might add nodes to the search system hash table.
|
|
|
|
Because of the latching order, once we have reserved the btr search system
|
|
|
|
latch, we cannot allocate a free frame from the buffer pool. Checks that
|
|
|
|
there is a free buffer frame allocated for hash table heap in the btr search
|
|
|
|
system. If not, allocates a free frames for the heap. This check makes it
|
|
|
|
probable that, when have reserved the btr search system latch and we need to
|
|
|
|
allocate a new node to the hash table, it will succeed. However, the check
|
|
|
|
will not guarantee success. */
|
|
|
|
static
|
|
|
|
void
|
|
|
|
btr_search_check_free_space_in_heap(void)
|
|
|
|
/*=====================================*/
|
|
|
|
{
|
|
|
|
hash_table_t* table;
|
|
|
|
mem_heap_t* heap;
|
|
|
|
|
|
|
|
#ifdef UNIV_SYNC_DEBUG
|
|
|
|
ut_ad(!rw_lock_own(&btr_search_latch, RW_LOCK_SHARED));
|
|
|
|
ut_ad(!rw_lock_own(&btr_search_latch, RW_LOCK_EX));
|
|
|
|
#endif /* UNIV_SYNC_DEBUG */
|
|
|
|
|
|
|
|
table = btr_search_sys->hash_index;
|
|
|
|
|
|
|
|
heap = table->heap;
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
/* Note that we peek the value of heap->free_block without reserving
|
|
|
|
the latch: this is ok, because we will not guarantee that there will
|
|
|
|
be enough free space in the hash table. */
|
|
|
|
|
|
|
|
if (heap->free_block == NULL) {
|
2006-10-12 12:38:29 +00:00
|
|
|
buf_block_t* block = buf_block_alloc(0);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
rw_lock_x_lock(&btr_search_latch);
|
|
|
|
|
|
|
|
if (heap->free_block == NULL) {
|
2006-10-12 12:38:29 +00:00
|
|
|
heap->free_block = block;
|
2005-10-27 07:29:40 +00:00
|
|
|
} else {
|
2006-10-12 12:38:29 +00:00
|
|
|
buf_block_free(block);
|
2005-10-27 07:29:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
rw_lock_x_unlock(&btr_search_latch);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************
|
|
|
|
Creates and initializes the adaptive search system at a database start. */
|
2008-02-06 14:17:36 +00:00
|
|
|
UNIV_INTERN
|
2005-10-27 07:29:40 +00:00
|
|
|
void
|
|
|
|
btr_search_sys_create(
|
|
|
|
/*==================*/
|
2009-05-25 06:46:10 +00:00
|
|
|
ulint hash_size) /*!< in: hash index hash table size */
|
2005-10-27 07:29:40 +00:00
|
|
|
{
|
|
|
|
/* We allocate the search latch from dynamic memory:
|
|
|
|
see above at the global variable definition */
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
btr_search_latch_temp = mem_alloc(sizeof(rw_lock_t));
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2006-05-08 06:18:59 +00:00
|
|
|
rw_lock_create(&btr_search_latch, SYNC_SEARCH_SYS);
|
branches/innodb+: Merge revisions 4070:4072 from branches/zip:
------------------------------------------------------------------------
r4072 | marko | 2009-01-30 23:30:29 +0200 (Fri, 30 Jan 2009) | 32 lines
branches/zip: Make innodb_adaptive_hash_index settable.
btr_search_disabled: Rename to btr_search_enabled and change the type
to char, so that it can be directly linked to the MySQL parameters.
Note that the variable is protected by btr_search_latch and
btr_search_enabled_mutex, a new mutex introduced in this patch.
btr_search_enabled_mutex: A new mutex, to protect btr_search_enabled
together with btr_search_latch.
buf_pool_drop_hash_index(): New function, to be called from
btr_search_disable().
btr_search_disable(), btr_search_enable(): Fix bugs. These functions
were previously unused.
btr_search_guess_on_hash(), btr_search_build_page_hash_index():
Check btr_search_enabled once more, while holding btr_search_latch.
btr_cur_search_to_nth_level(): Note that the reads of btr_search_enabled
may be dirty and explain why it should not be a problem.
innobase_adaptive_hash_index: Remove. The variable btr_search_enabled will be used directly instead.
innodb_adaptive_hash_index_update(): New function, an update callback for
innodb_adaptive_hash_index. This will call either btr_search_disable()
or btr_search_enable() when the value is assigned. The functions will
be called even if the value does not appear to be changed, e.g., when
setting from TRUE to TRUE or FALSE to FALSE.
rb://85 approved by Heikki Tuuri. This addresses Issue #163.
------------------------------------------------------------------------
2009-01-30 21:45:02 +00:00
|
|
|
mutex_create(&btr_search_enabled_mutex, SYNC_SEARCH_SYS_CONF);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
btr_search_sys = mem_alloc(sizeof(btr_search_sys_t));
|
|
|
|
|
2006-10-18 18:52:04 +00:00
|
|
|
btr_search_sys->hash_index = ha_create(hash_size, 0, 0);
|
2005-10-27 07:29:40 +00:00
|
|
|
}
|
|
|
|
|
2006-11-21 14:40:14 +00:00
|
|
|
/************************************************************************
|
|
|
|
Disable the adaptive hash search system and empty the index. */
|
2008-02-06 14:17:36 +00:00
|
|
|
UNIV_INTERN
|
2006-11-21 14:40:14 +00:00
|
|
|
void
|
|
|
|
btr_search_disable(void)
|
|
|
|
/*====================*/
|
|
|
|
{
|
branches/innodb+: Merge revisions 4070:4072 from branches/zip:
------------------------------------------------------------------------
r4072 | marko | 2009-01-30 23:30:29 +0200 (Fri, 30 Jan 2009) | 32 lines
branches/zip: Make innodb_adaptive_hash_index settable.
btr_search_disabled: Rename to btr_search_enabled and change the type
to char, so that it can be directly linked to the MySQL parameters.
Note that the variable is protected by btr_search_latch and
btr_search_enabled_mutex, a new mutex introduced in this patch.
btr_search_enabled_mutex: A new mutex, to protect btr_search_enabled
together with btr_search_latch.
buf_pool_drop_hash_index(): New function, to be called from
btr_search_disable().
btr_search_disable(), btr_search_enable(): Fix bugs. These functions
were previously unused.
btr_search_guess_on_hash(), btr_search_build_page_hash_index():
Check btr_search_enabled once more, while holding btr_search_latch.
btr_cur_search_to_nth_level(): Note that the reads of btr_search_enabled
may be dirty and explain why it should not be a problem.
innobase_adaptive_hash_index: Remove. The variable btr_search_enabled will be used directly instead.
innodb_adaptive_hash_index_update(): New function, an update callback for
innodb_adaptive_hash_index. This will call either btr_search_disable()
or btr_search_enable() when the value is assigned. The functions will
be called even if the value does not appear to be changed, e.g., when
setting from TRUE to TRUE or FALSE to FALSE.
rb://85 approved by Heikki Tuuri. This addresses Issue #163.
------------------------------------------------------------------------
2009-01-30 21:45:02 +00:00
|
|
|
mutex_enter(&btr_search_enabled_mutex);
|
2006-11-21 14:40:14 +00:00
|
|
|
rw_lock_x_lock(&btr_search_latch);
|
|
|
|
|
branches/innodb+: Merge revisions 4070:4072 from branches/zip:
------------------------------------------------------------------------
r4072 | marko | 2009-01-30 23:30:29 +0200 (Fri, 30 Jan 2009) | 32 lines
branches/zip: Make innodb_adaptive_hash_index settable.
btr_search_disabled: Rename to btr_search_enabled and change the type
to char, so that it can be directly linked to the MySQL parameters.
Note that the variable is protected by btr_search_latch and
btr_search_enabled_mutex, a new mutex introduced in this patch.
btr_search_enabled_mutex: A new mutex, to protect btr_search_enabled
together with btr_search_latch.
buf_pool_drop_hash_index(): New function, to be called from
btr_search_disable().
btr_search_disable(), btr_search_enable(): Fix bugs. These functions
were previously unused.
btr_search_guess_on_hash(), btr_search_build_page_hash_index():
Check btr_search_enabled once more, while holding btr_search_latch.
btr_cur_search_to_nth_level(): Note that the reads of btr_search_enabled
may be dirty and explain why it should not be a problem.
innobase_adaptive_hash_index: Remove. The variable btr_search_enabled will be used directly instead.
innodb_adaptive_hash_index_update(): New function, an update callback for
innodb_adaptive_hash_index. This will call either btr_search_disable()
or btr_search_enable() when the value is assigned. The functions will
be called even if the value does not appear to be changed, e.g., when
setting from TRUE to TRUE or FALSE to FALSE.
rb://85 approved by Heikki Tuuri. This addresses Issue #163.
------------------------------------------------------------------------
2009-01-30 21:45:02 +00:00
|
|
|
btr_search_enabled = FALSE;
|
|
|
|
|
|
|
|
/* Clear all block->is_hashed flags and remove all entries
|
|
|
|
from btr_search_sys->hash_index. */
|
|
|
|
buf_pool_drop_hash_index();
|
|
|
|
|
|
|
|
/* btr_search_enabled_mutex should guarantee this. */
|
|
|
|
ut_ad(!btr_search_enabled);
|
2006-11-21 14:40:14 +00:00
|
|
|
|
|
|
|
rw_lock_x_unlock(&btr_search_latch);
|
branches/innodb+: Merge revisions 4070:4072 from branches/zip:
------------------------------------------------------------------------
r4072 | marko | 2009-01-30 23:30:29 +0200 (Fri, 30 Jan 2009) | 32 lines
branches/zip: Make innodb_adaptive_hash_index settable.
btr_search_disabled: Rename to btr_search_enabled and change the type
to char, so that it can be directly linked to the MySQL parameters.
Note that the variable is protected by btr_search_latch and
btr_search_enabled_mutex, a new mutex introduced in this patch.
btr_search_enabled_mutex: A new mutex, to protect btr_search_enabled
together with btr_search_latch.
buf_pool_drop_hash_index(): New function, to be called from
btr_search_disable().
btr_search_disable(), btr_search_enable(): Fix bugs. These functions
were previously unused.
btr_search_guess_on_hash(), btr_search_build_page_hash_index():
Check btr_search_enabled once more, while holding btr_search_latch.
btr_cur_search_to_nth_level(): Note that the reads of btr_search_enabled
may be dirty and explain why it should not be a problem.
innobase_adaptive_hash_index: Remove. The variable btr_search_enabled will be used directly instead.
innodb_adaptive_hash_index_update(): New function, an update callback for
innodb_adaptive_hash_index. This will call either btr_search_disable()
or btr_search_enable() when the value is assigned. The functions will
be called even if the value does not appear to be changed, e.g., when
setting from TRUE to TRUE or FALSE to FALSE.
rb://85 approved by Heikki Tuuri. This addresses Issue #163.
------------------------------------------------------------------------
2009-01-30 21:45:02 +00:00
|
|
|
mutex_exit(&btr_search_enabled_mutex);
|
2006-11-21 14:40:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/************************************************************************
|
|
|
|
Enable the adaptive hash search system. */
|
2008-02-06 14:17:36 +00:00
|
|
|
UNIV_INTERN
|
2006-11-21 14:40:14 +00:00
|
|
|
void
|
|
|
|
btr_search_enable(void)
|
|
|
|
/*====================*/
|
|
|
|
{
|
branches/innodb+: Merge revisions 4070:4072 from branches/zip:
------------------------------------------------------------------------
r4072 | marko | 2009-01-30 23:30:29 +0200 (Fri, 30 Jan 2009) | 32 lines
branches/zip: Make innodb_adaptive_hash_index settable.
btr_search_disabled: Rename to btr_search_enabled and change the type
to char, so that it can be directly linked to the MySQL parameters.
Note that the variable is protected by btr_search_latch and
btr_search_enabled_mutex, a new mutex introduced in this patch.
btr_search_enabled_mutex: A new mutex, to protect btr_search_enabled
together with btr_search_latch.
buf_pool_drop_hash_index(): New function, to be called from
btr_search_disable().
btr_search_disable(), btr_search_enable(): Fix bugs. These functions
were previously unused.
btr_search_guess_on_hash(), btr_search_build_page_hash_index():
Check btr_search_enabled once more, while holding btr_search_latch.
btr_cur_search_to_nth_level(): Note that the reads of btr_search_enabled
may be dirty and explain why it should not be a problem.
innobase_adaptive_hash_index: Remove. The variable btr_search_enabled will be used directly instead.
innodb_adaptive_hash_index_update(): New function, an update callback for
innodb_adaptive_hash_index. This will call either btr_search_disable()
or btr_search_enable() when the value is assigned. The functions will
be called even if the value does not appear to be changed, e.g., when
setting from TRUE to TRUE or FALSE to FALSE.
rb://85 approved by Heikki Tuuri. This addresses Issue #163.
------------------------------------------------------------------------
2009-01-30 21:45:02 +00:00
|
|
|
mutex_enter(&btr_search_enabled_mutex);
|
|
|
|
rw_lock_x_lock(&btr_search_latch);
|
|
|
|
|
|
|
|
btr_search_enabled = TRUE;
|
|
|
|
|
|
|
|
rw_lock_x_unlock(&btr_search_latch);
|
|
|
|
mutex_exit(&btr_search_enabled_mutex);
|
2006-11-21 14:40:14 +00:00
|
|
|
}
|
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
/*********************************************************************
|
2009-05-25 06:46:10 +00:00
|
|
|
Creates and initializes a search info struct.
|
|
|
|
@return own: search info struct */
|
2008-02-06 14:17:36 +00:00
|
|
|
UNIV_INTERN
|
2005-10-27 07:29:40 +00:00
|
|
|
btr_search_t*
|
|
|
|
btr_search_info_create(
|
|
|
|
/*===================*/
|
2009-05-25 06:46:10 +00:00
|
|
|
mem_heap_t* heap) /*!< in: heap where created */
|
2005-10-27 07:29:40 +00:00
|
|
|
{
|
|
|
|
btr_search_t* info;
|
|
|
|
|
|
|
|
info = mem_heap_alloc(heap, sizeof(btr_search_t));
|
|
|
|
|
2006-09-19 10:14:07 +00:00
|
|
|
#ifdef UNIV_DEBUG
|
2005-10-27 07:29:40 +00:00
|
|
|
info->magic_n = BTR_SEARCH_MAGIC_N;
|
2006-09-19 10:14:07 +00:00
|
|
|
#endif /* UNIV_DEBUG */
|
2005-10-27 07:29:40 +00:00
|
|
|
|
2008-08-09 00:15:46 +00:00
|
|
|
info->ref_count = 0;
|
2005-10-27 07:29:40 +00:00
|
|
|
info->root_guess = NULL;
|
|
|
|
|
|
|
|
info->hash_analysis = 0;
|
|
|
|
info->n_hash_potential = 0;
|
|
|
|
|
|
|
|
info->last_hash_succ = FALSE;
|
|
|
|
|
2006-04-12 09:32:17 +00:00
|
|
|
#ifdef UNIV_SEARCH_PERF_STAT
|
2006-02-23 19:25:29 +00:00
|
|
|
info->n_hash_succ = 0;
|
|
|
|
info->n_hash_fail = 0;
|
|
|
|
info->n_patt_succ = 0;
|
|
|
|
info->n_searches = 0;
|
2006-04-12 09:32:17 +00:00
|
|
|
#endif /* UNIV_SEARCH_PERF_STAT */
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
/* Set some sensible values */
|
|
|
|
info->n_fields = 1;
|
|
|
|
info->n_bytes = 0;
|
|
|
|
|
2006-09-19 10:14:07 +00:00
|
|
|
info->left_side = TRUE;
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
return(info);
|
|
|
|
}
|
|
|
|
|
2008-08-09 00:15:46 +00:00
|
|
|
/*********************************************************************
|
|
|
|
Returns the value of ref_count. The value is protected by
|
2009-05-25 06:46:10 +00:00
|
|
|
btr_search_latch.
|
|
|
|
@return ref_count value. */
|
2008-08-09 00:15:46 +00:00
|
|
|
UNIV_INTERN
|
|
|
|
ulint
|
|
|
|
btr_search_info_get_ref_count(
|
|
|
|
/*==========================*/
|
2009-05-25 06:46:10 +00:00
|
|
|
btr_search_t* info) /*!< in: search info. */
|
2008-08-09 00:15:46 +00:00
|
|
|
{
|
|
|
|
ulint ret;
|
|
|
|
|
|
|
|
ut_ad(info);
|
|
|
|
|
|
|
|
#ifdef UNIV_SYNC_DEBUG
|
|
|
|
ut_ad(!rw_lock_own(&btr_search_latch, RW_LOCK_SHARED));
|
|
|
|
ut_ad(!rw_lock_own(&btr_search_latch, RW_LOCK_EX));
|
|
|
|
#endif /* UNIV_SYNC_DEBUG */
|
|
|
|
|
|
|
|
rw_lock_s_lock(&btr_search_latch);
|
|
|
|
ret = info->ref_count;
|
|
|
|
rw_lock_s_unlock(&btr_search_latch);
|
|
|
|
|
|
|
|
return(ret);
|
|
|
|
}
|
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
/*************************************************************************
|
|
|
|
Updates the search info of an index about hash successes. NOTE that info
|
|
|
|
is NOT protected by any semaphore, to save CPU time! Do not assume its fields
|
|
|
|
are consistent. */
|
|
|
|
static
|
|
|
|
void
|
|
|
|
btr_search_info_update_hash(
|
|
|
|
/*========================*/
|
2009-05-25 06:46:10 +00:00
|
|
|
btr_search_t* info, /*!< in/out: search info */
|
|
|
|
btr_cur_t* cursor) /*!< in: cursor which was just positioned */
|
2005-10-27 07:29:40 +00:00
|
|
|
{
|
|
|
|
dict_index_t* index;
|
|
|
|
ulint n_unique;
|
|
|
|
int cmp;
|
|
|
|
|
|
|
|
#ifdef UNIV_SYNC_DEBUG
|
|
|
|
ut_ad(!rw_lock_own(&btr_search_latch, RW_LOCK_SHARED));
|
|
|
|
ut_ad(!rw_lock_own(&btr_search_latch, RW_LOCK_EX));
|
|
|
|
#endif /* UNIV_SYNC_DEBUG */
|
|
|
|
|
|
|
|
index = cursor->index;
|
|
|
|
|
2008-01-25 08:13:12 +00:00
|
|
|
if (dict_index_is_ibuf(index)) {
|
2005-10-27 07:29:40 +00:00
|
|
|
/* So many deletes are performed on an insert buffer tree
|
|
|
|
that we do not consider a hash index useful on it: */
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
n_unique = dict_index_get_n_unique_in_tree(index);
|
|
|
|
|
|
|
|
if (info->n_hash_potential == 0) {
|
|
|
|
|
|
|
|
goto set_new_recomm;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Test if the search would have succeeded using the recommended
|
|
|
|
hash prefix */
|
|
|
|
|
|
|
|
if (info->n_fields >= n_unique && cursor->up_match >= n_unique) {
|
2006-09-19 10:14:07 +00:00
|
|
|
increment_potential:
|
2005-10-27 07:29:40 +00:00
|
|
|
info->n_hash_potential++;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
cmp = ut_pair_cmp(info->n_fields, info->n_bytes,
|
2006-08-29 09:30:31 +00:00
|
|
|
cursor->low_match, cursor->low_bytes);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
2006-09-19 10:14:07 +00:00
|
|
|
if (info->left_side ? cmp <= 0 : cmp > 0) {
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
goto set_new_recomm;
|
|
|
|
}
|
|
|
|
|
|
|
|
cmp = ut_pair_cmp(info->n_fields, info->n_bytes,
|
2006-08-29 09:30:31 +00:00
|
|
|
cursor->up_match, cursor->up_bytes);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
2006-09-19 10:14:07 +00:00
|
|
|
if (info->left_side ? cmp <= 0 : cmp > 0) {
|
2005-10-27 07:29:40 +00:00
|
|
|
|
2006-09-19 10:14:07 +00:00
|
|
|
goto increment_potential;
|
2005-10-27 07:29:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
set_new_recomm:
|
|
|
|
/* We have to set a new recommendation; skip the hash analysis
|
|
|
|
for a while to avoid unnecessary CPU time usage when there is no
|
|
|
|
chance for success */
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
info->hash_analysis = 0;
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
cmp = ut_pair_cmp(cursor->up_match, cursor->up_bytes,
|
2006-08-29 09:30:31 +00:00
|
|
|
cursor->low_match, cursor->low_bytes);
|
2005-10-27 07:29:40 +00:00
|
|
|
if (cmp == 0) {
|
|
|
|
info->n_hash_potential = 0;
|
|
|
|
|
|
|
|
/* For extra safety, we set some sensible values here */
|
|
|
|
|
|
|
|
info->n_fields = 1;
|
|
|
|
info->n_bytes = 0;
|
|
|
|
|
2006-09-19 10:14:07 +00:00
|
|
|
info->left_side = TRUE;
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
} else if (cmp > 0) {
|
|
|
|
info->n_hash_potential = 1;
|
|
|
|
|
|
|
|
if (cursor->up_match >= n_unique) {
|
|
|
|
|
|
|
|
info->n_fields = n_unique;
|
|
|
|
info->n_bytes = 0;
|
|
|
|
|
|
|
|
} else if (cursor->low_match < cursor->up_match) {
|
|
|
|
|
|
|
|
info->n_fields = cursor->low_match + 1;
|
|
|
|
info->n_bytes = 0;
|
2006-02-23 19:25:29 +00:00
|
|
|
} else {
|
2005-10-27 07:29:40 +00:00
|
|
|
info->n_fields = cursor->low_match;
|
|
|
|
info->n_bytes = cursor->low_bytes + 1;
|
|
|
|
}
|
|
|
|
|
2006-09-19 10:14:07 +00:00
|
|
|
info->left_side = TRUE;
|
2005-10-27 07:29:40 +00:00
|
|
|
} else {
|
|
|
|
info->n_hash_potential = 1;
|
|
|
|
|
|
|
|
if (cursor->low_match >= n_unique) {
|
|
|
|
|
|
|
|
info->n_fields = n_unique;
|
|
|
|
info->n_bytes = 0;
|
|
|
|
|
|
|
|
} else if (cursor->low_match > cursor->up_match) {
|
|
|
|
|
|
|
|
info->n_fields = cursor->up_match + 1;
|
|
|
|
info->n_bytes = 0;
|
2006-02-23 19:25:29 +00:00
|
|
|
} else {
|
2005-10-27 07:29:40 +00:00
|
|
|
info->n_fields = cursor->up_match;
|
|
|
|
info->n_bytes = cursor->up_bytes + 1;
|
|
|
|
}
|
|
|
|
|
2006-09-19 10:14:07 +00:00
|
|
|
info->left_side = FALSE;
|
2005-10-27 07:29:40 +00:00
|
|
|
}
|
|
|
|
}
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
/*************************************************************************
|
|
|
|
Updates the block search info on hash successes. NOTE that info and
|
|
|
|
block->n_hash_helps, n_fields, n_bytes, side are NOT protected by any
|
2009-05-25 06:46:10 +00:00
|
|
|
semaphore, to save CPU time! Do not assume the fields are consistent.
|
|
|
|
@return TRUE if building a (new) hash index on the block is recommended */
|
2005-10-27 07:29:40 +00:00
|
|
|
static
|
|
|
|
ibool
|
|
|
|
btr_search_update_block_hash_info(
|
|
|
|
/*==============================*/
|
2009-05-25 06:46:10 +00:00
|
|
|
btr_search_t* info, /*!< in: search info */
|
|
|
|
buf_block_t* block, /*!< in: buffer block */
|
2006-09-19 10:14:07 +00:00
|
|
|
btr_cur_t* cursor __attribute__((unused)))
|
2009-05-25 06:46:10 +00:00
|
|
|
/*!< in: cursor */
|
2005-10-27 07:29:40 +00:00
|
|
|
{
|
|
|
|
#ifdef UNIV_SYNC_DEBUG
|
|
|
|
ut_ad(!rw_lock_own(&btr_search_latch, RW_LOCK_SHARED));
|
|
|
|
ut_ad(!rw_lock_own(&btr_search_latch, RW_LOCK_EX));
|
2006-10-19 07:27:26 +00:00
|
|
|
ut_ad(rw_lock_own(&block->lock, RW_LOCK_SHARED)
|
|
|
|
|| rw_lock_own(&block->lock, RW_LOCK_EX));
|
2005-10-27 07:29:40 +00:00
|
|
|
#endif /* UNIV_SYNC_DEBUG */
|
|
|
|
ut_ad(cursor);
|
|
|
|
|
|
|
|
info->last_hash_succ = FALSE;
|
|
|
|
|
2006-11-23 15:14:45 +00:00
|
|
|
ut_a(buf_block_state_valid(block));
|
2006-09-19 10:14:07 +00:00
|
|
|
ut_ad(info->magic_n == BTR_SEARCH_MAGIC_N);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
if ((block->n_hash_helps > 0)
|
2006-08-29 09:30:31 +00:00
|
|
|
&& (info->n_hash_potential > 0)
|
|
|
|
&& (block->n_fields == info->n_fields)
|
|
|
|
&& (block->n_bytes == info->n_bytes)
|
2006-09-19 10:14:07 +00:00
|
|
|
&& (block->left_side == info->left_side)) {
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
if ((block->is_hashed)
|
2006-08-29 09:30:31 +00:00
|
|
|
&& (block->curr_n_fields == info->n_fields)
|
|
|
|
&& (block->curr_n_bytes == info->n_bytes)
|
2006-09-19 10:14:07 +00:00
|
|
|
&& (block->curr_left_side == info->left_side)) {
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
/* The search would presumably have succeeded using
|
|
|
|
the hash index */
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
info->last_hash_succ = TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
block->n_hash_helps++;
|
|
|
|
} else {
|
|
|
|
block->n_hash_helps = 1;
|
|
|
|
block->n_fields = info->n_fields;
|
|
|
|
block->n_bytes = info->n_bytes;
|
2006-09-19 10:14:07 +00:00
|
|
|
block->left_side = info->left_side;
|
2005-10-27 07:29:40 +00:00
|
|
|
}
|
|
|
|
|
2006-09-19 10:14:07 +00:00
|
|
|
#ifdef UNIV_DEBUG
|
2005-10-27 07:29:40 +00:00
|
|
|
if (cursor->index->table->does_not_fit_in_memory) {
|
|
|
|
block->n_hash_helps = 0;
|
|
|
|
}
|
2006-09-19 10:14:07 +00:00
|
|
|
#endif /* UNIV_DEBUG */
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
if ((block->n_hash_helps > page_get_n_recs(block->frame)
|
2006-08-29 09:30:31 +00:00
|
|
|
/ BTR_SEARCH_PAGE_BUILD_LIMIT)
|
|
|
|
&& (info->n_hash_potential >= BTR_SEARCH_BUILD_LIMIT)) {
|
2005-10-27 07:29:40 +00:00
|
|
|
|
2006-02-23 19:25:29 +00:00
|
|
|
if ((!block->is_hashed)
|
2006-08-29 09:30:31 +00:00
|
|
|
|| (block->n_hash_helps
|
|
|
|
> 2 * page_get_n_recs(block->frame))
|
|
|
|
|| (block->n_fields != block->curr_n_fields)
|
|
|
|
|| (block->n_bytes != block->curr_n_bytes)
|
2006-09-19 10:14:07 +00:00
|
|
|
|| (block->left_side != block->curr_left_side)) {
|
2005-10-27 07:29:40 +00:00
|
|
|
|
2006-02-23 19:25:29 +00:00
|
|
|
/* Build a new hash index on the page */
|
2005-10-27 07:29:40 +00:00
|
|
|
|
2006-02-23 19:25:29 +00:00
|
|
|
return(TRUE);
|
2005-10-27 07:29:40 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return(FALSE);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
Updates a hash node reference when it has been unsuccessfully used in a
|
|
|
|
search which could have succeeded with the used hash parameters. This can
|
|
|
|
happen because when building a hash index for a page, we do not check
|
|
|
|
what happens at page boundaries, and therefore there can be misleading
|
|
|
|
hash nodes. Also, collisions in the fold value can lead to misleading
|
|
|
|
references. This function lazily fixes these imperfections in the hash
|
|
|
|
index. */
|
|
|
|
static
|
|
|
|
void
|
|
|
|
btr_search_update_hash_ref(
|
|
|
|
/*=======================*/
|
2009-05-25 06:46:10 +00:00
|
|
|
btr_search_t* info, /*!< in: search info */
|
|
|
|
buf_block_t* block, /*!< in: buffer block where cursor positioned */
|
|
|
|
btr_cur_t* cursor) /*!< in: cursor */
|
2005-10-27 07:29:40 +00:00
|
|
|
{
|
|
|
|
ulint fold;
|
|
|
|
rec_t* rec;
|
2006-09-19 10:14:07 +00:00
|
|
|
dulint index_id;
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
ut_ad(cursor->flag == BTR_CUR_HASH_FAIL);
|
|
|
|
#ifdef UNIV_SYNC_DEBUG
|
|
|
|
ut_ad(rw_lock_own(&btr_search_latch, RW_LOCK_EX));
|
|
|
|
ut_ad(rw_lock_own(&(block->lock), RW_LOCK_SHARED)
|
2006-08-29 09:30:31 +00:00
|
|
|
|| rw_lock_own(&(block->lock), RW_LOCK_EX));
|
2005-10-27 07:29:40 +00:00
|
|
|
#endif /* UNIV_SYNC_DEBUG */
|
2006-10-09 19:36:58 +00:00
|
|
|
ut_ad(page_align(btr_cur_get_rec(cursor))
|
|
|
|
== buf_block_get_frame(block));
|
2005-10-27 07:29:40 +00:00
|
|
|
|
2008-01-25 14:37:11 +00:00
|
|
|
if (!block->is_hashed) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
ut_a(block->index == cursor->index);
|
|
|
|
ut_a(!dict_index_is_ibuf(cursor->index));
|
|
|
|
|
|
|
|
if ((info->n_hash_potential > 0)
|
2006-08-29 09:30:31 +00:00
|
|
|
&& (block->curr_n_fields == info->n_fields)
|
|
|
|
&& (block->curr_n_bytes == info->n_bytes)
|
2006-09-19 10:14:07 +00:00
|
|
|
&& (block->curr_left_side == info->left_side)) {
|
2005-10-27 07:29:40 +00:00
|
|
|
mem_heap_t* heap = NULL;
|
|
|
|
ulint offsets_[REC_OFFS_NORMAL_SIZE];
|
2007-09-28 07:05:57 +00:00
|
|
|
rec_offs_init(offsets_);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
2006-02-23 19:25:29 +00:00
|
|
|
rec = btr_cur_get_rec(cursor);
|
|
|
|
|
|
|
|
if (!page_rec_is_user_rec(rec)) {
|
2005-10-27 07:29:40 +00:00
|
|
|
|
2006-02-23 19:25:29 +00:00
|
|
|
return;
|
|
|
|
}
|
2005-10-27 07:29:40 +00:00
|
|
|
|
2006-09-19 10:14:07 +00:00
|
|
|
index_id = cursor->index->id;
|
2006-08-29 09:30:31 +00:00
|
|
|
fold = rec_fold(rec,
|
|
|
|
rec_get_offsets(rec, cursor->index, offsets_,
|
|
|
|
ULINT_UNDEFINED, &heap),
|
2005-10-27 07:29:40 +00:00
|
|
|
block->curr_n_fields,
|
2006-09-19 10:14:07 +00:00
|
|
|
block->curr_n_bytes, index_id);
|
2005-10-27 07:29:40 +00:00
|
|
|
if (UNIV_LIKELY_NULL(heap)) {
|
|
|
|
mem_heap_free(heap);
|
|
|
|
}
|
|
|
|
#ifdef UNIV_SYNC_DEBUG
|
|
|
|
ut_ad(rw_lock_own(&btr_search_latch, RW_LOCK_EX));
|
|
|
|
#endif /* UNIV_SYNC_DEBUG */
|
|
|
|
|
2006-11-13 21:53:09 +00:00
|
|
|
ha_insert_for_fold(btr_search_sys->hash_index, fold,
|
|
|
|
block, rec);
|
2005-10-27 07:29:40 +00:00
|
|
|
}
|
2006-02-23 19:25:29 +00:00
|
|
|
}
|
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
/*************************************************************************
|
|
|
|
Updates the search info. */
|
2008-02-06 14:17:36 +00:00
|
|
|
UNIV_INTERN
|
2005-10-27 07:29:40 +00:00
|
|
|
void
|
|
|
|
btr_search_info_update_slow(
|
|
|
|
/*========================*/
|
2009-05-25 06:46:10 +00:00
|
|
|
btr_search_t* info, /*!< in/out: search info */
|
|
|
|
btr_cur_t* cursor) /*!< in: cursor which was just positioned */
|
2005-10-27 07:29:40 +00:00
|
|
|
{
|
|
|
|
buf_block_t* block;
|
|
|
|
ibool build_index;
|
|
|
|
ulint* params;
|
|
|
|
ulint* params2;
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
#ifdef UNIV_SYNC_DEBUG
|
|
|
|
ut_ad(!rw_lock_own(&btr_search_latch, RW_LOCK_SHARED));
|
|
|
|
ut_ad(!rw_lock_own(&btr_search_latch, RW_LOCK_EX));
|
|
|
|
#endif /* UNIV_SYNC_DEBUG */
|
|
|
|
|
2006-10-18 11:39:31 +00:00
|
|
|
block = btr_cur_get_block(cursor);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
/* NOTE that the following two function calls do NOT protect
|
|
|
|
info or block->n_fields etc. with any semaphore, to save CPU time!
|
|
|
|
We cannot assume the fields are consistent when we return from
|
|
|
|
those functions! */
|
|
|
|
|
|
|
|
btr_search_info_update_hash(info, cursor);
|
|
|
|
|
|
|
|
build_index = btr_search_update_block_hash_info(info, block, cursor);
|
|
|
|
|
|
|
|
if (build_index || (cursor->flag == BTR_CUR_HASH_FAIL)) {
|
|
|
|
|
|
|
|
btr_search_check_free_space_in_heap();
|
|
|
|
}
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
if (cursor->flag == BTR_CUR_HASH_FAIL) {
|
|
|
|
/* Update the hash node reference, if appropriate */
|
|
|
|
|
2006-04-12 09:32:17 +00:00
|
|
|
#ifdef UNIV_SEARCH_PERF_STAT
|
2005-10-27 07:29:40 +00:00
|
|
|
btr_search_n_hash_fail++;
|
2006-04-12 09:32:17 +00:00
|
|
|
#endif /* UNIV_SEARCH_PERF_STAT */
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
rw_lock_x_lock(&btr_search_latch);
|
|
|
|
|
|
|
|
btr_search_update_hash_ref(info, block, cursor);
|
|
|
|
|
|
|
|
rw_lock_x_unlock(&btr_search_latch);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (build_index) {
|
|
|
|
/* Note that since we did not protect block->n_fields etc.
|
|
|
|
with any semaphore, the values can be inconsistent. We have
|
|
|
|
to check inside the function call that they make sense. We
|
|
|
|
also malloc an array and store the values there to make sure
|
|
|
|
the compiler does not let the function call parameters change
|
|
|
|
inside the called function. It might be that the compiler
|
|
|
|
would optimize the call just to pass pointers to block. */
|
|
|
|
|
|
|
|
params = mem_alloc(3 * sizeof(ulint));
|
|
|
|
params[0] = block->n_fields;
|
|
|
|
params[1] = block->n_bytes;
|
2006-09-19 10:14:07 +00:00
|
|
|
params[2] = block->left_side;
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
/* Make sure the compiler cannot deduce the values and do
|
|
|
|
optimizations */
|
|
|
|
|
|
|
|
params2 = params + btr_search_this_is_zero;
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
btr_search_build_page_hash_index(cursor->index,
|
2006-10-19 08:27:34 +00:00
|
|
|
block,
|
2006-08-29 09:30:31 +00:00
|
|
|
params2[0],
|
|
|
|
params2[1],
|
|
|
|
params2[2]);
|
2005-10-27 07:29:40 +00:00
|
|
|
mem_free(params);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**********************************************************************
|
|
|
|
Checks if a guessed position for a tree cursor is right. Note that if
|
|
|
|
mode is PAGE_CUR_LE, which is used in inserts, and the function returns
|
2009-05-25 06:46:10 +00:00
|
|
|
TRUE, then cursor->up_match and cursor->low_match both have sensible values.
|
|
|
|
@return TRUE if success */
|
2005-10-27 07:29:40 +00:00
|
|
|
static
|
|
|
|
ibool
|
|
|
|
btr_search_check_guess(
|
|
|
|
/*===================*/
|
2009-05-25 06:46:10 +00:00
|
|
|
btr_cur_t* cursor, /*!< in: guessed cursor position */
|
2006-02-23 19:25:29 +00:00
|
|
|
ibool can_only_compare_to_cursor_rec,
|
2009-05-25 06:46:10 +00:00
|
|
|
/*!< in: if we do not have a latch on the page
|
2005-10-27 07:29:40 +00:00
|
|
|
of cursor, but only a latch on
|
2006-02-23 19:25:29 +00:00
|
|
|
btr_search_latch, then ONLY the columns
|
2005-10-27 07:29:40 +00:00
|
|
|
of the record UNDER the cursor are
|
|
|
|
protected, not the next or previous record
|
|
|
|
in the chain: we cannot look at the next or
|
|
|
|
previous record to check our guess! */
|
2009-05-25 06:46:10 +00:00
|
|
|
const dtuple_t* tuple, /*!< in: data tuple */
|
|
|
|
ulint mode, /*!< in: PAGE_CUR_L, PAGE_CUR_LE, PAGE_CUR_G,
|
2005-10-27 07:29:40 +00:00
|
|
|
or PAGE_CUR_GE */
|
2009-05-25 06:46:10 +00:00
|
|
|
mtr_t* mtr) /*!< in: mtr */
|
2005-10-27 07:29:40 +00:00
|
|
|
{
|
|
|
|
rec_t* rec;
|
|
|
|
ulint n_unique;
|
|
|
|
ulint match;
|
|
|
|
ulint bytes;
|
|
|
|
int cmp;
|
|
|
|
mem_heap_t* heap = NULL;
|
|
|
|
ulint offsets_[REC_OFFS_NORMAL_SIZE];
|
|
|
|
ulint* offsets = offsets_;
|
|
|
|
ibool success = FALSE;
|
2007-09-28 07:05:57 +00:00
|
|
|
rec_offs_init(offsets_);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
n_unique = dict_index_get_n_unique_in_tree(cursor->index);
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
rec = btr_cur_get_rec(cursor);
|
|
|
|
|
|
|
|
ut_ad(page_rec_is_user_rec(rec));
|
|
|
|
|
|
|
|
match = 0;
|
|
|
|
bytes = 0;
|
|
|
|
|
|
|
|
offsets = rec_get_offsets(rec, cursor->index, offsets,
|
2006-08-29 09:30:31 +00:00
|
|
|
n_unique, &heap);
|
2005-10-27 07:29:40 +00:00
|
|
|
cmp = page_cmp_dtuple_rec_with_match(tuple, rec,
|
2006-08-29 09:30:31 +00:00
|
|
|
offsets, &match, &bytes);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
if (mode == PAGE_CUR_GE) {
|
|
|
|
if (cmp == 1) {
|
|
|
|
goto exit_func;
|
|
|
|
}
|
|
|
|
|
|
|
|
cursor->up_match = match;
|
|
|
|
|
|
|
|
if (match >= n_unique) {
|
|
|
|
success = TRUE;
|
|
|
|
goto exit_func;
|
2006-02-23 19:25:29 +00:00
|
|
|
}
|
2005-10-27 07:29:40 +00:00
|
|
|
} else if (mode == PAGE_CUR_LE) {
|
|
|
|
if (cmp == -1) {
|
|
|
|
goto exit_func;
|
|
|
|
}
|
|
|
|
|
|
|
|
cursor->low_match = match;
|
|
|
|
|
|
|
|
} else if (mode == PAGE_CUR_G) {
|
|
|
|
if (cmp != -1) {
|
|
|
|
goto exit_func;
|
|
|
|
}
|
|
|
|
} else if (mode == PAGE_CUR_L) {
|
|
|
|
if (cmp != 1) {
|
|
|
|
goto exit_func;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (can_only_compare_to_cursor_rec) {
|
2006-02-23 19:25:29 +00:00
|
|
|
/* Since we could not determine if our guess is right just by
|
|
|
|
looking at the record under the cursor, return FALSE */
|
2005-10-27 07:29:40 +00:00
|
|
|
goto exit_func;
|
|
|
|
}
|
|
|
|
|
|
|
|
match = 0;
|
|
|
|
bytes = 0;
|
|
|
|
|
|
|
|
if ((mode == PAGE_CUR_G) || (mode == PAGE_CUR_GE)) {
|
|
|
|
rec_t* prev_rec;
|
|
|
|
|
|
|
|
ut_ad(!page_rec_is_infimum(rec));
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
prev_rec = page_rec_get_prev(rec);
|
|
|
|
|
|
|
|
if (page_rec_is_infimum(prev_rec)) {
|
2006-10-09 16:22:47 +00:00
|
|
|
success = btr_page_get_prev(page_align(prev_rec), mtr)
|
|
|
|
== FIL_NULL;
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
goto exit_func;
|
|
|
|
}
|
|
|
|
|
|
|
|
offsets = rec_get_offsets(prev_rec, cursor->index, offsets,
|
2006-08-29 09:30:31 +00:00
|
|
|
n_unique, &heap);
|
2005-10-27 07:29:40 +00:00
|
|
|
cmp = page_cmp_dtuple_rec_with_match(tuple, prev_rec,
|
2006-08-29 09:30:31 +00:00
|
|
|
offsets, &match, &bytes);
|
2005-10-27 07:29:40 +00:00
|
|
|
if (mode == PAGE_CUR_GE) {
|
|
|
|
success = cmp == 1;
|
|
|
|
} else {
|
|
|
|
success = cmp != -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
goto exit_func;
|
|
|
|
} else {
|
|
|
|
rec_t* next_rec;
|
|
|
|
|
|
|
|
ut_ad(!page_rec_is_supremum(rec));
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
next_rec = page_rec_get_next(rec);
|
|
|
|
|
|
|
|
if (page_rec_is_supremum(next_rec)) {
|
2006-10-09 16:22:47 +00:00
|
|
|
if (btr_page_get_next(page_align(next_rec), mtr)
|
2006-09-19 10:14:07 +00:00
|
|
|
== FIL_NULL) {
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
cursor->up_match = 0;
|
|
|
|
success = TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
goto exit_func;
|
|
|
|
}
|
|
|
|
|
|
|
|
offsets = rec_get_offsets(next_rec, cursor->index, offsets,
|
2006-08-29 09:30:31 +00:00
|
|
|
n_unique, &heap);
|
2005-10-27 07:29:40 +00:00
|
|
|
cmp = page_cmp_dtuple_rec_with_match(tuple, next_rec,
|
2006-08-29 09:30:31 +00:00
|
|
|
offsets, &match, &bytes);
|
2005-10-27 07:29:40 +00:00
|
|
|
if (mode == PAGE_CUR_LE) {
|
|
|
|
success = cmp == -1;
|
|
|
|
cursor->up_match = match;
|
|
|
|
} else {
|
|
|
|
success = cmp != 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
exit_func:
|
|
|
|
if (UNIV_LIKELY_NULL(heap)) {
|
|
|
|
mem_heap_free(heap);
|
|
|
|
}
|
|
|
|
return(success);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**********************************************************************
|
|
|
|
Tries to guess the right search position based on the hash search info
|
|
|
|
of the index. Note that if mode is PAGE_CUR_LE, which is used in inserts,
|
|
|
|
and the function returns TRUE, then cursor->up_match and cursor->low_match
|
2009-05-25 06:46:10 +00:00
|
|
|
both have sensible values.
|
|
|
|
@return TRUE if succeeded */
|
2008-02-06 14:17:36 +00:00
|
|
|
UNIV_INTERN
|
2005-10-27 07:29:40 +00:00
|
|
|
ibool
|
|
|
|
btr_search_guess_on_hash(
|
|
|
|
/*=====================*/
|
2009-05-25 06:46:10 +00:00
|
|
|
dict_index_t* index, /*!< in: index */
|
|
|
|
btr_search_t* info, /*!< in: index search info */
|
|
|
|
const dtuple_t* tuple, /*!< in: logical record */
|
|
|
|
ulint mode, /*!< in: PAGE_CUR_L, ... */
|
|
|
|
ulint latch_mode, /*!< in: BTR_SEARCH_LEAF, ...;
|
2005-10-27 07:29:40 +00:00
|
|
|
NOTE that only if has_search_latch
|
|
|
|
is 0, we will have a latch set on
|
|
|
|
the cursor page, otherwise we assume
|
|
|
|
the caller uses his search latch
|
|
|
|
to protect the record! */
|
2009-05-25 06:46:10 +00:00
|
|
|
btr_cur_t* cursor, /*!< out: tree cursor */
|
|
|
|
ulint has_search_latch,/*!< in: latch mode the caller
|
2005-10-27 07:29:40 +00:00
|
|
|
currently has on btr_search_latch:
|
|
|
|
RW_S_LATCH, RW_X_LATCH, or 0 */
|
2009-05-25 06:46:10 +00:00
|
|
|
mtr_t* mtr) /*!< in: mtr */
|
2005-10-27 07:29:40 +00:00
|
|
|
{
|
|
|
|
buf_block_t* block;
|
|
|
|
rec_t* rec;
|
|
|
|
ulint fold;
|
2006-09-19 10:14:07 +00:00
|
|
|
dulint index_id;
|
2005-10-27 07:29:40 +00:00
|
|
|
#ifdef notdefined
|
|
|
|
btr_cur_t cursor2;
|
|
|
|
btr_pcur_t pcur;
|
|
|
|
#endif
|
|
|
|
ut_ad(index && info && tuple && cursor && mtr);
|
|
|
|
ut_ad((latch_mode == BTR_SEARCH_LEAF)
|
2006-08-29 09:30:31 +00:00
|
|
|
|| (latch_mode == BTR_MODIFY_LEAF));
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
/* Note that, for efficiency, the struct info may not be protected by
|
|
|
|
any latch here! */
|
|
|
|
|
|
|
|
if (UNIV_UNLIKELY(info->n_hash_potential == 0)) {
|
|
|
|
|
|
|
|
return(FALSE);
|
|
|
|
}
|
|
|
|
|
|
|
|
cursor->n_fields = info->n_fields;
|
|
|
|
cursor->n_bytes = info->n_bytes;
|
|
|
|
|
2007-01-31 14:28:37 +00:00
|
|
|
if (UNIV_UNLIKELY(dtuple_get_n_fields(tuple)
|
|
|
|
< cursor->n_fields + (cursor->n_bytes > 0))) {
|
2005-10-27 07:29:40 +00:00
|
|
|
|
2006-02-23 19:25:29 +00:00
|
|
|
return(FALSE);
|
2005-10-27 07:29:40 +00:00
|
|
|
}
|
|
|
|
|
2006-09-19 10:14:07 +00:00
|
|
|
index_id = index->id;
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
#ifdef UNIV_SEARCH_PERF_STAT
|
|
|
|
info->n_hash_succ++;
|
|
|
|
#endif
|
2006-09-19 10:14:07 +00:00
|
|
|
fold = dtuple_fold(tuple, cursor->n_fields, cursor->n_bytes, index_id);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
cursor->fold = fold;
|
|
|
|
cursor->flag = BTR_CUR_HASH;
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
if (UNIV_LIKELY(!has_search_latch)) {
|
|
|
|
rw_lock_s_lock(&btr_search_latch);
|
branches/innodb+: Merge revisions 4070:4072 from branches/zip:
------------------------------------------------------------------------
r4072 | marko | 2009-01-30 23:30:29 +0200 (Fri, 30 Jan 2009) | 32 lines
branches/zip: Make innodb_adaptive_hash_index settable.
btr_search_disabled: Rename to btr_search_enabled and change the type
to char, so that it can be directly linked to the MySQL parameters.
Note that the variable is protected by btr_search_latch and
btr_search_enabled_mutex, a new mutex introduced in this patch.
btr_search_enabled_mutex: A new mutex, to protect btr_search_enabled
together with btr_search_latch.
buf_pool_drop_hash_index(): New function, to be called from
btr_search_disable().
btr_search_disable(), btr_search_enable(): Fix bugs. These functions
were previously unused.
btr_search_guess_on_hash(), btr_search_build_page_hash_index():
Check btr_search_enabled once more, while holding btr_search_latch.
btr_cur_search_to_nth_level(): Note that the reads of btr_search_enabled
may be dirty and explain why it should not be a problem.
innobase_adaptive_hash_index: Remove. The variable btr_search_enabled will be used directly instead.
innodb_adaptive_hash_index_update(): New function, an update callback for
innodb_adaptive_hash_index. This will call either btr_search_disable()
or btr_search_enable() when the value is assigned. The functions will
be called even if the value does not appear to be changed, e.g., when
setting from TRUE to TRUE or FALSE to FALSE.
rb://85 approved by Heikki Tuuri. This addresses Issue #163.
------------------------------------------------------------------------
2009-01-30 21:45:02 +00:00
|
|
|
|
|
|
|
if (UNIV_UNLIKELY(!btr_search_enabled)) {
|
|
|
|
goto failure_unlock;
|
|
|
|
}
|
2005-10-27 07:29:40 +00:00
|
|
|
}
|
|
|
|
|
branches/innodb+: Merge revisions 4072:4150 from branches/zip:
------------------------------------------------------------------------
r4074 | vasil | 2009-01-31 08:05:24 +0200 (Sat, 31 Jan 2009) | 4 lines
branches/zip:
Adjust the failing patch patches/information_schema.diff.
------------------------------------------------------------------------
r4076 | vasil | 2009-02-02 09:32:04 +0200 (Mon, 02 Feb 2009) | 4 lines
branches/zip:
Add ChangeLog entry for the change in r4072.
------------------------------------------------------------------------
r4077 | marko | 2009-02-02 10:48:05 +0200 (Mon, 02 Feb 2009) | 2 lines
branches/zip: innobase_start_or_create_for_mysql(): Remove a factual error
in the function comment. Parameters are not read from a file "srv_init".
------------------------------------------------------------------------
r4081 | marko | 2009-02-02 14:28:17 +0200 (Mon, 02 Feb 2009) | 4 lines
branches/zip: Enclose some backup functions in #ifdef UNIV_HOTBACKUP.
recv_read_cp_info_for_backup(), recv_scan_log_seg_for_backup():
These functions are only called by InnoDB Hot Backup.
------------------------------------------------------------------------
r4082 | vasil | 2009-02-02 18:24:08 +0200 (Mon, 02 Feb 2009) | 10 lines
branches/zip:
Fix a mysql-test failure in innodb-zip:
main.innodb-zip [ fail ]
Test ended at 2009-02-02 18:13:25
CURRENT_TEST: main.innodb-zip
mysqltest: At line 160: Found line beginning with -- that didn't contain a valid mysqltest command, check your syntax or use # if you intended to write a comment
------------------------------------------------------------------------
r4083 | vasil | 2009-02-02 18:33:20 +0200 (Mon, 02 Feb 2009) | 6 lines
branches/zip:
Fix the failing innodb-zip test to restore the environment as it was before
the test execution because a newly added feature in the mysql-test framework
does check for this.
------------------------------------------------------------------------
r4088 | calvin | 2009-02-03 02:35:56 +0200 (Tue, 03 Feb 2009) | 8 lines
branches/zip: fix a compiler error and a warning
Both are minor changes:
1) Compiler error introduced in r4072: double ';' at the end.
2) Warning introduced in r3613: \mem\mem0pool.c(481) :
warning C4098: 'mem_area_free' : 'void' function returning a value
Approved by: Sunny (IM)
------------------------------------------------------------------------
r4098 | marko | 2009-02-03 09:52:45 +0200 (Tue, 03 Feb 2009) | 4 lines
branches/zip: mem_area_free(): Correct a bug that was introduced in r4088.
free() is not the same as ut_free(). ut_free() pairs with ut_malloc(),
not malloc(). free() pairs with malloc() and some other functions.
------------------------------------------------------------------------
r4114 | marko | 2009-02-04 16:09:24 +0200 (Wed, 04 Feb 2009) | 2 lines
branches/zip: buf_block_align(): Fix a bogus debug assertion
that was introduced in r4036, to address Issue #161.
------------------------------------------------------------------------
r4139 | vasil | 2009-02-09 13:47:16 +0200 (Mon, 09 Feb 2009) | 5 lines
branches/zip:
Remove mysql-test/patches/bug35261.diff because that bug has been fixed
in the MySQL repository.
------------------------------------------------------------------------
r4141 | marko | 2009-02-09 15:35:50 +0200 (Mon, 09 Feb 2009) | 1 line
branches/zip: fil_write_lsn_and_arch_no_to_file(): Plug a memory leak.
------------------------------------------------------------------------
r4144 | inaam | 2009-02-10 01:36:25 +0200 (Tue, 10 Feb 2009) | 9 lines
branches/zip rb://30
This patch changes the innodb mutexes and rw_locks implementation.
On supported platforms it uses GCC builtin atomics. These changes
are based on the patch sent by Mark Callaghan of Google under BSD
license. More technical discussion can be found at rb://30
Approved by: Heikki
------------------------------------------------------------------------
r4145 | vasil | 2009-02-10 07:34:43 +0200 (Tue, 10 Feb 2009) | 9 lines
branches/zip:
Non-functional change: Fix a compilation warning introduced in r4144:
gcc -DHAVE_CONFIG_H -I. -I../../include -I../../include -I../../include -I../../regex -I../../storage/innobase/include -I../../sql -I. -Werror -Wall -g -MT libinnobase_a-sync0arr.o -MD -MP -MF .deps/libinnobase_a-sync0arr.Tpo -c -o libinnobase_a-sync0arr.o `test -f 'sync/sync0arr.c' || echo './'`sync/sync0arr.c
cc1: warnings being treated as errors
sync/sync0arr.c: In function 'sync_array_object_signalled':
sync/sync0arr.c:869: warning: pointer targets in passing argument 1 of 'os_atomic_increment' differ in signedness
------------------------------------------------------------------------
r4148 | marko | 2009-02-10 10:38:41 +0200 (Tue, 10 Feb 2009) | 12 lines
branches/zip: Map ut_malloc(), ut_realloc(), ut_free() to
malloc(), realloc(), free() when innodb_use_sys_malloc is set.
ut_free_all_mem(): If innodb_use_sys_malloc is set, do nothing,
because then ut_mem_block_list_inited will never be set.
log_init(): Use mem_alloc() instead of ut_malloc(), so that the
memory will be freed. (Tested with Valgrind, although it is not
clear why the memory would be freed.)
rb://86 approved by Heikki Tuuri and Ken Jacobs. This addresses Issue #168.
------------------------------------------------------------------------
r4149 | marko | 2009-02-10 11:09:15 +0200 (Tue, 10 Feb 2009) | 1 line
branches/zip: ChangeLog: Document recent changes.
------------------------------------------------------------------------
r4150 | marko | 2009-02-10 11:51:43 +0200 (Tue, 10 Feb 2009) | 6 lines
branches/zip: get_share(), free_share(): Make table locking case sensitive.
If lower_case_table_names=1, MySQL will pass the table names in lower case.
Thus, we can use a binary comparison (strcmp) in the hash table.
rb://87 approved by Heikki Tuuri, to address Bug #41676 and Issue #167.
------------------------------------------------------------------------
2009-02-10 10:03:42 +00:00
|
|
|
ut_ad(rw_lock_get_writer(&btr_search_latch) != RW_LOCK_EX);
|
|
|
|
ut_ad(rw_lock_get_reader_count(&btr_search_latch) > 0);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
rec = ha_search_and_get_data(btr_search_sys->hash_index, fold);
|
|
|
|
|
|
|
|
if (UNIV_UNLIKELY(!rec)) {
|
|
|
|
goto failure_unlock;
|
|
|
|
}
|
|
|
|
|
branches/innodb+: Merge revisions 4006:4060 from branches/zip:
------------------------------------------------------------------------
r4008 | vasil | 2009-01-20 17:01:08 +0200 (Tue, 20 Jan 2009) | 4 lines
branches/zip:
Add ChangeLog entries for the bugfixes in r4004 and r4005.
------------------------------------------------------------------------
r4027 | marko | 2009-01-23 11:04:49 +0200 (Fri, 23 Jan 2009) | 1 line
branches/zip: Remove some redundant #include statements.
------------------------------------------------------------------------
r4028 | marko | 2009-01-23 11:26:10 +0200 (Fri, 23 Jan 2009) | 13 lines
branches/zip: Enclose some more unused code in #ifdef UNIV_LOG_ARCHIVE.
This will help trim the dependencies of InnoDB Hot Backup.
recv_recovery_from_checkpoint_start(): Rename to
recv_recovery_from_checkpoint_start_func(), and remove the two first
parameters unless UNIV_LOG_ARCHIVE is defined. Define and use
the auxiliary macros TYPE_CHECKPOINT and LIMIT_LSN in the function.
struct recv_sys_struct: Remove archive_group unless UNIV_LOG_ARCHIVE
is defined.
Do not define LOG_ARCHIVE unless UNIV_LOG_ARCHIVE is defined.
------------------------------------------------------------------------
r4029 | marko | 2009-01-23 14:07:38 +0200 (Fri, 23 Jan 2009) | 1 line
branches/zip: Remove some redundant #include directives.
------------------------------------------------------------------------
r4030 | marko | 2009-01-23 15:31:36 +0200 (Fri, 23 Jan 2009) | 2 lines
branches/zip: buf_page_get_gen(): Remove the unused mode BUF_GET_NOWAIT.
This was noticed while investigating Issue #160.
------------------------------------------------------------------------
r4033 | marko | 2009-01-23 15:49:04 +0200 (Fri, 23 Jan 2009) | 16 lines
branches/zip: Merge revisions 4005:4032 from branches/5.1:
------------------------------------------------------------------------
r4032 | marko | 2009-01-23 15:43:51 +0200 (Fri, 23 Jan 2009) | 10 lines
branches/5.1: Merge r4031 from branches/5.0:
btr_search_drop_page_hash_when_freed(): Check if buf_page_get_gen()
returns NULL. The page may have been evicted from the buffer pool
between buf_page_peek_if_search_hashed() and buf_page_get_gen(),
because the buffer pool mutex will be released between these two calls.
(Bug #42279, Issue #160)
rb://82 approved by Heikki Tuuri
------------------------------------------------------------------------
------------------------------------------------------------------------
r4034 | marko | 2009-01-26 16:16:39 +0200 (Mon, 26 Jan 2009) | 2 lines
branches/zip: buf_page_get_gen(): Fix a "possibly uninitialized" warning
that was introduced in r4030.
------------------------------------------------------------------------
r4036 | marko | 2009-01-26 22:33:20 +0200 (Mon, 26 Jan 2009) | 22 lines
branches/zip: In r988, the function buf_block_align() was enclosed
within UNIV_DEBUG. The two remaining callers in non-debug builds,
btr_search_guess_on_hash() and btr_search_validate(), were rewritten
to call buf_page_hash_get().
To implement support for a resizeable buffer pool, the function
buf_block_align() had been rewritten to perform a page hash lookup in
the buffer pool. The caller was also made responsible for holding the
buffer pool mutex.
Because the page hash lookup is expensive and it has to be done while
holding the buffer pool mutex, implement buf_block_align() by pointer
arithmetics again, and make btr_search_guess_on_hash() call it. Note
that this will have to be adjusted if the interface to the resizeable
buffer pool is actually implemented.
rb://83 approved by Heikki Tuuri, to address Issue #161.
As a deviation from the approved patch, this patch also makes
btr_search_validate() (invoked by CHECK TABLE) check that
buf_pool->page_hash is consistent with buf_block_align().
------------------------------------------------------------------------
r4039 | vasil | 2009-01-27 08:04:17 +0200 (Tue, 27 Jan 2009) | 5 lines
branches/zip:
Adjust the paths in innodb_file_per_table.diff with a recent rename of
the test/result files in the MySQL tree.
------------------------------------------------------------------------
r4042 | marko | 2009-01-27 10:05:24 +0200 (Tue, 27 Jan 2009) | 2 lines
branches/zip: buf_LRU_invalidate_tablespace(): Fix a race condition:
read zip_size while still holding block_mutex.
------------------------------------------------------------------------
r4045 | marko | 2009-01-28 00:31:17 +0200 (Wed, 28 Jan 2009) | 8 lines
branches/zip: btr_search_validate(): Fix a bogus UNIV_DEBUG
assertion failure that was accidentally introduced in r4036.
Instead of calling buf_block_get_frame(), which asserts that the
block must be buffer-fixed, access block->frame directly. That
is safe, because changes of block->page.state are protected by
the buffer pool mutex, which we are holding.
This bug was reported by Michael.
------------------------------------------------------------------------
r4046 | marko | 2009-01-28 00:33:20 +0200 (Wed, 28 Jan 2009) | 2 lines
branches/zip: Revert the change to univ.i that was accidentally
committed in r4045.
------------------------------------------------------------------------
r4047 | marko | 2009-01-28 00:46:13 +0200 (Wed, 28 Jan 2009) | 6 lines
branches/zip: btr_search_validate(): Fix an assertion failure that was
introduced in r4036.
Do not call buf_block_get_space(), buf_block_get_page_no()
unless the block state is BUF_BLOCK_FILE_PAGE.
This bug was reported by Michael.
------------------------------------------------------------------------
r4050 | vasil | 2009-01-28 08:21:44 +0200 (Wed, 28 Jan 2009) | 5 lines
branches/zip:
Adjust the paths in innodb_lock_wait_timeout.diff with a recent rename of
the test/result files in the MySQL tree.
------------------------------------------------------------------------
r4051 | marko | 2009-01-28 14:35:49 +0200 (Wed, 28 Jan 2009) | 1 line
branches/zip: trx0sys.ic: Remove unnecessary #include <data0type.h>.
------------------------------------------------------------------------
r4052 | marko | 2009-01-28 15:21:45 +0200 (Wed, 28 Jan 2009) | 5 lines
branches/zip: Enclose some functions inside #ifdef UNIV_HOTBACKUP:
ut_sprintf_timestamp_without_extra_chars(), ut_get_year_month_day(),
log_reset_first_header_and_checkpoint(): These functions are only used
in InnoDB Hot Backup.
------------------------------------------------------------------------
r4056 | calvin | 2009-01-29 03:06:41 +0200 (Thu, 29 Jan 2009) | 33 lines
branches/zip: Merge revisions 4032:4035 from branches/5.1
All InnoDB related tests passed on Windows, except
known failure in partition_innodb_semi_consistent.
The inadvertent change to btr0sea.c in this commit is reverted in r4060.
------------------------------------------------------------------------
r4035 | vasil | 2009-01-26 09:26:25 -0600 (Mon, 26 Jan 2009) | 23 lines
branches/5.1:
Merge a change from MySQL:
------------------------------------------------------------
revno: 2646.161.4
committer: Tatiana A. Nurnberg <azundris@mysql.com>
branch nick: 51-31177v2
timestamp: Mon 2009-01-12 06:32:49 +0100
message:
Bug#31177: Server variables can't be set to their current values
Bounds-checks and blocksize corrections were applied to user-input,
but constants in the server were trusted implicitly. If these values
did not actually meet the requirements, the user could not set change
a variable, then set it back to the (wonky) factory default or maximum
by explicitly specifying it (SET <var>=<value> vs SET <var>=DEFAULT).
Now checks also apply to the server's presets. Wonky values and maxima
get corrected at startup. Consequently all non-offsetted values the user
sees are valid, and users can set the variable to that exact value if
they so desire.
------------------------------------------------------------------------
r4060 | marko | 2009-01-29 09:39:04 +0200 (Thu, 29 Jan 2009) | 1 line
branches/zip: btr0sea.c: Revert the inadvertent change made in r4056.
------------------------------------------------------------------------
2009-01-29 09:47:07 +00:00
|
|
|
block = buf_block_align(rec);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
if (UNIV_LIKELY(!has_search_latch)) {
|
|
|
|
|
2006-09-19 10:14:07 +00:00
|
|
|
if (UNIV_UNLIKELY(
|
2006-10-12 11:05:22 +00:00
|
|
|
!buf_page_get_known_nowait(latch_mode, block,
|
2006-09-19 10:14:07 +00:00
|
|
|
BUF_MAKE_YOUNG,
|
|
|
|
__FILE__, __LINE__,
|
|
|
|
mtr))) {
|
2005-10-27 07:29:40 +00:00
|
|
|
goto failure_unlock;
|
|
|
|
}
|
|
|
|
|
|
|
|
rw_lock_s_unlock(&btr_search_latch);
|
|
|
|
|
2006-10-12 11:05:22 +00:00
|
|
|
buf_block_dbg_add_level(block, SYNC_TREE_NODE_FROM_HASH);
|
2005-10-27 07:29:40 +00:00
|
|
|
}
|
|
|
|
|
branches/innodb+: Merge revisions 4006:4060 from branches/zip:
------------------------------------------------------------------------
r4008 | vasil | 2009-01-20 17:01:08 +0200 (Tue, 20 Jan 2009) | 4 lines
branches/zip:
Add ChangeLog entries for the bugfixes in r4004 and r4005.
------------------------------------------------------------------------
r4027 | marko | 2009-01-23 11:04:49 +0200 (Fri, 23 Jan 2009) | 1 line
branches/zip: Remove some redundant #include statements.
------------------------------------------------------------------------
r4028 | marko | 2009-01-23 11:26:10 +0200 (Fri, 23 Jan 2009) | 13 lines
branches/zip: Enclose some more unused code in #ifdef UNIV_LOG_ARCHIVE.
This will help trim the dependencies of InnoDB Hot Backup.
recv_recovery_from_checkpoint_start(): Rename to
recv_recovery_from_checkpoint_start_func(), and remove the two first
parameters unless UNIV_LOG_ARCHIVE is defined. Define and use
the auxiliary macros TYPE_CHECKPOINT and LIMIT_LSN in the function.
struct recv_sys_struct: Remove archive_group unless UNIV_LOG_ARCHIVE
is defined.
Do not define LOG_ARCHIVE unless UNIV_LOG_ARCHIVE is defined.
------------------------------------------------------------------------
r4029 | marko | 2009-01-23 14:07:38 +0200 (Fri, 23 Jan 2009) | 1 line
branches/zip: Remove some redundant #include directives.
------------------------------------------------------------------------
r4030 | marko | 2009-01-23 15:31:36 +0200 (Fri, 23 Jan 2009) | 2 lines
branches/zip: buf_page_get_gen(): Remove the unused mode BUF_GET_NOWAIT.
This was noticed while investigating Issue #160.
------------------------------------------------------------------------
r4033 | marko | 2009-01-23 15:49:04 +0200 (Fri, 23 Jan 2009) | 16 lines
branches/zip: Merge revisions 4005:4032 from branches/5.1:
------------------------------------------------------------------------
r4032 | marko | 2009-01-23 15:43:51 +0200 (Fri, 23 Jan 2009) | 10 lines
branches/5.1: Merge r4031 from branches/5.0:
btr_search_drop_page_hash_when_freed(): Check if buf_page_get_gen()
returns NULL. The page may have been evicted from the buffer pool
between buf_page_peek_if_search_hashed() and buf_page_get_gen(),
because the buffer pool mutex will be released between these two calls.
(Bug #42279, Issue #160)
rb://82 approved by Heikki Tuuri
------------------------------------------------------------------------
------------------------------------------------------------------------
r4034 | marko | 2009-01-26 16:16:39 +0200 (Mon, 26 Jan 2009) | 2 lines
branches/zip: buf_page_get_gen(): Fix a "possibly uninitialized" warning
that was introduced in r4030.
------------------------------------------------------------------------
r4036 | marko | 2009-01-26 22:33:20 +0200 (Mon, 26 Jan 2009) | 22 lines
branches/zip: In r988, the function buf_block_align() was enclosed
within UNIV_DEBUG. The two remaining callers in non-debug builds,
btr_search_guess_on_hash() and btr_search_validate(), were rewritten
to call buf_page_hash_get().
To implement support for a resizeable buffer pool, the function
buf_block_align() had been rewritten to perform a page hash lookup in
the buffer pool. The caller was also made responsible for holding the
buffer pool mutex.
Because the page hash lookup is expensive and it has to be done while
holding the buffer pool mutex, implement buf_block_align() by pointer
arithmetics again, and make btr_search_guess_on_hash() call it. Note
that this will have to be adjusted if the interface to the resizeable
buffer pool is actually implemented.
rb://83 approved by Heikki Tuuri, to address Issue #161.
As a deviation from the approved patch, this patch also makes
btr_search_validate() (invoked by CHECK TABLE) check that
buf_pool->page_hash is consistent with buf_block_align().
------------------------------------------------------------------------
r4039 | vasil | 2009-01-27 08:04:17 +0200 (Tue, 27 Jan 2009) | 5 lines
branches/zip:
Adjust the paths in innodb_file_per_table.diff with a recent rename of
the test/result files in the MySQL tree.
------------------------------------------------------------------------
r4042 | marko | 2009-01-27 10:05:24 +0200 (Tue, 27 Jan 2009) | 2 lines
branches/zip: buf_LRU_invalidate_tablespace(): Fix a race condition:
read zip_size while still holding block_mutex.
------------------------------------------------------------------------
r4045 | marko | 2009-01-28 00:31:17 +0200 (Wed, 28 Jan 2009) | 8 lines
branches/zip: btr_search_validate(): Fix a bogus UNIV_DEBUG
assertion failure that was accidentally introduced in r4036.
Instead of calling buf_block_get_frame(), which asserts that the
block must be buffer-fixed, access block->frame directly. That
is safe, because changes of block->page.state are protected by
the buffer pool mutex, which we are holding.
This bug was reported by Michael.
------------------------------------------------------------------------
r4046 | marko | 2009-01-28 00:33:20 +0200 (Wed, 28 Jan 2009) | 2 lines
branches/zip: Revert the change to univ.i that was accidentally
committed in r4045.
------------------------------------------------------------------------
r4047 | marko | 2009-01-28 00:46:13 +0200 (Wed, 28 Jan 2009) | 6 lines
branches/zip: btr_search_validate(): Fix an assertion failure that was
introduced in r4036.
Do not call buf_block_get_space(), buf_block_get_page_no()
unless the block state is BUF_BLOCK_FILE_PAGE.
This bug was reported by Michael.
------------------------------------------------------------------------
r4050 | vasil | 2009-01-28 08:21:44 +0200 (Wed, 28 Jan 2009) | 5 lines
branches/zip:
Adjust the paths in innodb_lock_wait_timeout.diff with a recent rename of
the test/result files in the MySQL tree.
------------------------------------------------------------------------
r4051 | marko | 2009-01-28 14:35:49 +0200 (Wed, 28 Jan 2009) | 1 line
branches/zip: trx0sys.ic: Remove unnecessary #include <data0type.h>.
------------------------------------------------------------------------
r4052 | marko | 2009-01-28 15:21:45 +0200 (Wed, 28 Jan 2009) | 5 lines
branches/zip: Enclose some functions inside #ifdef UNIV_HOTBACKUP:
ut_sprintf_timestamp_without_extra_chars(), ut_get_year_month_day(),
log_reset_first_header_and_checkpoint(): These functions are only used
in InnoDB Hot Backup.
------------------------------------------------------------------------
r4056 | calvin | 2009-01-29 03:06:41 +0200 (Thu, 29 Jan 2009) | 33 lines
branches/zip: Merge revisions 4032:4035 from branches/5.1
All InnoDB related tests passed on Windows, except
known failure in partition_innodb_semi_consistent.
The inadvertent change to btr0sea.c in this commit is reverted in r4060.
------------------------------------------------------------------------
r4035 | vasil | 2009-01-26 09:26:25 -0600 (Mon, 26 Jan 2009) | 23 lines
branches/5.1:
Merge a change from MySQL:
------------------------------------------------------------
revno: 2646.161.4
committer: Tatiana A. Nurnberg <azundris@mysql.com>
branch nick: 51-31177v2
timestamp: Mon 2009-01-12 06:32:49 +0100
message:
Bug#31177: Server variables can't be set to their current values
Bounds-checks and blocksize corrections were applied to user-input,
but constants in the server were trusted implicitly. If these values
did not actually meet the requirements, the user could not set change
a variable, then set it back to the (wonky) factory default or maximum
by explicitly specifying it (SET <var>=<value> vs SET <var>=DEFAULT).
Now checks also apply to the server's presets. Wonky values and maxima
get corrected at startup. Consequently all non-offsetted values the user
sees are valid, and users can set the variable to that exact value if
they so desire.
------------------------------------------------------------------------
r4060 | marko | 2009-01-29 09:39:04 +0200 (Thu, 29 Jan 2009) | 1 line
branches/zip: btr0sea.c: Revert the inadvertent change made in r4056.
------------------------------------------------------------------------
2009-01-29 09:47:07 +00:00
|
|
|
if (UNIV_UNLIKELY(buf_block_get_state(block) != BUF_BLOCK_FILE_PAGE)) {
|
|
|
|
ut_ad(buf_block_get_state(block) == BUF_BLOCK_REMOVE_HASH);
|
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
if (UNIV_LIKELY(!has_search_latch)) {
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2006-10-13 07:45:52 +00:00
|
|
|
btr_leaf_page_release(block, latch_mode, mtr);
|
2005-10-27 07:29:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
goto failure;
|
|
|
|
}
|
|
|
|
|
|
|
|
ut_ad(page_rec_is_user_rec(rec));
|
|
|
|
|
2006-10-18 11:39:31 +00:00
|
|
|
btr_cur_position(index, rec, block, cursor);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
/* Check the validity of the guess within the page */
|
|
|
|
|
|
|
|
/* If we only have the latch on btr_search_latch, not on the
|
|
|
|
page, it only protects the columns of the record the cursor
|
|
|
|
is positioned on. We cannot look at the next of the previous
|
|
|
|
record to determine if our guess for the cursor position is
|
|
|
|
right. */
|
branches/innodb+: Merge revisions 4006:4060 from branches/zip:
------------------------------------------------------------------------
r4008 | vasil | 2009-01-20 17:01:08 +0200 (Tue, 20 Jan 2009) | 4 lines
branches/zip:
Add ChangeLog entries for the bugfixes in r4004 and r4005.
------------------------------------------------------------------------
r4027 | marko | 2009-01-23 11:04:49 +0200 (Fri, 23 Jan 2009) | 1 line
branches/zip: Remove some redundant #include statements.
------------------------------------------------------------------------
r4028 | marko | 2009-01-23 11:26:10 +0200 (Fri, 23 Jan 2009) | 13 lines
branches/zip: Enclose some more unused code in #ifdef UNIV_LOG_ARCHIVE.
This will help trim the dependencies of InnoDB Hot Backup.
recv_recovery_from_checkpoint_start(): Rename to
recv_recovery_from_checkpoint_start_func(), and remove the two first
parameters unless UNIV_LOG_ARCHIVE is defined. Define and use
the auxiliary macros TYPE_CHECKPOINT and LIMIT_LSN in the function.
struct recv_sys_struct: Remove archive_group unless UNIV_LOG_ARCHIVE
is defined.
Do not define LOG_ARCHIVE unless UNIV_LOG_ARCHIVE is defined.
------------------------------------------------------------------------
r4029 | marko | 2009-01-23 14:07:38 +0200 (Fri, 23 Jan 2009) | 1 line
branches/zip: Remove some redundant #include directives.
------------------------------------------------------------------------
r4030 | marko | 2009-01-23 15:31:36 +0200 (Fri, 23 Jan 2009) | 2 lines
branches/zip: buf_page_get_gen(): Remove the unused mode BUF_GET_NOWAIT.
This was noticed while investigating Issue #160.
------------------------------------------------------------------------
r4033 | marko | 2009-01-23 15:49:04 +0200 (Fri, 23 Jan 2009) | 16 lines
branches/zip: Merge revisions 4005:4032 from branches/5.1:
------------------------------------------------------------------------
r4032 | marko | 2009-01-23 15:43:51 +0200 (Fri, 23 Jan 2009) | 10 lines
branches/5.1: Merge r4031 from branches/5.0:
btr_search_drop_page_hash_when_freed(): Check if buf_page_get_gen()
returns NULL. The page may have been evicted from the buffer pool
between buf_page_peek_if_search_hashed() and buf_page_get_gen(),
because the buffer pool mutex will be released between these two calls.
(Bug #42279, Issue #160)
rb://82 approved by Heikki Tuuri
------------------------------------------------------------------------
------------------------------------------------------------------------
r4034 | marko | 2009-01-26 16:16:39 +0200 (Mon, 26 Jan 2009) | 2 lines
branches/zip: buf_page_get_gen(): Fix a "possibly uninitialized" warning
that was introduced in r4030.
------------------------------------------------------------------------
r4036 | marko | 2009-01-26 22:33:20 +0200 (Mon, 26 Jan 2009) | 22 lines
branches/zip: In r988, the function buf_block_align() was enclosed
within UNIV_DEBUG. The two remaining callers in non-debug builds,
btr_search_guess_on_hash() and btr_search_validate(), were rewritten
to call buf_page_hash_get().
To implement support for a resizeable buffer pool, the function
buf_block_align() had been rewritten to perform a page hash lookup in
the buffer pool. The caller was also made responsible for holding the
buffer pool mutex.
Because the page hash lookup is expensive and it has to be done while
holding the buffer pool mutex, implement buf_block_align() by pointer
arithmetics again, and make btr_search_guess_on_hash() call it. Note
that this will have to be adjusted if the interface to the resizeable
buffer pool is actually implemented.
rb://83 approved by Heikki Tuuri, to address Issue #161.
As a deviation from the approved patch, this patch also makes
btr_search_validate() (invoked by CHECK TABLE) check that
buf_pool->page_hash is consistent with buf_block_align().
------------------------------------------------------------------------
r4039 | vasil | 2009-01-27 08:04:17 +0200 (Tue, 27 Jan 2009) | 5 lines
branches/zip:
Adjust the paths in innodb_file_per_table.diff with a recent rename of
the test/result files in the MySQL tree.
------------------------------------------------------------------------
r4042 | marko | 2009-01-27 10:05:24 +0200 (Tue, 27 Jan 2009) | 2 lines
branches/zip: buf_LRU_invalidate_tablespace(): Fix a race condition:
read zip_size while still holding block_mutex.
------------------------------------------------------------------------
r4045 | marko | 2009-01-28 00:31:17 +0200 (Wed, 28 Jan 2009) | 8 lines
branches/zip: btr_search_validate(): Fix a bogus UNIV_DEBUG
assertion failure that was accidentally introduced in r4036.
Instead of calling buf_block_get_frame(), which asserts that the
block must be buffer-fixed, access block->frame directly. That
is safe, because changes of block->page.state are protected by
the buffer pool mutex, which we are holding.
This bug was reported by Michael.
------------------------------------------------------------------------
r4046 | marko | 2009-01-28 00:33:20 +0200 (Wed, 28 Jan 2009) | 2 lines
branches/zip: Revert the change to univ.i that was accidentally
committed in r4045.
------------------------------------------------------------------------
r4047 | marko | 2009-01-28 00:46:13 +0200 (Wed, 28 Jan 2009) | 6 lines
branches/zip: btr_search_validate(): Fix an assertion failure that was
introduced in r4036.
Do not call buf_block_get_space(), buf_block_get_page_no()
unless the block state is BUF_BLOCK_FILE_PAGE.
This bug was reported by Michael.
------------------------------------------------------------------------
r4050 | vasil | 2009-01-28 08:21:44 +0200 (Wed, 28 Jan 2009) | 5 lines
branches/zip:
Adjust the paths in innodb_lock_wait_timeout.diff with a recent rename of
the test/result files in the MySQL tree.
------------------------------------------------------------------------
r4051 | marko | 2009-01-28 14:35:49 +0200 (Wed, 28 Jan 2009) | 1 line
branches/zip: trx0sys.ic: Remove unnecessary #include <data0type.h>.
------------------------------------------------------------------------
r4052 | marko | 2009-01-28 15:21:45 +0200 (Wed, 28 Jan 2009) | 5 lines
branches/zip: Enclose some functions inside #ifdef UNIV_HOTBACKUP:
ut_sprintf_timestamp_without_extra_chars(), ut_get_year_month_day(),
log_reset_first_header_and_checkpoint(): These functions are only used
in InnoDB Hot Backup.
------------------------------------------------------------------------
r4056 | calvin | 2009-01-29 03:06:41 +0200 (Thu, 29 Jan 2009) | 33 lines
branches/zip: Merge revisions 4032:4035 from branches/5.1
All InnoDB related tests passed on Windows, except
known failure in partition_innodb_semi_consistent.
The inadvertent change to btr0sea.c in this commit is reverted in r4060.
------------------------------------------------------------------------
r4035 | vasil | 2009-01-26 09:26:25 -0600 (Mon, 26 Jan 2009) | 23 lines
branches/5.1:
Merge a change from MySQL:
------------------------------------------------------------
revno: 2646.161.4
committer: Tatiana A. Nurnberg <azundris@mysql.com>
branch nick: 51-31177v2
timestamp: Mon 2009-01-12 06:32:49 +0100
message:
Bug#31177: Server variables can't be set to their current values
Bounds-checks and blocksize corrections were applied to user-input,
but constants in the server were trusted implicitly. If these values
did not actually meet the requirements, the user could not set change
a variable, then set it back to the (wonky) factory default or maximum
by explicitly specifying it (SET <var>=<value> vs SET <var>=DEFAULT).
Now checks also apply to the server's presets. Wonky values and maxima
get corrected at startup. Consequently all non-offsetted values the user
sees are valid, and users can set the variable to that exact value if
they so desire.
------------------------------------------------------------------------
r4060 | marko | 2009-01-29 09:39:04 +0200 (Thu, 29 Jan 2009) | 1 line
branches/zip: btr0sea.c: Revert the inadvertent change made in r4056.
------------------------------------------------------------------------
2009-01-29 09:47:07 +00:00
|
|
|
if (UNIV_EXPECT
|
|
|
|
(ut_dulint_cmp(index_id, btr_page_get_index_id(block->frame)), 0)
|
2006-08-29 09:30:31 +00:00
|
|
|
|| !btr_search_check_guess(cursor,
|
2007-01-31 14:28:37 +00:00
|
|
|
has_search_latch,
|
2006-08-29 09:30:31 +00:00
|
|
|
tuple, mode, mtr)) {
|
2005-10-27 07:29:40 +00:00
|
|
|
if (UNIV_LIKELY(!has_search_latch)) {
|
2006-10-13 07:45:52 +00:00
|
|
|
btr_leaf_page_release(block, latch_mode, mtr);
|
2005-10-27 07:29:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
goto failure;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (UNIV_LIKELY(info->n_hash_potential < BTR_SEARCH_BUILD_LIMIT + 5)) {
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
info->n_hash_potential++;
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef notdefined
|
|
|
|
/* These lines of code can be used in a debug version to check
|
|
|
|
the correctness of the searched cursor position: */
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
info->last_hash_succ = FALSE;
|
|
|
|
|
|
|
|
/* Currently, does not work if the following fails: */
|
|
|
|
ut_ad(!has_search_latch);
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2006-10-13 07:45:52 +00:00
|
|
|
btr_leaf_page_release(block, latch_mode, mtr);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
btr_cur_search_to_nth_level(index, 0, tuple, mode, latch_mode,
|
2006-08-29 09:30:31 +00:00
|
|
|
&cursor2, 0, mtr);
|
2005-10-27 07:29:40 +00:00
|
|
|
if (mode == PAGE_CUR_GE
|
2006-08-29 09:30:31 +00:00
|
|
|
&& page_rec_is_supremum(btr_cur_get_rec(&cursor2))) {
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
/* If mode is PAGE_CUR_GE, then the binary search
|
|
|
|
in the index tree may actually take us to the supremum
|
|
|
|
of the previous page */
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
info->last_hash_succ = FALSE;
|
|
|
|
|
|
|
|
btr_pcur_open_on_user_rec(index, tuple, mode, latch_mode,
|
2006-08-29 09:30:31 +00:00
|
|
|
&pcur, mtr);
|
2005-10-27 07:29:40 +00:00
|
|
|
ut_ad(btr_pcur_get_rec(&pcur) == btr_cur_get_rec(cursor));
|
|
|
|
} else {
|
|
|
|
ut_ad(btr_cur_get_rec(&cursor2) == btr_cur_get_rec(cursor));
|
|
|
|
}
|
|
|
|
|
|
|
|
/* NOTE that it is theoretically possible that the above assertions
|
|
|
|
fail if the page of the cursor gets removed from the buffer pool
|
|
|
|
meanwhile! Thus it might not be a bug. */
|
|
|
|
#endif
|
|
|
|
info->last_hash_succ = TRUE;
|
|
|
|
|
|
|
|
#ifdef UNIV_SEARCH_PERF_STAT
|
|
|
|
btr_search_n_succ++;
|
|
|
|
#endif
|
|
|
|
if (UNIV_LIKELY(!has_search_latch)
|
2007-08-01 11:18:43 +00:00
|
|
|
&& buf_page_peek_if_too_old(&block->page)) {
|
2005-10-27 07:29:40 +00:00
|
|
|
|
2006-11-30 12:27:49 +00:00
|
|
|
buf_page_make_young(&block->page);
|
2006-02-23 19:25:29 +00:00
|
|
|
}
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
/* Increment the page get statistics though we did not really
|
|
|
|
fix the page: for user info only */
|
|
|
|
|
|
|
|
buf_pool->n_page_gets++;
|
|
|
|
|
2006-02-23 19:25:29 +00:00
|
|
|
return(TRUE);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
/*-------------------------------------------*/
|
|
|
|
failure_unlock:
|
|
|
|
if (UNIV_LIKELY(!has_search_latch)) {
|
|
|
|
rw_lock_s_unlock(&btr_search_latch);
|
|
|
|
}
|
|
|
|
failure:
|
|
|
|
cursor->flag = BTR_CUR_HASH_FAIL;
|
|
|
|
|
|
|
|
#ifdef UNIV_SEARCH_PERF_STAT
|
2006-04-12 09:32:17 +00:00
|
|
|
info->n_hash_fail++;
|
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
if (info->n_hash_succ > 0) {
|
|
|
|
info->n_hash_succ--;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
info->last_hash_succ = FALSE;
|
|
|
|
|
|
|
|
return(FALSE);
|
|
|
|
}
|
|
|
|
|
|
|
|
/************************************************************************
|
|
|
|
Drops a page hash index. */
|
2008-02-06 14:17:36 +00:00
|
|
|
UNIV_INTERN
|
2005-10-27 07:29:40 +00:00
|
|
|
void
|
|
|
|
btr_search_drop_page_hash_index(
|
|
|
|
/*============================*/
|
2009-05-25 06:46:10 +00:00
|
|
|
buf_block_t* block) /*!< in: block containing index page,
|
2006-10-12 11:05:22 +00:00
|
|
|
s- or x-latched, or an index page
|
|
|
|
for which we know that
|
|
|
|
block->buf_fix_count == 0 */
|
2005-10-27 07:29:40 +00:00
|
|
|
{
|
2008-09-17 19:52:30 +00:00
|
|
|
hash_table_t* table;
|
|
|
|
ulint n_fields;
|
|
|
|
ulint n_bytes;
|
|
|
|
const page_t* page;
|
|
|
|
const rec_t* rec;
|
|
|
|
ulint fold;
|
|
|
|
ulint prev_fold;
|
|
|
|
dulint index_id;
|
|
|
|
ulint n_cached;
|
|
|
|
ulint n_recs;
|
|
|
|
ulint* folds;
|
|
|
|
ulint i;
|
|
|
|
mem_heap_t* heap;
|
|
|
|
const dict_index_t* index;
|
|
|
|
ulint* offsets;
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
#ifdef UNIV_SYNC_DEBUG
|
|
|
|
ut_ad(!rw_lock_own(&btr_search_latch, RW_LOCK_SHARED));
|
|
|
|
ut_ad(!rw_lock_own(&btr_search_latch, RW_LOCK_EX));
|
|
|
|
#endif /* UNIV_SYNC_DEBUG */
|
2006-10-12 11:05:22 +00:00
|
|
|
|
2006-02-17 14:19:39 +00:00
|
|
|
retry:
|
2005-10-27 07:29:40 +00:00
|
|
|
rw_lock_s_lock(&btr_search_latch);
|
2006-10-20 13:49:42 +00:00
|
|
|
page = block->frame;
|
2005-10-27 07:29:40 +00:00
|
|
|
|
2006-02-17 14:19:39 +00:00
|
|
|
if (UNIV_LIKELY(!block->is_hashed)) {
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
rw_lock_s_unlock(&btr_search_latch);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
table = btr_search_sys->hash_index;
|
|
|
|
|
|
|
|
#ifdef UNIV_SYNC_DEBUG
|
|
|
|
ut_ad(rw_lock_own(&(block->lock), RW_LOCK_SHARED)
|
2006-08-29 09:30:31 +00:00
|
|
|
|| rw_lock_own(&(block->lock), RW_LOCK_EX)
|
2006-11-30 12:27:49 +00:00
|
|
|
|| (block->page.buf_fix_count == 0));
|
2005-10-27 07:29:40 +00:00
|
|
|
#endif /* UNIV_SYNC_DEBUG */
|
|
|
|
|
|
|
|
n_fields = block->curr_n_fields;
|
|
|
|
n_bytes = block->curr_n_bytes;
|
2005-11-29 12:30:46 +00:00
|
|
|
index = block->index;
|
2008-01-25 14:37:11 +00:00
|
|
|
ut_a(!dict_index_is_ibuf(index));
|
2005-10-27 07:29:40 +00:00
|
|
|
|
2005-11-29 12:30:46 +00:00
|
|
|
/* NOTE: The fields of block must not be accessed after
|
|
|
|
releasing btr_search_latch, as the index page might only
|
|
|
|
be s-latched! */
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
rw_lock_s_unlock(&btr_search_latch);
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2005-11-29 12:30:46 +00:00
|
|
|
ut_a(n_fields + n_bytes > 0);
|
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
n_recs = page_get_n_recs(page);
|
|
|
|
|
|
|
|
/* Calculate and cache fold values into an array for fast deletion
|
|
|
|
from the hash index */
|
|
|
|
|
|
|
|
folds = mem_alloc(n_recs * sizeof(ulint));
|
|
|
|
|
|
|
|
n_cached = 0;
|
|
|
|
|
|
|
|
rec = page_get_infimum_rec(page);
|
2008-09-17 19:52:30 +00:00
|
|
|
rec = page_rec_get_next_low(rec, page_is_comp(page));
|
2005-10-27 07:29:40 +00:00
|
|
|
|
2006-09-19 10:14:07 +00:00
|
|
|
index_id = btr_page_get_index_id(page);
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2006-09-19 10:14:07 +00:00
|
|
|
ut_a(0 == ut_dulint_cmp(index_id, index->id));
|
2006-02-17 14:19:39 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
prev_fold = 0;
|
|
|
|
|
|
|
|
heap = NULL;
|
|
|
|
offsets = NULL;
|
|
|
|
|
|
|
|
while (!page_rec_is_supremum(rec)) {
|
2005-11-29 12:30:46 +00:00
|
|
|
offsets = rec_get_offsets(rec, index, offsets,
|
2006-08-29 09:30:31 +00:00
|
|
|
n_fields + (n_bytes > 0), &heap);
|
2005-11-29 12:30:46 +00:00
|
|
|
ut_a(rec_offs_n_fields(offsets) == n_fields + (n_bytes > 0));
|
2006-09-19 10:14:07 +00:00
|
|
|
fold = rec_fold(rec, offsets, n_fields, n_bytes, index_id);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
if (fold == prev_fold && prev_fold != 0) {
|
|
|
|
|
|
|
|
goto next_rec;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Remove all hash nodes pointing to this page from the
|
|
|
|
hash chain */
|
|
|
|
|
|
|
|
folds[n_cached] = fold;
|
|
|
|
n_cached++;
|
|
|
|
next_rec:
|
2008-09-17 19:52:30 +00:00
|
|
|
rec = page_rec_get_next_low(rec, page_rec_is_comp(rec));
|
2005-10-27 07:29:40 +00:00
|
|
|
prev_fold = fold;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (UNIV_LIKELY_NULL(heap)) {
|
|
|
|
mem_heap_free(heap);
|
|
|
|
}
|
|
|
|
|
|
|
|
rw_lock_x_lock(&btr_search_latch);
|
|
|
|
|
2006-02-17 14:19:39 +00:00
|
|
|
if (UNIV_UNLIKELY(!block->is_hashed)) {
|
|
|
|
/* Someone else has meanwhile dropped the hash index */
|
|
|
|
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
ut_a(block->index == index);
|
|
|
|
|
|
|
|
if (UNIV_UNLIKELY(block->curr_n_fields != n_fields)
|
2006-08-29 09:30:31 +00:00
|
|
|
|| UNIV_UNLIKELY(block->curr_n_bytes != n_bytes)) {
|
2006-02-17 14:19:39 +00:00
|
|
|
|
|
|
|
/* Someone else has meanwhile built a new hash index on the
|
|
|
|
page, with different parameters */
|
|
|
|
|
|
|
|
rw_lock_x_unlock(&btr_search_latch);
|
|
|
|
|
|
|
|
mem_free(folds);
|
|
|
|
goto retry;
|
|
|
|
}
|
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
for (i = 0; i < n_cached; i++) {
|
|
|
|
|
2006-11-14 10:42:50 +00:00
|
|
|
ha_remove_all_nodes_to_page(table, folds[i], page);
|
2005-10-27 07:29:40 +00:00
|
|
|
}
|
|
|
|
|
2008-08-09 00:15:46 +00:00
|
|
|
ut_a(index->search_info->ref_count > 0);
|
|
|
|
index->search_info->ref_count--;
|
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
block->is_hashed = FALSE;
|
|
|
|
block->index = NULL;
|
2008-08-09 00:15:46 +00:00
|
|
|
|
2006-02-17 14:19:39 +00:00
|
|
|
cleanup:
|
2008-12-17 12:48:23 +00:00
|
|
|
#if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG
|
2006-02-17 14:19:39 +00:00
|
|
|
if (UNIV_UNLIKELY(block->n_pointers)) {
|
|
|
|
/* Corruption */
|
|
|
|
ut_print_timestamp(stderr);
|
|
|
|
fprintf(stderr,
|
2006-08-29 09:30:31 +00:00
|
|
|
" InnoDB: Corruption of adaptive hash index."
|
|
|
|
" After dropping\n"
|
|
|
|
"InnoDB: the hash index to a page of %s,"
|
|
|
|
" still %lu hash nodes remain.\n",
|
2006-02-17 14:19:39 +00:00
|
|
|
index->name, (ulong) block->n_pointers);
|
|
|
|
rw_lock_x_unlock(&btr_search_latch);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
2006-02-17 14:19:39 +00:00
|
|
|
btr_search_validate();
|
|
|
|
} else {
|
|
|
|
rw_lock_x_unlock(&btr_search_latch);
|
|
|
|
}
|
2008-12-17 12:48:23 +00:00
|
|
|
#else /* UNIV_AHI_DEBUG || UNIV_DEBUG */
|
2006-10-18 18:52:04 +00:00
|
|
|
rw_lock_x_unlock(&btr_search_latch);
|
2008-12-17 12:48:23 +00:00
|
|
|
#endif /* UNIV_AHI_DEBUG || UNIV_DEBUG */
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
mem_free(folds);
|
|
|
|
}
|
|
|
|
|
|
|
|
/************************************************************************
|
|
|
|
Drops a page hash index when a page is freed from a fseg to the file system.
|
|
|
|
Drops possible hash index if the page happens to be in the buffer pool. */
|
2008-02-06 14:17:36 +00:00
|
|
|
UNIV_INTERN
|
2005-10-27 07:29:40 +00:00
|
|
|
void
|
|
|
|
btr_search_drop_page_hash_when_freed(
|
|
|
|
/*=================================*/
|
2009-05-25 06:46:10 +00:00
|
|
|
ulint space, /*!< in: space id */
|
|
|
|
ulint zip_size, /*!< in: compressed page size in bytes
|
2007-01-18 09:59:00 +00:00
|
|
|
or 0 for uncompressed pages */
|
2009-05-25 06:46:10 +00:00
|
|
|
ulint page_no) /*!< in: page number */
|
2005-10-27 07:29:40 +00:00
|
|
|
{
|
2006-10-12 11:05:22 +00:00
|
|
|
buf_block_t* block;
|
|
|
|
mtr_t mtr;
|
2005-10-27 07:29:40 +00:00
|
|
|
|
2006-10-12 11:05:22 +00:00
|
|
|
if (!buf_page_peek_if_search_hashed(space, page_no)) {
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
mtr_start(&mtr);
|
|
|
|
|
|
|
|
/* We assume that if the caller has a latch on the page, then the
|
|
|
|
caller has already dropped the hash index for the page, and we never
|
|
|
|
get here. Therefore we can acquire the s-latch to the page without
|
|
|
|
having to fear a deadlock. */
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2007-01-18 09:59:00 +00:00
|
|
|
block = buf_page_get_gen(space, zip_size, page_no, RW_S_LATCH, NULL,
|
2005-10-27 07:29:40 +00:00
|
|
|
BUF_GET_IF_IN_POOL, __FILE__, __LINE__,
|
|
|
|
&mtr);
|
branches/innodb+: Merge revisions 4006:4060 from branches/zip:
------------------------------------------------------------------------
r4008 | vasil | 2009-01-20 17:01:08 +0200 (Tue, 20 Jan 2009) | 4 lines
branches/zip:
Add ChangeLog entries for the bugfixes in r4004 and r4005.
------------------------------------------------------------------------
r4027 | marko | 2009-01-23 11:04:49 +0200 (Fri, 23 Jan 2009) | 1 line
branches/zip: Remove some redundant #include statements.
------------------------------------------------------------------------
r4028 | marko | 2009-01-23 11:26:10 +0200 (Fri, 23 Jan 2009) | 13 lines
branches/zip: Enclose some more unused code in #ifdef UNIV_LOG_ARCHIVE.
This will help trim the dependencies of InnoDB Hot Backup.
recv_recovery_from_checkpoint_start(): Rename to
recv_recovery_from_checkpoint_start_func(), and remove the two first
parameters unless UNIV_LOG_ARCHIVE is defined. Define and use
the auxiliary macros TYPE_CHECKPOINT and LIMIT_LSN in the function.
struct recv_sys_struct: Remove archive_group unless UNIV_LOG_ARCHIVE
is defined.
Do not define LOG_ARCHIVE unless UNIV_LOG_ARCHIVE is defined.
------------------------------------------------------------------------
r4029 | marko | 2009-01-23 14:07:38 +0200 (Fri, 23 Jan 2009) | 1 line
branches/zip: Remove some redundant #include directives.
------------------------------------------------------------------------
r4030 | marko | 2009-01-23 15:31:36 +0200 (Fri, 23 Jan 2009) | 2 lines
branches/zip: buf_page_get_gen(): Remove the unused mode BUF_GET_NOWAIT.
This was noticed while investigating Issue #160.
------------------------------------------------------------------------
r4033 | marko | 2009-01-23 15:49:04 +0200 (Fri, 23 Jan 2009) | 16 lines
branches/zip: Merge revisions 4005:4032 from branches/5.1:
------------------------------------------------------------------------
r4032 | marko | 2009-01-23 15:43:51 +0200 (Fri, 23 Jan 2009) | 10 lines
branches/5.1: Merge r4031 from branches/5.0:
btr_search_drop_page_hash_when_freed(): Check if buf_page_get_gen()
returns NULL. The page may have been evicted from the buffer pool
between buf_page_peek_if_search_hashed() and buf_page_get_gen(),
because the buffer pool mutex will be released between these two calls.
(Bug #42279, Issue #160)
rb://82 approved by Heikki Tuuri
------------------------------------------------------------------------
------------------------------------------------------------------------
r4034 | marko | 2009-01-26 16:16:39 +0200 (Mon, 26 Jan 2009) | 2 lines
branches/zip: buf_page_get_gen(): Fix a "possibly uninitialized" warning
that was introduced in r4030.
------------------------------------------------------------------------
r4036 | marko | 2009-01-26 22:33:20 +0200 (Mon, 26 Jan 2009) | 22 lines
branches/zip: In r988, the function buf_block_align() was enclosed
within UNIV_DEBUG. The two remaining callers in non-debug builds,
btr_search_guess_on_hash() and btr_search_validate(), were rewritten
to call buf_page_hash_get().
To implement support for a resizeable buffer pool, the function
buf_block_align() had been rewritten to perform a page hash lookup in
the buffer pool. The caller was also made responsible for holding the
buffer pool mutex.
Because the page hash lookup is expensive and it has to be done while
holding the buffer pool mutex, implement buf_block_align() by pointer
arithmetics again, and make btr_search_guess_on_hash() call it. Note
that this will have to be adjusted if the interface to the resizeable
buffer pool is actually implemented.
rb://83 approved by Heikki Tuuri, to address Issue #161.
As a deviation from the approved patch, this patch also makes
btr_search_validate() (invoked by CHECK TABLE) check that
buf_pool->page_hash is consistent with buf_block_align().
------------------------------------------------------------------------
r4039 | vasil | 2009-01-27 08:04:17 +0200 (Tue, 27 Jan 2009) | 5 lines
branches/zip:
Adjust the paths in innodb_file_per_table.diff with a recent rename of
the test/result files in the MySQL tree.
------------------------------------------------------------------------
r4042 | marko | 2009-01-27 10:05:24 +0200 (Tue, 27 Jan 2009) | 2 lines
branches/zip: buf_LRU_invalidate_tablespace(): Fix a race condition:
read zip_size while still holding block_mutex.
------------------------------------------------------------------------
r4045 | marko | 2009-01-28 00:31:17 +0200 (Wed, 28 Jan 2009) | 8 lines
branches/zip: btr_search_validate(): Fix a bogus UNIV_DEBUG
assertion failure that was accidentally introduced in r4036.
Instead of calling buf_block_get_frame(), which asserts that the
block must be buffer-fixed, access block->frame directly. That
is safe, because changes of block->page.state are protected by
the buffer pool mutex, which we are holding.
This bug was reported by Michael.
------------------------------------------------------------------------
r4046 | marko | 2009-01-28 00:33:20 +0200 (Wed, 28 Jan 2009) | 2 lines
branches/zip: Revert the change to univ.i that was accidentally
committed in r4045.
------------------------------------------------------------------------
r4047 | marko | 2009-01-28 00:46:13 +0200 (Wed, 28 Jan 2009) | 6 lines
branches/zip: btr_search_validate(): Fix an assertion failure that was
introduced in r4036.
Do not call buf_block_get_space(), buf_block_get_page_no()
unless the block state is BUF_BLOCK_FILE_PAGE.
This bug was reported by Michael.
------------------------------------------------------------------------
r4050 | vasil | 2009-01-28 08:21:44 +0200 (Wed, 28 Jan 2009) | 5 lines
branches/zip:
Adjust the paths in innodb_lock_wait_timeout.diff with a recent rename of
the test/result files in the MySQL tree.
------------------------------------------------------------------------
r4051 | marko | 2009-01-28 14:35:49 +0200 (Wed, 28 Jan 2009) | 1 line
branches/zip: trx0sys.ic: Remove unnecessary #include <data0type.h>.
------------------------------------------------------------------------
r4052 | marko | 2009-01-28 15:21:45 +0200 (Wed, 28 Jan 2009) | 5 lines
branches/zip: Enclose some functions inside #ifdef UNIV_HOTBACKUP:
ut_sprintf_timestamp_without_extra_chars(), ut_get_year_month_day(),
log_reset_first_header_and_checkpoint(): These functions are only used
in InnoDB Hot Backup.
------------------------------------------------------------------------
r4056 | calvin | 2009-01-29 03:06:41 +0200 (Thu, 29 Jan 2009) | 33 lines
branches/zip: Merge revisions 4032:4035 from branches/5.1
All InnoDB related tests passed on Windows, except
known failure in partition_innodb_semi_consistent.
The inadvertent change to btr0sea.c in this commit is reverted in r4060.
------------------------------------------------------------------------
r4035 | vasil | 2009-01-26 09:26:25 -0600 (Mon, 26 Jan 2009) | 23 lines
branches/5.1:
Merge a change from MySQL:
------------------------------------------------------------
revno: 2646.161.4
committer: Tatiana A. Nurnberg <azundris@mysql.com>
branch nick: 51-31177v2
timestamp: Mon 2009-01-12 06:32:49 +0100
message:
Bug#31177: Server variables can't be set to their current values
Bounds-checks and blocksize corrections were applied to user-input,
but constants in the server were trusted implicitly. If these values
did not actually meet the requirements, the user could not set change
a variable, then set it back to the (wonky) factory default or maximum
by explicitly specifying it (SET <var>=<value> vs SET <var>=DEFAULT).
Now checks also apply to the server's presets. Wonky values and maxima
get corrected at startup. Consequently all non-offsetted values the user
sees are valid, and users can set the variable to that exact value if
they so desire.
------------------------------------------------------------------------
r4060 | marko | 2009-01-29 09:39:04 +0200 (Thu, 29 Jan 2009) | 1 line
branches/zip: btr0sea.c: Revert the inadvertent change made in r4056.
------------------------------------------------------------------------
2009-01-29 09:47:07 +00:00
|
|
|
/* Because the buffer pool mutex was released by
|
|
|
|
buf_page_peek_if_search_hashed(), it is possible that the
|
|
|
|
block was removed from the buffer pool by another thread
|
|
|
|
before buf_page_get_gen() got a chance to acquire the buffer
|
|
|
|
pool mutex again. Thus, we must check for a NULL return. */
|
2005-10-27 07:29:40 +00:00
|
|
|
|
branches/innodb+: Merge revisions 4006:4060 from branches/zip:
------------------------------------------------------------------------
r4008 | vasil | 2009-01-20 17:01:08 +0200 (Tue, 20 Jan 2009) | 4 lines
branches/zip:
Add ChangeLog entries for the bugfixes in r4004 and r4005.
------------------------------------------------------------------------
r4027 | marko | 2009-01-23 11:04:49 +0200 (Fri, 23 Jan 2009) | 1 line
branches/zip: Remove some redundant #include statements.
------------------------------------------------------------------------
r4028 | marko | 2009-01-23 11:26:10 +0200 (Fri, 23 Jan 2009) | 13 lines
branches/zip: Enclose some more unused code in #ifdef UNIV_LOG_ARCHIVE.
This will help trim the dependencies of InnoDB Hot Backup.
recv_recovery_from_checkpoint_start(): Rename to
recv_recovery_from_checkpoint_start_func(), and remove the two first
parameters unless UNIV_LOG_ARCHIVE is defined. Define and use
the auxiliary macros TYPE_CHECKPOINT and LIMIT_LSN in the function.
struct recv_sys_struct: Remove archive_group unless UNIV_LOG_ARCHIVE
is defined.
Do not define LOG_ARCHIVE unless UNIV_LOG_ARCHIVE is defined.
------------------------------------------------------------------------
r4029 | marko | 2009-01-23 14:07:38 +0200 (Fri, 23 Jan 2009) | 1 line
branches/zip: Remove some redundant #include directives.
------------------------------------------------------------------------
r4030 | marko | 2009-01-23 15:31:36 +0200 (Fri, 23 Jan 2009) | 2 lines
branches/zip: buf_page_get_gen(): Remove the unused mode BUF_GET_NOWAIT.
This was noticed while investigating Issue #160.
------------------------------------------------------------------------
r4033 | marko | 2009-01-23 15:49:04 +0200 (Fri, 23 Jan 2009) | 16 lines
branches/zip: Merge revisions 4005:4032 from branches/5.1:
------------------------------------------------------------------------
r4032 | marko | 2009-01-23 15:43:51 +0200 (Fri, 23 Jan 2009) | 10 lines
branches/5.1: Merge r4031 from branches/5.0:
btr_search_drop_page_hash_when_freed(): Check if buf_page_get_gen()
returns NULL. The page may have been evicted from the buffer pool
between buf_page_peek_if_search_hashed() and buf_page_get_gen(),
because the buffer pool mutex will be released between these two calls.
(Bug #42279, Issue #160)
rb://82 approved by Heikki Tuuri
------------------------------------------------------------------------
------------------------------------------------------------------------
r4034 | marko | 2009-01-26 16:16:39 +0200 (Mon, 26 Jan 2009) | 2 lines
branches/zip: buf_page_get_gen(): Fix a "possibly uninitialized" warning
that was introduced in r4030.
------------------------------------------------------------------------
r4036 | marko | 2009-01-26 22:33:20 +0200 (Mon, 26 Jan 2009) | 22 lines
branches/zip: In r988, the function buf_block_align() was enclosed
within UNIV_DEBUG. The two remaining callers in non-debug builds,
btr_search_guess_on_hash() and btr_search_validate(), were rewritten
to call buf_page_hash_get().
To implement support for a resizeable buffer pool, the function
buf_block_align() had been rewritten to perform a page hash lookup in
the buffer pool. The caller was also made responsible for holding the
buffer pool mutex.
Because the page hash lookup is expensive and it has to be done while
holding the buffer pool mutex, implement buf_block_align() by pointer
arithmetics again, and make btr_search_guess_on_hash() call it. Note
that this will have to be adjusted if the interface to the resizeable
buffer pool is actually implemented.
rb://83 approved by Heikki Tuuri, to address Issue #161.
As a deviation from the approved patch, this patch also makes
btr_search_validate() (invoked by CHECK TABLE) check that
buf_pool->page_hash is consistent with buf_block_align().
------------------------------------------------------------------------
r4039 | vasil | 2009-01-27 08:04:17 +0200 (Tue, 27 Jan 2009) | 5 lines
branches/zip:
Adjust the paths in innodb_file_per_table.diff with a recent rename of
the test/result files in the MySQL tree.
------------------------------------------------------------------------
r4042 | marko | 2009-01-27 10:05:24 +0200 (Tue, 27 Jan 2009) | 2 lines
branches/zip: buf_LRU_invalidate_tablespace(): Fix a race condition:
read zip_size while still holding block_mutex.
------------------------------------------------------------------------
r4045 | marko | 2009-01-28 00:31:17 +0200 (Wed, 28 Jan 2009) | 8 lines
branches/zip: btr_search_validate(): Fix a bogus UNIV_DEBUG
assertion failure that was accidentally introduced in r4036.
Instead of calling buf_block_get_frame(), which asserts that the
block must be buffer-fixed, access block->frame directly. That
is safe, because changes of block->page.state are protected by
the buffer pool mutex, which we are holding.
This bug was reported by Michael.
------------------------------------------------------------------------
r4046 | marko | 2009-01-28 00:33:20 +0200 (Wed, 28 Jan 2009) | 2 lines
branches/zip: Revert the change to univ.i that was accidentally
committed in r4045.
------------------------------------------------------------------------
r4047 | marko | 2009-01-28 00:46:13 +0200 (Wed, 28 Jan 2009) | 6 lines
branches/zip: btr_search_validate(): Fix an assertion failure that was
introduced in r4036.
Do not call buf_block_get_space(), buf_block_get_page_no()
unless the block state is BUF_BLOCK_FILE_PAGE.
This bug was reported by Michael.
------------------------------------------------------------------------
r4050 | vasil | 2009-01-28 08:21:44 +0200 (Wed, 28 Jan 2009) | 5 lines
branches/zip:
Adjust the paths in innodb_lock_wait_timeout.diff with a recent rename of
the test/result files in the MySQL tree.
------------------------------------------------------------------------
r4051 | marko | 2009-01-28 14:35:49 +0200 (Wed, 28 Jan 2009) | 1 line
branches/zip: trx0sys.ic: Remove unnecessary #include <data0type.h>.
------------------------------------------------------------------------
r4052 | marko | 2009-01-28 15:21:45 +0200 (Wed, 28 Jan 2009) | 5 lines
branches/zip: Enclose some functions inside #ifdef UNIV_HOTBACKUP:
ut_sprintf_timestamp_without_extra_chars(), ut_get_year_month_day(),
log_reset_first_header_and_checkpoint(): These functions are only used
in InnoDB Hot Backup.
------------------------------------------------------------------------
r4056 | calvin | 2009-01-29 03:06:41 +0200 (Thu, 29 Jan 2009) | 33 lines
branches/zip: Merge revisions 4032:4035 from branches/5.1
All InnoDB related tests passed on Windows, except
known failure in partition_innodb_semi_consistent.
The inadvertent change to btr0sea.c in this commit is reverted in r4060.
------------------------------------------------------------------------
r4035 | vasil | 2009-01-26 09:26:25 -0600 (Mon, 26 Jan 2009) | 23 lines
branches/5.1:
Merge a change from MySQL:
------------------------------------------------------------
revno: 2646.161.4
committer: Tatiana A. Nurnberg <azundris@mysql.com>
branch nick: 51-31177v2
timestamp: Mon 2009-01-12 06:32:49 +0100
message:
Bug#31177: Server variables can't be set to their current values
Bounds-checks and blocksize corrections were applied to user-input,
but constants in the server were trusted implicitly. If these values
did not actually meet the requirements, the user could not set change
a variable, then set it back to the (wonky) factory default or maximum
by explicitly specifying it (SET <var>=<value> vs SET <var>=DEFAULT).
Now checks also apply to the server's presets. Wonky values and maxima
get corrected at startup. Consequently all non-offsetted values the user
sees are valid, and users can set the variable to that exact value if
they so desire.
------------------------------------------------------------------------
r4060 | marko | 2009-01-29 09:39:04 +0200 (Thu, 29 Jan 2009) | 1 line
branches/zip: btr0sea.c: Revert the inadvertent change made in r4056.
------------------------------------------------------------------------
2009-01-29 09:47:07 +00:00
|
|
|
if (UNIV_LIKELY(block != NULL)) {
|
2005-10-27 07:29:40 +00:00
|
|
|
|
branches/innodb+: Merge revisions 4006:4060 from branches/zip:
------------------------------------------------------------------------
r4008 | vasil | 2009-01-20 17:01:08 +0200 (Tue, 20 Jan 2009) | 4 lines
branches/zip:
Add ChangeLog entries for the bugfixes in r4004 and r4005.
------------------------------------------------------------------------
r4027 | marko | 2009-01-23 11:04:49 +0200 (Fri, 23 Jan 2009) | 1 line
branches/zip: Remove some redundant #include statements.
------------------------------------------------------------------------
r4028 | marko | 2009-01-23 11:26:10 +0200 (Fri, 23 Jan 2009) | 13 lines
branches/zip: Enclose some more unused code in #ifdef UNIV_LOG_ARCHIVE.
This will help trim the dependencies of InnoDB Hot Backup.
recv_recovery_from_checkpoint_start(): Rename to
recv_recovery_from_checkpoint_start_func(), and remove the two first
parameters unless UNIV_LOG_ARCHIVE is defined. Define and use
the auxiliary macros TYPE_CHECKPOINT and LIMIT_LSN in the function.
struct recv_sys_struct: Remove archive_group unless UNIV_LOG_ARCHIVE
is defined.
Do not define LOG_ARCHIVE unless UNIV_LOG_ARCHIVE is defined.
------------------------------------------------------------------------
r4029 | marko | 2009-01-23 14:07:38 +0200 (Fri, 23 Jan 2009) | 1 line
branches/zip: Remove some redundant #include directives.
------------------------------------------------------------------------
r4030 | marko | 2009-01-23 15:31:36 +0200 (Fri, 23 Jan 2009) | 2 lines
branches/zip: buf_page_get_gen(): Remove the unused mode BUF_GET_NOWAIT.
This was noticed while investigating Issue #160.
------------------------------------------------------------------------
r4033 | marko | 2009-01-23 15:49:04 +0200 (Fri, 23 Jan 2009) | 16 lines
branches/zip: Merge revisions 4005:4032 from branches/5.1:
------------------------------------------------------------------------
r4032 | marko | 2009-01-23 15:43:51 +0200 (Fri, 23 Jan 2009) | 10 lines
branches/5.1: Merge r4031 from branches/5.0:
btr_search_drop_page_hash_when_freed(): Check if buf_page_get_gen()
returns NULL. The page may have been evicted from the buffer pool
between buf_page_peek_if_search_hashed() and buf_page_get_gen(),
because the buffer pool mutex will be released between these two calls.
(Bug #42279, Issue #160)
rb://82 approved by Heikki Tuuri
------------------------------------------------------------------------
------------------------------------------------------------------------
r4034 | marko | 2009-01-26 16:16:39 +0200 (Mon, 26 Jan 2009) | 2 lines
branches/zip: buf_page_get_gen(): Fix a "possibly uninitialized" warning
that was introduced in r4030.
------------------------------------------------------------------------
r4036 | marko | 2009-01-26 22:33:20 +0200 (Mon, 26 Jan 2009) | 22 lines
branches/zip: In r988, the function buf_block_align() was enclosed
within UNIV_DEBUG. The two remaining callers in non-debug builds,
btr_search_guess_on_hash() and btr_search_validate(), were rewritten
to call buf_page_hash_get().
To implement support for a resizeable buffer pool, the function
buf_block_align() had been rewritten to perform a page hash lookup in
the buffer pool. The caller was also made responsible for holding the
buffer pool mutex.
Because the page hash lookup is expensive and it has to be done while
holding the buffer pool mutex, implement buf_block_align() by pointer
arithmetics again, and make btr_search_guess_on_hash() call it. Note
that this will have to be adjusted if the interface to the resizeable
buffer pool is actually implemented.
rb://83 approved by Heikki Tuuri, to address Issue #161.
As a deviation from the approved patch, this patch also makes
btr_search_validate() (invoked by CHECK TABLE) check that
buf_pool->page_hash is consistent with buf_block_align().
------------------------------------------------------------------------
r4039 | vasil | 2009-01-27 08:04:17 +0200 (Tue, 27 Jan 2009) | 5 lines
branches/zip:
Adjust the paths in innodb_file_per_table.diff with a recent rename of
the test/result files in the MySQL tree.
------------------------------------------------------------------------
r4042 | marko | 2009-01-27 10:05:24 +0200 (Tue, 27 Jan 2009) | 2 lines
branches/zip: buf_LRU_invalidate_tablespace(): Fix a race condition:
read zip_size while still holding block_mutex.
------------------------------------------------------------------------
r4045 | marko | 2009-01-28 00:31:17 +0200 (Wed, 28 Jan 2009) | 8 lines
branches/zip: btr_search_validate(): Fix a bogus UNIV_DEBUG
assertion failure that was accidentally introduced in r4036.
Instead of calling buf_block_get_frame(), which asserts that the
block must be buffer-fixed, access block->frame directly. That
is safe, because changes of block->page.state are protected by
the buffer pool mutex, which we are holding.
This bug was reported by Michael.
------------------------------------------------------------------------
r4046 | marko | 2009-01-28 00:33:20 +0200 (Wed, 28 Jan 2009) | 2 lines
branches/zip: Revert the change to univ.i that was accidentally
committed in r4045.
------------------------------------------------------------------------
r4047 | marko | 2009-01-28 00:46:13 +0200 (Wed, 28 Jan 2009) | 6 lines
branches/zip: btr_search_validate(): Fix an assertion failure that was
introduced in r4036.
Do not call buf_block_get_space(), buf_block_get_page_no()
unless the block state is BUF_BLOCK_FILE_PAGE.
This bug was reported by Michael.
------------------------------------------------------------------------
r4050 | vasil | 2009-01-28 08:21:44 +0200 (Wed, 28 Jan 2009) | 5 lines
branches/zip:
Adjust the paths in innodb_lock_wait_timeout.diff with a recent rename of
the test/result files in the MySQL tree.
------------------------------------------------------------------------
r4051 | marko | 2009-01-28 14:35:49 +0200 (Wed, 28 Jan 2009) | 1 line
branches/zip: trx0sys.ic: Remove unnecessary #include <data0type.h>.
------------------------------------------------------------------------
r4052 | marko | 2009-01-28 15:21:45 +0200 (Wed, 28 Jan 2009) | 5 lines
branches/zip: Enclose some functions inside #ifdef UNIV_HOTBACKUP:
ut_sprintf_timestamp_without_extra_chars(), ut_get_year_month_day(),
log_reset_first_header_and_checkpoint(): These functions are only used
in InnoDB Hot Backup.
------------------------------------------------------------------------
r4056 | calvin | 2009-01-29 03:06:41 +0200 (Thu, 29 Jan 2009) | 33 lines
branches/zip: Merge revisions 4032:4035 from branches/5.1
All InnoDB related tests passed on Windows, except
known failure in partition_innodb_semi_consistent.
The inadvertent change to btr0sea.c in this commit is reverted in r4060.
------------------------------------------------------------------------
r4035 | vasil | 2009-01-26 09:26:25 -0600 (Mon, 26 Jan 2009) | 23 lines
branches/5.1:
Merge a change from MySQL:
------------------------------------------------------------
revno: 2646.161.4
committer: Tatiana A. Nurnberg <azundris@mysql.com>
branch nick: 51-31177v2
timestamp: Mon 2009-01-12 06:32:49 +0100
message:
Bug#31177: Server variables can't be set to their current values
Bounds-checks and blocksize corrections were applied to user-input,
but constants in the server were trusted implicitly. If these values
did not actually meet the requirements, the user could not set change
a variable, then set it back to the (wonky) factory default or maximum
by explicitly specifying it (SET <var>=<value> vs SET <var>=DEFAULT).
Now checks also apply to the server's presets. Wonky values and maxima
get corrected at startup. Consequently all non-offsetted values the user
sees are valid, and users can set the variable to that exact value if
they so desire.
------------------------------------------------------------------------
r4060 | marko | 2009-01-29 09:39:04 +0200 (Thu, 29 Jan 2009) | 1 line
branches/zip: btr0sea.c: Revert the inadvertent change made in r4056.
------------------------------------------------------------------------
2009-01-29 09:47:07 +00:00
|
|
|
buf_block_dbg_add_level(block, SYNC_TREE_NODE_FROM_HASH);
|
|
|
|
|
|
|
|
btr_search_drop_page_hash_index(block);
|
|
|
|
}
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
mtr_commit(&mtr);
|
|
|
|
}
|
|
|
|
|
|
|
|
/************************************************************************
|
|
|
|
Builds a hash index on a page with the given parameters. If the page already
|
|
|
|
has a hash index with different parameters, the old hash index is removed.
|
|
|
|
If index is non-NULL, this function checks if n_fields and n_bytes are
|
|
|
|
sensible values, and does not build a hash index if not. */
|
|
|
|
static
|
|
|
|
void
|
|
|
|
btr_search_build_page_hash_index(
|
|
|
|
/*=============================*/
|
2009-05-25 06:46:10 +00:00
|
|
|
dict_index_t* index, /*!< in: index for which to build */
|
|
|
|
buf_block_t* block, /*!< in: index page, s- or x-latched */
|
|
|
|
ulint n_fields,/*!< in: hash this many full fields */
|
|
|
|
ulint n_bytes,/*!< in: hash this many bytes from the next
|
2005-10-27 07:29:40 +00:00
|
|
|
field */
|
2009-05-25 06:46:10 +00:00
|
|
|
ibool left_side)/*!< in: hash for searches from left side? */
|
2005-10-27 07:29:40 +00:00
|
|
|
{
|
|
|
|
hash_table_t* table;
|
2006-10-19 08:27:34 +00:00
|
|
|
page_t* page;
|
2005-10-27 07:29:40 +00:00
|
|
|
rec_t* rec;
|
|
|
|
rec_t* next_rec;
|
|
|
|
ulint fold;
|
|
|
|
ulint next_fold;
|
2006-09-19 10:14:07 +00:00
|
|
|
dulint index_id;
|
2005-10-27 07:29:40 +00:00
|
|
|
ulint n_cached;
|
|
|
|
ulint n_recs;
|
|
|
|
ulint* folds;
|
|
|
|
rec_t** recs;
|
|
|
|
ulint i;
|
|
|
|
mem_heap_t* heap = NULL;
|
|
|
|
ulint offsets_[REC_OFFS_NORMAL_SIZE];
|
|
|
|
ulint* offsets = offsets_;
|
2007-09-28 07:05:57 +00:00
|
|
|
rec_offs_init(offsets_);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
ut_ad(index);
|
2008-01-25 14:37:11 +00:00
|
|
|
ut_a(!dict_index_is_ibuf(index));
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
table = btr_search_sys->hash_index;
|
2006-10-19 08:27:34 +00:00
|
|
|
page = buf_block_get_frame(block);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
#ifdef UNIV_SYNC_DEBUG
|
|
|
|
ut_ad(!rw_lock_own(&btr_search_latch, RW_LOCK_EX));
|
|
|
|
ut_ad(rw_lock_own(&(block->lock), RW_LOCK_SHARED)
|
2006-08-29 09:30:31 +00:00
|
|
|
|| rw_lock_own(&(block->lock), RW_LOCK_EX));
|
2005-10-27 07:29:40 +00:00
|
|
|
#endif /* UNIV_SYNC_DEBUG */
|
|
|
|
|
|
|
|
rw_lock_s_lock(&btr_search_latch);
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
if (block->is_hashed && ((block->curr_n_fields != n_fields)
|
2006-08-29 09:30:31 +00:00
|
|
|
|| (block->curr_n_bytes != n_bytes)
|
2006-09-19 10:14:07 +00:00
|
|
|
|| (block->curr_left_side != left_side))) {
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
rw_lock_s_unlock(&btr_search_latch);
|
|
|
|
|
2006-10-12 11:05:22 +00:00
|
|
|
btr_search_drop_page_hash_index(block);
|
2005-10-27 07:29:40 +00:00
|
|
|
} else {
|
|
|
|
rw_lock_s_unlock(&btr_search_latch);
|
|
|
|
}
|
|
|
|
|
|
|
|
n_recs = page_get_n_recs(page);
|
|
|
|
|
|
|
|
if (n_recs == 0) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Check that the values for hash index build are sensible */
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
if (n_fields + n_bytes == 0) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (dict_index_get_n_unique_in_tree(index) < n_fields
|
2006-08-29 09:30:31 +00:00
|
|
|
|| (dict_index_get_n_unique_in_tree(index) == n_fields
|
|
|
|
&& n_bytes > 0)) {
|
2005-10-27 07:29:40 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Calculate and cache fold values and corresponding records into
|
|
|
|
an array for fast insertion to the hash index */
|
|
|
|
|
|
|
|
folds = mem_alloc(n_recs * sizeof(ulint));
|
|
|
|
recs = mem_alloc(n_recs * sizeof(rec_t*));
|
|
|
|
|
|
|
|
n_cached = 0;
|
|
|
|
|
2006-09-19 10:14:07 +00:00
|
|
|
index_id = btr_page_get_index_id(page);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
2006-10-19 08:27:34 +00:00
|
|
|
rec = page_rec_get_next(page_get_infimum_rec(page));
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
offsets = rec_get_offsets(rec, index, offsets,
|
2006-08-29 09:30:31 +00:00
|
|
|
n_fields + (n_bytes > 0), &heap);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
if (!page_rec_is_supremum(rec)) {
|
|
|
|
ut_a(n_fields <= rec_offs_n_fields(offsets));
|
|
|
|
|
|
|
|
if (n_bytes > 0) {
|
|
|
|
ut_a(n_fields < rec_offs_n_fields(offsets));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-09-19 10:14:07 +00:00
|
|
|
fold = rec_fold(rec, offsets, n_fields, n_bytes, index_id);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
2006-09-19 10:14:07 +00:00
|
|
|
if (left_side) {
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
folds[n_cached] = fold;
|
|
|
|
recs[n_cached] = rec;
|
|
|
|
n_cached++;
|
|
|
|
}
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
for (;;) {
|
|
|
|
next_rec = page_rec_get_next(rec);
|
|
|
|
|
|
|
|
if (page_rec_is_supremum(next_rec)) {
|
|
|
|
|
2006-09-19 10:14:07 +00:00
|
|
|
if (!left_side) {
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
folds[n_cached] = fold;
|
|
|
|
recs[n_cached] = rec;
|
|
|
|
n_cached++;
|
|
|
|
}
|
|
|
|
|
2006-02-23 19:25:29 +00:00
|
|
|
break;
|
2005-10-27 07:29:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
offsets = rec_get_offsets(next_rec, index, offsets,
|
2006-08-29 09:30:31 +00:00
|
|
|
n_fields + (n_bytes > 0), &heap);
|
2005-10-27 07:29:40 +00:00
|
|
|
next_fold = rec_fold(next_rec, offsets, n_fields,
|
2006-09-19 10:14:07 +00:00
|
|
|
n_bytes, index_id);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
if (fold != next_fold) {
|
|
|
|
/* Insert an entry into the hash index */
|
|
|
|
|
2006-09-19 10:14:07 +00:00
|
|
|
if (left_side) {
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
folds[n_cached] = next_fold;
|
|
|
|
recs[n_cached] = next_rec;
|
|
|
|
n_cached++;
|
|
|
|
} else {
|
|
|
|
folds[n_cached] = fold;
|
|
|
|
recs[n_cached] = rec;
|
|
|
|
n_cached++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
rec = next_rec;
|
|
|
|
fold = next_fold;
|
|
|
|
}
|
|
|
|
|
|
|
|
btr_search_check_free_space_in_heap();
|
|
|
|
|
|
|
|
rw_lock_x_lock(&btr_search_latch);
|
|
|
|
|
branches/innodb+: Merge revisions 4070:4072 from branches/zip:
------------------------------------------------------------------------
r4072 | marko | 2009-01-30 23:30:29 +0200 (Fri, 30 Jan 2009) | 32 lines
branches/zip: Make innodb_adaptive_hash_index settable.
btr_search_disabled: Rename to btr_search_enabled and change the type
to char, so that it can be directly linked to the MySQL parameters.
Note that the variable is protected by btr_search_latch and
btr_search_enabled_mutex, a new mutex introduced in this patch.
btr_search_enabled_mutex: A new mutex, to protect btr_search_enabled
together with btr_search_latch.
buf_pool_drop_hash_index(): New function, to be called from
btr_search_disable().
btr_search_disable(), btr_search_enable(): Fix bugs. These functions
were previously unused.
btr_search_guess_on_hash(), btr_search_build_page_hash_index():
Check btr_search_enabled once more, while holding btr_search_latch.
btr_cur_search_to_nth_level(): Note that the reads of btr_search_enabled
may be dirty and explain why it should not be a problem.
innobase_adaptive_hash_index: Remove. The variable btr_search_enabled will be used directly instead.
innodb_adaptive_hash_index_update(): New function, an update callback for
innodb_adaptive_hash_index. This will call either btr_search_disable()
or btr_search_enable() when the value is assigned. The functions will
be called even if the value does not appear to be changed, e.g., when
setting from TRUE to TRUE or FALSE to FALSE.
rb://85 approved by Heikki Tuuri. This addresses Issue #163.
------------------------------------------------------------------------
2009-01-30 21:45:02 +00:00
|
|
|
if (UNIV_UNLIKELY(!btr_search_enabled)) {
|
|
|
|
goto exit_func;
|
|
|
|
}
|
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
if (block->is_hashed && ((block->curr_n_fields != n_fields)
|
2006-08-29 09:30:31 +00:00
|
|
|
|| (block->curr_n_bytes != n_bytes)
|
2006-09-19 10:14:07 +00:00
|
|
|
|| (block->curr_left_side != left_side))) {
|
2005-10-27 07:29:40 +00:00
|
|
|
goto exit_func;
|
|
|
|
}
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2008-08-09 00:15:46 +00:00
|
|
|
/* This counter is decremented every time we drop page
|
|
|
|
hash index entries and is incremented here. Since we can
|
|
|
|
rebuild hash index for a page that is already hashed, we
|
|
|
|
have to take care not to increment the counter in that
|
|
|
|
case. */
|
|
|
|
if (!block->is_hashed) {
|
|
|
|
index->search_info->ref_count++;
|
|
|
|
}
|
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
block->is_hashed = TRUE;
|
|
|
|
block->n_hash_helps = 0;
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
block->curr_n_fields = n_fields;
|
|
|
|
block->curr_n_bytes = n_bytes;
|
2006-09-19 10:14:07 +00:00
|
|
|
block->curr_left_side = left_side;
|
2005-10-27 07:29:40 +00:00
|
|
|
block->index = index;
|
|
|
|
|
|
|
|
for (i = 0; i < n_cached; i++) {
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2006-11-13 21:53:09 +00:00
|
|
|
ha_insert_for_fold(table, folds[i], block, recs[i]);
|
2005-10-27 07:29:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
exit_func:
|
|
|
|
rw_lock_x_unlock(&btr_search_latch);
|
|
|
|
|
|
|
|
mem_free(folds);
|
|
|
|
mem_free(recs);
|
|
|
|
if (UNIV_LIKELY_NULL(heap)) {
|
|
|
|
mem_heap_free(heap);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/************************************************************************
|
|
|
|
Moves or deletes hash entries for moved records. If new_page is already hashed,
|
|
|
|
then the hash index for page, if any, is dropped. If new_page is not hashed,
|
|
|
|
and page is hashed, then a new hash index is built to new_page with the same
|
|
|
|
parameters as page (this often happens when a page is split). */
|
2008-02-06 14:17:36 +00:00
|
|
|
UNIV_INTERN
|
2005-10-27 07:29:40 +00:00
|
|
|
void
|
|
|
|
btr_search_move_or_delete_hash_entries(
|
|
|
|
/*===================================*/
|
2009-05-25 06:46:10 +00:00
|
|
|
buf_block_t* new_block, /*!< in: records are copied
|
2005-10-27 07:29:40 +00:00
|
|
|
to this page */
|
2009-05-25 06:46:10 +00:00
|
|
|
buf_block_t* block, /*!< in: index page from which
|
2005-10-27 07:29:40 +00:00
|
|
|
records were copied, and the
|
|
|
|
copied records will be deleted
|
|
|
|
from this page */
|
2009-05-25 06:46:10 +00:00
|
|
|
dict_index_t* index) /*!< in: record descriptor */
|
2005-10-27 07:29:40 +00:00
|
|
|
{
|
2006-10-20 12:45:53 +00:00
|
|
|
ulint n_fields;
|
|
|
|
ulint n_bytes;
|
|
|
|
ibool left_side;
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
#ifdef UNIV_SYNC_DEBUG
|
|
|
|
ut_ad(rw_lock_own(&(block->lock), RW_LOCK_EX));
|
|
|
|
ut_ad(rw_lock_own(&(new_block->lock), RW_LOCK_EX));
|
|
|
|
#endif /* UNIV_SYNC_DEBUG */
|
|
|
|
ut_a(!new_block->is_hashed || new_block->index == index);
|
|
|
|
ut_a(!block->is_hashed || block->index == index);
|
2008-01-25 14:37:11 +00:00
|
|
|
ut_a(!(new_block->is_hashed || block->is_hashed)
|
|
|
|
|| !dict_index_is_ibuf(index));
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
rw_lock_s_lock(&btr_search_latch);
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
if (new_block->is_hashed) {
|
|
|
|
|
|
|
|
rw_lock_s_unlock(&btr_search_latch);
|
|
|
|
|
2006-10-12 11:05:22 +00:00
|
|
|
btr_search_drop_page_hash_index(block);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (block->is_hashed) {
|
|
|
|
|
|
|
|
n_fields = block->curr_n_fields;
|
|
|
|
n_bytes = block->curr_n_bytes;
|
2006-09-19 10:14:07 +00:00
|
|
|
left_side = block->curr_left_side;
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
new_block->n_fields = block->curr_n_fields;
|
|
|
|
new_block->n_bytes = block->curr_n_bytes;
|
2006-09-19 10:14:07 +00:00
|
|
|
new_block->left_side = left_side;
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
rw_lock_s_unlock(&btr_search_latch);
|
|
|
|
|
|
|
|
ut_a(n_fields + n_bytes > 0);
|
|
|
|
|
2006-10-19 08:27:34 +00:00
|
|
|
btr_search_build_page_hash_index(index, new_block, n_fields,
|
2006-09-19 10:14:07 +00:00
|
|
|
n_bytes, left_side);
|
2006-10-20 12:45:53 +00:00
|
|
|
ut_ad(n_fields == block->curr_n_fields);
|
|
|
|
ut_ad(n_bytes == block->curr_n_bytes);
|
|
|
|
ut_ad(left_side == block->curr_left_side);
|
2005-10-27 07:29:40 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
rw_lock_s_unlock(&btr_search_latch);
|
|
|
|
}
|
|
|
|
|
|
|
|
/************************************************************************
|
|
|
|
Updates the page hash index when a single record is deleted from a page. */
|
2008-02-06 14:17:36 +00:00
|
|
|
UNIV_INTERN
|
2005-10-27 07:29:40 +00:00
|
|
|
void
|
|
|
|
btr_search_update_hash_on_delete(
|
|
|
|
/*=============================*/
|
2009-05-25 06:46:10 +00:00
|
|
|
btr_cur_t* cursor) /*!< in: cursor which was positioned on the
|
2005-10-27 07:29:40 +00:00
|
|
|
record to delete using btr_cur_search_...,
|
|
|
|
the record is not yet deleted */
|
|
|
|
{
|
|
|
|
hash_table_t* table;
|
|
|
|
buf_block_t* block;
|
|
|
|
rec_t* rec;
|
|
|
|
ulint fold;
|
2006-09-19 10:14:07 +00:00
|
|
|
dulint index_id;
|
2005-10-27 07:29:40 +00:00
|
|
|
ibool found;
|
|
|
|
ulint offsets_[REC_OFFS_NORMAL_SIZE];
|
|
|
|
mem_heap_t* heap = NULL;
|
2007-09-28 07:05:57 +00:00
|
|
|
rec_offs_init(offsets_);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
rec = btr_cur_get_rec(cursor);
|
|
|
|
|
2006-10-19 08:27:34 +00:00
|
|
|
block = btr_cur_get_block(cursor);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
#ifdef UNIV_SYNC_DEBUG
|
|
|
|
ut_ad(rw_lock_own(&(block->lock), RW_LOCK_EX));
|
|
|
|
#endif /* UNIV_SYNC_DEBUG */
|
|
|
|
|
|
|
|
if (!block->is_hashed) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
ut_a(block->index == cursor->index);
|
|
|
|
ut_a(block->curr_n_fields + block->curr_n_bytes > 0);
|
2008-01-25 14:37:11 +00:00
|
|
|
ut_a(!dict_index_is_ibuf(cursor->index));
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
table = btr_search_sys->hash_index;
|
|
|
|
|
2006-09-19 10:14:07 +00:00
|
|
|
index_id = cursor->index->id;
|
2005-10-27 07:29:40 +00:00
|
|
|
fold = rec_fold(rec, rec_get_offsets(rec, cursor->index, offsets_,
|
2006-08-29 09:30:31 +00:00
|
|
|
ULINT_UNDEFINED, &heap),
|
2006-09-19 10:14:07 +00:00
|
|
|
block->curr_n_fields, block->curr_n_bytes, index_id);
|
2005-10-27 07:29:40 +00:00
|
|
|
if (UNIV_LIKELY_NULL(heap)) {
|
|
|
|
mem_heap_free(heap);
|
|
|
|
}
|
|
|
|
rw_lock_x_lock(&btr_search_latch);
|
|
|
|
|
2006-11-14 10:42:50 +00:00
|
|
|
found = ha_search_and_delete_if_found(table, fold, rec);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
rw_lock_x_unlock(&btr_search_latch);
|
|
|
|
}
|
|
|
|
|
|
|
|
/************************************************************************
|
|
|
|
Updates the page hash index when a single record is inserted on a page. */
|
2008-02-06 14:17:36 +00:00
|
|
|
UNIV_INTERN
|
2005-10-27 07:29:40 +00:00
|
|
|
void
|
|
|
|
btr_search_update_hash_node_on_insert(
|
|
|
|
/*==================================*/
|
2009-05-25 06:46:10 +00:00
|
|
|
btr_cur_t* cursor) /*!< in: cursor which was positioned to the
|
2005-10-27 07:29:40 +00:00
|
|
|
place to insert using btr_cur_search_...,
|
|
|
|
and the new record has been inserted next
|
|
|
|
to the cursor */
|
|
|
|
{
|
|
|
|
hash_table_t* table;
|
|
|
|
buf_block_t* block;
|
|
|
|
rec_t* rec;
|
|
|
|
|
|
|
|
rec = btr_cur_get_rec(cursor);
|
|
|
|
|
2006-10-19 08:27:34 +00:00
|
|
|
block = btr_cur_get_block(cursor);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
#ifdef UNIV_SYNC_DEBUG
|
|
|
|
ut_ad(rw_lock_own(&(block->lock), RW_LOCK_EX));
|
|
|
|
#endif /* UNIV_SYNC_DEBUG */
|
|
|
|
|
|
|
|
if (!block->is_hashed) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
ut_a(block->index == cursor->index);
|
2008-01-25 14:37:11 +00:00
|
|
|
ut_a(!dict_index_is_ibuf(cursor->index));
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
rw_lock_x_lock(&btr_search_latch);
|
|
|
|
|
|
|
|
if ((cursor->flag == BTR_CUR_HASH)
|
2006-08-29 09:30:31 +00:00
|
|
|
&& (cursor->n_fields == block->curr_n_fields)
|
|
|
|
&& (cursor->n_bytes == block->curr_n_bytes)
|
2006-09-19 10:14:07 +00:00
|
|
|
&& !block->curr_left_side) {
|
2006-02-23 19:25:29 +00:00
|
|
|
|
|
|
|
table = btr_search_sys->hash_index;
|
2005-10-27 07:29:40 +00:00
|
|
|
|
2006-02-23 19:25:29 +00:00
|
|
|
ha_search_and_update_if_found(table, cursor->fold, rec,
|
2006-11-13 21:53:09 +00:00
|
|
|
block, page_rec_get_next(rec));
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
rw_lock_x_unlock(&btr_search_latch);
|
|
|
|
} else {
|
|
|
|
rw_lock_x_unlock(&btr_search_latch);
|
|
|
|
|
|
|
|
btr_search_update_hash_on_insert(cursor);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/************************************************************************
|
|
|
|
Updates the page hash index when a single record is inserted on a page. */
|
2008-02-06 14:17:36 +00:00
|
|
|
UNIV_INTERN
|
2005-10-27 07:29:40 +00:00
|
|
|
void
|
|
|
|
btr_search_update_hash_on_insert(
|
|
|
|
/*=============================*/
|
2009-05-25 06:46:10 +00:00
|
|
|
btr_cur_t* cursor) /*!< in: cursor which was positioned to the
|
2005-10-27 07:29:40 +00:00
|
|
|
place to insert using btr_cur_search_...,
|
|
|
|
and the new record has been inserted next
|
|
|
|
to the cursor */
|
|
|
|
{
|
2006-02-23 19:25:29 +00:00
|
|
|
hash_table_t* table;
|
2005-10-27 07:29:40 +00:00
|
|
|
buf_block_t* block;
|
|
|
|
rec_t* rec;
|
|
|
|
rec_t* ins_rec;
|
|
|
|
rec_t* next_rec;
|
2006-09-19 10:14:07 +00:00
|
|
|
dulint index_id;
|
2005-10-27 07:29:40 +00:00
|
|
|
ulint fold;
|
|
|
|
ulint ins_fold;
|
|
|
|
ulint next_fold = 0; /* remove warning (??? bug ???) */
|
|
|
|
ulint n_fields;
|
|
|
|
ulint n_bytes;
|
2006-09-19 10:14:07 +00:00
|
|
|
ibool left_side;
|
2005-10-27 07:29:40 +00:00
|
|
|
ibool locked = FALSE;
|
|
|
|
mem_heap_t* heap = NULL;
|
|
|
|
ulint offsets_[REC_OFFS_NORMAL_SIZE];
|
|
|
|
ulint* offsets = offsets_;
|
2007-09-28 07:05:57 +00:00
|
|
|
rec_offs_init(offsets_);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
table = btr_search_sys->hash_index;
|
|
|
|
|
|
|
|
btr_search_check_free_space_in_heap();
|
|
|
|
|
|
|
|
rec = btr_cur_get_rec(cursor);
|
|
|
|
|
2006-10-19 08:27:34 +00:00
|
|
|
block = btr_cur_get_block(cursor);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
#ifdef UNIV_SYNC_DEBUG
|
|
|
|
ut_ad(rw_lock_own(&(block->lock), RW_LOCK_EX));
|
|
|
|
#endif /* UNIV_SYNC_DEBUG */
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
if (!block->is_hashed) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
ut_a(block->index == cursor->index);
|
2008-01-25 14:37:11 +00:00
|
|
|
ut_a(!dict_index_is_ibuf(cursor->index));
|
2005-10-27 07:29:40 +00:00
|
|
|
|
2006-09-19 10:14:07 +00:00
|
|
|
index_id = cursor->index->id;
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
n_fields = block->curr_n_fields;
|
|
|
|
n_bytes = block->curr_n_bytes;
|
2006-09-19 10:14:07 +00:00
|
|
|
left_side = block->curr_left_side;
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
ins_rec = page_rec_get_next(rec);
|
|
|
|
next_rec = page_rec_get_next(ins_rec);
|
|
|
|
|
|
|
|
offsets = rec_get_offsets(ins_rec, cursor->index, offsets,
|
2006-08-29 09:30:31 +00:00
|
|
|
ULINT_UNDEFINED, &heap);
|
2006-09-19 10:14:07 +00:00
|
|
|
ins_fold = rec_fold(ins_rec, offsets, n_fields, n_bytes, index_id);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
if (!page_rec_is_supremum(next_rec)) {
|
|
|
|
offsets = rec_get_offsets(next_rec, cursor->index, offsets,
|
2006-08-29 09:30:31 +00:00
|
|
|
n_fields + (n_bytes > 0), &heap);
|
2005-10-27 07:29:40 +00:00
|
|
|
next_fold = rec_fold(next_rec, offsets, n_fields,
|
2006-09-19 10:14:07 +00:00
|
|
|
n_bytes, index_id);
|
2005-10-27 07:29:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!page_rec_is_infimum(rec)) {
|
|
|
|
offsets = rec_get_offsets(rec, cursor->index, offsets,
|
2006-08-29 09:30:31 +00:00
|
|
|
n_fields + (n_bytes > 0), &heap);
|
2006-09-19 10:14:07 +00:00
|
|
|
fold = rec_fold(rec, offsets, n_fields, n_bytes, index_id);
|
2005-10-27 07:29:40 +00:00
|
|
|
} else {
|
2006-09-19 10:14:07 +00:00
|
|
|
if (left_side) {
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
rw_lock_x_lock(&btr_search_latch);
|
|
|
|
|
|
|
|
locked = TRUE;
|
|
|
|
|
2006-11-13 21:53:09 +00:00
|
|
|
ha_insert_for_fold(table, ins_fold, block, ins_rec);
|
2005-10-27 07:29:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
goto check_next_rec;
|
|
|
|
}
|
|
|
|
|
2006-02-23 19:25:29 +00:00
|
|
|
if (fold != ins_fold) {
|
|
|
|
|
|
|
|
if (!locked) {
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
rw_lock_x_lock(&btr_search_latch);
|
|
|
|
|
|
|
|
locked = TRUE;
|
|
|
|
}
|
|
|
|
|
2006-09-19 10:14:07 +00:00
|
|
|
if (!left_side) {
|
2006-11-13 21:53:09 +00:00
|
|
|
ha_insert_for_fold(table, fold, block, rec);
|
2005-10-27 07:29:40 +00:00
|
|
|
} else {
|
2006-11-13 21:53:09 +00:00
|
|
|
ha_insert_for_fold(table, ins_fold, block, ins_rec);
|
2005-10-27 07:29:40 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
check_next_rec:
|
|
|
|
if (page_rec_is_supremum(next_rec)) {
|
|
|
|
|
2006-09-19 10:14:07 +00:00
|
|
|
if (!left_side) {
|
2005-10-27 07:29:40 +00:00
|
|
|
|
2006-02-23 19:25:29 +00:00
|
|
|
if (!locked) {
|
2005-10-27 07:29:40 +00:00
|
|
|
rw_lock_x_lock(&btr_search_latch);
|
|
|
|
|
|
|
|
locked = TRUE;
|
|
|
|
}
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2006-11-13 21:53:09 +00:00
|
|
|
ha_insert_for_fold(table, ins_fold, block, ins_rec);
|
2005-10-27 07:29:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
goto function_exit;
|
|
|
|
}
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
if (ins_fold != next_fold) {
|
|
|
|
|
2006-02-23 19:25:29 +00:00
|
|
|
if (!locked) {
|
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
rw_lock_x_lock(&btr_search_latch);
|
|
|
|
|
|
|
|
locked = TRUE;
|
|
|
|
}
|
|
|
|
|
2006-09-19 10:14:07 +00:00
|
|
|
if (!left_side) {
|
2005-10-27 07:29:40 +00:00
|
|
|
|
2006-11-13 21:53:09 +00:00
|
|
|
ha_insert_for_fold(table, ins_fold, block, ins_rec);
|
2006-08-29 09:30:31 +00:00
|
|
|
/*
|
2005-10-27 07:29:40 +00:00
|
|
|
fputs("Hash insert for ", stderr);
|
|
|
|
dict_index_name_print(stderr, cursor->index);
|
|
|
|
fprintf(stderr, " fold %lu\n", ins_fold);
|
2006-08-29 09:30:31 +00:00
|
|
|
*/
|
2005-10-27 07:29:40 +00:00
|
|
|
} else {
|
2006-11-13 21:53:09 +00:00
|
|
|
ha_insert_for_fold(table, next_fold, block, next_rec);
|
2005-10-27 07:29:40 +00:00
|
|
|
}
|
2006-02-23 19:25:29 +00:00
|
|
|
}
|
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
function_exit:
|
|
|
|
if (UNIV_LIKELY_NULL(heap)) {
|
|
|
|
mem_heap_free(heap);
|
|
|
|
}
|
|
|
|
if (locked) {
|
|
|
|
rw_lock_x_unlock(&btr_search_latch);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/************************************************************************
|
2009-05-25 06:46:10 +00:00
|
|
|
Validates the search system.
|
|
|
|
@return TRUE if ok */
|
2008-02-06 14:17:36 +00:00
|
|
|
UNIV_INTERN
|
2005-10-27 07:29:40 +00:00
|
|
|
ibool
|
|
|
|
btr_search_validate(void)
|
|
|
|
/*=====================*/
|
|
|
|
{
|
|
|
|
ha_node_t* node;
|
|
|
|
ulint n_page_dumps = 0;
|
|
|
|
ibool ok = TRUE;
|
|
|
|
ulint i;
|
2006-02-17 14:19:39 +00:00
|
|
|
ulint cell_count;
|
2005-10-27 07:29:40 +00:00
|
|
|
mem_heap_t* heap = NULL;
|
|
|
|
ulint offsets_[REC_OFFS_NORMAL_SIZE];
|
|
|
|
ulint* offsets = offsets_;
|
2006-02-17 14:19:39 +00:00
|
|
|
|
|
|
|
/* How many cells to check before temporarily releasing
|
|
|
|
btr_search_latch. */
|
|
|
|
ulint chunk_size = 10000;
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2007-09-28 07:05:57 +00:00
|
|
|
rec_offs_init(offsets_);
|
2006-04-12 09:32:17 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
rw_lock_x_lock(&btr_search_latch);
|
2008-01-10 09:37:13 +00:00
|
|
|
buf_pool_mutex_enter();
|
2005-10-27 07:29:40 +00:00
|
|
|
|
2006-02-17 14:19:39 +00:00
|
|
|
cell_count = hash_get_n_cells(btr_search_sys->hash_index);
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2006-02-17 14:19:39 +00:00
|
|
|
for (i = 0; i < cell_count; i++) {
|
|
|
|
/* We release btr_search_latch every once in a while to
|
|
|
|
give other queries a chance to run. */
|
|
|
|
if ((i != 0) && ((i % chunk_size) == 0)) {
|
2008-01-10 09:37:13 +00:00
|
|
|
buf_pool_mutex_exit();
|
2006-02-17 14:19:39 +00:00
|
|
|
rw_lock_x_unlock(&btr_search_latch);
|
|
|
|
os_thread_yield();
|
|
|
|
rw_lock_x_lock(&btr_search_latch);
|
2008-01-10 09:37:13 +00:00
|
|
|
buf_pool_mutex_enter();
|
2006-02-17 14:19:39 +00:00
|
|
|
}
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
node = hash_get_nth_cell(btr_search_sys->hash_index, i)->node;
|
|
|
|
|
2006-11-02 09:06:49 +00:00
|
|
|
for (; node != NULL; node = node->next) {
|
branches/innodb+: Merge revisions 4006:4060 from branches/zip:
------------------------------------------------------------------------
r4008 | vasil | 2009-01-20 17:01:08 +0200 (Tue, 20 Jan 2009) | 4 lines
branches/zip:
Add ChangeLog entries for the bugfixes in r4004 and r4005.
------------------------------------------------------------------------
r4027 | marko | 2009-01-23 11:04:49 +0200 (Fri, 23 Jan 2009) | 1 line
branches/zip: Remove some redundant #include statements.
------------------------------------------------------------------------
r4028 | marko | 2009-01-23 11:26:10 +0200 (Fri, 23 Jan 2009) | 13 lines
branches/zip: Enclose some more unused code in #ifdef UNIV_LOG_ARCHIVE.
This will help trim the dependencies of InnoDB Hot Backup.
recv_recovery_from_checkpoint_start(): Rename to
recv_recovery_from_checkpoint_start_func(), and remove the two first
parameters unless UNIV_LOG_ARCHIVE is defined. Define and use
the auxiliary macros TYPE_CHECKPOINT and LIMIT_LSN in the function.
struct recv_sys_struct: Remove archive_group unless UNIV_LOG_ARCHIVE
is defined.
Do not define LOG_ARCHIVE unless UNIV_LOG_ARCHIVE is defined.
------------------------------------------------------------------------
r4029 | marko | 2009-01-23 14:07:38 +0200 (Fri, 23 Jan 2009) | 1 line
branches/zip: Remove some redundant #include directives.
------------------------------------------------------------------------
r4030 | marko | 2009-01-23 15:31:36 +0200 (Fri, 23 Jan 2009) | 2 lines
branches/zip: buf_page_get_gen(): Remove the unused mode BUF_GET_NOWAIT.
This was noticed while investigating Issue #160.
------------------------------------------------------------------------
r4033 | marko | 2009-01-23 15:49:04 +0200 (Fri, 23 Jan 2009) | 16 lines
branches/zip: Merge revisions 4005:4032 from branches/5.1:
------------------------------------------------------------------------
r4032 | marko | 2009-01-23 15:43:51 +0200 (Fri, 23 Jan 2009) | 10 lines
branches/5.1: Merge r4031 from branches/5.0:
btr_search_drop_page_hash_when_freed(): Check if buf_page_get_gen()
returns NULL. The page may have been evicted from the buffer pool
between buf_page_peek_if_search_hashed() and buf_page_get_gen(),
because the buffer pool mutex will be released between these two calls.
(Bug #42279, Issue #160)
rb://82 approved by Heikki Tuuri
------------------------------------------------------------------------
------------------------------------------------------------------------
r4034 | marko | 2009-01-26 16:16:39 +0200 (Mon, 26 Jan 2009) | 2 lines
branches/zip: buf_page_get_gen(): Fix a "possibly uninitialized" warning
that was introduced in r4030.
------------------------------------------------------------------------
r4036 | marko | 2009-01-26 22:33:20 +0200 (Mon, 26 Jan 2009) | 22 lines
branches/zip: In r988, the function buf_block_align() was enclosed
within UNIV_DEBUG. The two remaining callers in non-debug builds,
btr_search_guess_on_hash() and btr_search_validate(), were rewritten
to call buf_page_hash_get().
To implement support for a resizeable buffer pool, the function
buf_block_align() had been rewritten to perform a page hash lookup in
the buffer pool. The caller was also made responsible for holding the
buffer pool mutex.
Because the page hash lookup is expensive and it has to be done while
holding the buffer pool mutex, implement buf_block_align() by pointer
arithmetics again, and make btr_search_guess_on_hash() call it. Note
that this will have to be adjusted if the interface to the resizeable
buffer pool is actually implemented.
rb://83 approved by Heikki Tuuri, to address Issue #161.
As a deviation from the approved patch, this patch also makes
btr_search_validate() (invoked by CHECK TABLE) check that
buf_pool->page_hash is consistent with buf_block_align().
------------------------------------------------------------------------
r4039 | vasil | 2009-01-27 08:04:17 +0200 (Tue, 27 Jan 2009) | 5 lines
branches/zip:
Adjust the paths in innodb_file_per_table.diff with a recent rename of
the test/result files in the MySQL tree.
------------------------------------------------------------------------
r4042 | marko | 2009-01-27 10:05:24 +0200 (Tue, 27 Jan 2009) | 2 lines
branches/zip: buf_LRU_invalidate_tablespace(): Fix a race condition:
read zip_size while still holding block_mutex.
------------------------------------------------------------------------
r4045 | marko | 2009-01-28 00:31:17 +0200 (Wed, 28 Jan 2009) | 8 lines
branches/zip: btr_search_validate(): Fix a bogus UNIV_DEBUG
assertion failure that was accidentally introduced in r4036.
Instead of calling buf_block_get_frame(), which asserts that the
block must be buffer-fixed, access block->frame directly. That
is safe, because changes of block->page.state are protected by
the buffer pool mutex, which we are holding.
This bug was reported by Michael.
------------------------------------------------------------------------
r4046 | marko | 2009-01-28 00:33:20 +0200 (Wed, 28 Jan 2009) | 2 lines
branches/zip: Revert the change to univ.i that was accidentally
committed in r4045.
------------------------------------------------------------------------
r4047 | marko | 2009-01-28 00:46:13 +0200 (Wed, 28 Jan 2009) | 6 lines
branches/zip: btr_search_validate(): Fix an assertion failure that was
introduced in r4036.
Do not call buf_block_get_space(), buf_block_get_page_no()
unless the block state is BUF_BLOCK_FILE_PAGE.
This bug was reported by Michael.
------------------------------------------------------------------------
r4050 | vasil | 2009-01-28 08:21:44 +0200 (Wed, 28 Jan 2009) | 5 lines
branches/zip:
Adjust the paths in innodb_lock_wait_timeout.diff with a recent rename of
the test/result files in the MySQL tree.
------------------------------------------------------------------------
r4051 | marko | 2009-01-28 14:35:49 +0200 (Wed, 28 Jan 2009) | 1 line
branches/zip: trx0sys.ic: Remove unnecessary #include <data0type.h>.
------------------------------------------------------------------------
r4052 | marko | 2009-01-28 15:21:45 +0200 (Wed, 28 Jan 2009) | 5 lines
branches/zip: Enclose some functions inside #ifdef UNIV_HOTBACKUP:
ut_sprintf_timestamp_without_extra_chars(), ut_get_year_month_day(),
log_reset_first_header_and_checkpoint(): These functions are only used
in InnoDB Hot Backup.
------------------------------------------------------------------------
r4056 | calvin | 2009-01-29 03:06:41 +0200 (Thu, 29 Jan 2009) | 33 lines
branches/zip: Merge revisions 4032:4035 from branches/5.1
All InnoDB related tests passed on Windows, except
known failure in partition_innodb_semi_consistent.
The inadvertent change to btr0sea.c in this commit is reverted in r4060.
------------------------------------------------------------------------
r4035 | vasil | 2009-01-26 09:26:25 -0600 (Mon, 26 Jan 2009) | 23 lines
branches/5.1:
Merge a change from MySQL:
------------------------------------------------------------
revno: 2646.161.4
committer: Tatiana A. Nurnberg <azundris@mysql.com>
branch nick: 51-31177v2
timestamp: Mon 2009-01-12 06:32:49 +0100
message:
Bug#31177: Server variables can't be set to their current values
Bounds-checks and blocksize corrections were applied to user-input,
but constants in the server were trusted implicitly. If these values
did not actually meet the requirements, the user could not set change
a variable, then set it back to the (wonky) factory default or maximum
by explicitly specifying it (SET <var>=<value> vs SET <var>=DEFAULT).
Now checks also apply to the server's presets. Wonky values and maxima
get corrected at startup. Consequently all non-offsetted values the user
sees are valid, and users can set the variable to that exact value if
they so desire.
------------------------------------------------------------------------
r4060 | marko | 2009-01-29 09:39:04 +0200 (Thu, 29 Jan 2009) | 1 line
branches/zip: btr0sea.c: Revert the inadvertent change made in r4056.
------------------------------------------------------------------------
2009-01-29 09:47:07 +00:00
|
|
|
const buf_block_t* block
|
|
|
|
= buf_block_align(node->data);
|
|
|
|
const buf_block_t* hash_block;
|
|
|
|
|
|
|
|
if (UNIV_LIKELY(buf_block_get_state(block)
|
|
|
|
== BUF_BLOCK_FILE_PAGE)) {
|
|
|
|
|
|
|
|
/* The space and offset are only valid
|
|
|
|
for file blocks. It is possible that
|
|
|
|
the block is being freed
|
|
|
|
(BUF_BLOCK_REMOVE_HASH, see the
|
|
|
|
assertion and the comment below) */
|
|
|
|
hash_block = buf_block_hash_get(
|
|
|
|
buf_block_get_space(block),
|
|
|
|
buf_block_get_page_no(block));
|
|
|
|
} else {
|
|
|
|
hash_block = NULL;
|
2006-11-02 09:06:49 +00:00
|
|
|
}
|
|
|
|
|
branches/innodb+: Merge revisions 4006:4060 from branches/zip:
------------------------------------------------------------------------
r4008 | vasil | 2009-01-20 17:01:08 +0200 (Tue, 20 Jan 2009) | 4 lines
branches/zip:
Add ChangeLog entries for the bugfixes in r4004 and r4005.
------------------------------------------------------------------------
r4027 | marko | 2009-01-23 11:04:49 +0200 (Fri, 23 Jan 2009) | 1 line
branches/zip: Remove some redundant #include statements.
------------------------------------------------------------------------
r4028 | marko | 2009-01-23 11:26:10 +0200 (Fri, 23 Jan 2009) | 13 lines
branches/zip: Enclose some more unused code in #ifdef UNIV_LOG_ARCHIVE.
This will help trim the dependencies of InnoDB Hot Backup.
recv_recovery_from_checkpoint_start(): Rename to
recv_recovery_from_checkpoint_start_func(), and remove the two first
parameters unless UNIV_LOG_ARCHIVE is defined. Define and use
the auxiliary macros TYPE_CHECKPOINT and LIMIT_LSN in the function.
struct recv_sys_struct: Remove archive_group unless UNIV_LOG_ARCHIVE
is defined.
Do not define LOG_ARCHIVE unless UNIV_LOG_ARCHIVE is defined.
------------------------------------------------------------------------
r4029 | marko | 2009-01-23 14:07:38 +0200 (Fri, 23 Jan 2009) | 1 line
branches/zip: Remove some redundant #include directives.
------------------------------------------------------------------------
r4030 | marko | 2009-01-23 15:31:36 +0200 (Fri, 23 Jan 2009) | 2 lines
branches/zip: buf_page_get_gen(): Remove the unused mode BUF_GET_NOWAIT.
This was noticed while investigating Issue #160.
------------------------------------------------------------------------
r4033 | marko | 2009-01-23 15:49:04 +0200 (Fri, 23 Jan 2009) | 16 lines
branches/zip: Merge revisions 4005:4032 from branches/5.1:
------------------------------------------------------------------------
r4032 | marko | 2009-01-23 15:43:51 +0200 (Fri, 23 Jan 2009) | 10 lines
branches/5.1: Merge r4031 from branches/5.0:
btr_search_drop_page_hash_when_freed(): Check if buf_page_get_gen()
returns NULL. The page may have been evicted from the buffer pool
between buf_page_peek_if_search_hashed() and buf_page_get_gen(),
because the buffer pool mutex will be released between these two calls.
(Bug #42279, Issue #160)
rb://82 approved by Heikki Tuuri
------------------------------------------------------------------------
------------------------------------------------------------------------
r4034 | marko | 2009-01-26 16:16:39 +0200 (Mon, 26 Jan 2009) | 2 lines
branches/zip: buf_page_get_gen(): Fix a "possibly uninitialized" warning
that was introduced in r4030.
------------------------------------------------------------------------
r4036 | marko | 2009-01-26 22:33:20 +0200 (Mon, 26 Jan 2009) | 22 lines
branches/zip: In r988, the function buf_block_align() was enclosed
within UNIV_DEBUG. The two remaining callers in non-debug builds,
btr_search_guess_on_hash() and btr_search_validate(), were rewritten
to call buf_page_hash_get().
To implement support for a resizeable buffer pool, the function
buf_block_align() had been rewritten to perform a page hash lookup in
the buffer pool. The caller was also made responsible for holding the
buffer pool mutex.
Because the page hash lookup is expensive and it has to be done while
holding the buffer pool mutex, implement buf_block_align() by pointer
arithmetics again, and make btr_search_guess_on_hash() call it. Note
that this will have to be adjusted if the interface to the resizeable
buffer pool is actually implemented.
rb://83 approved by Heikki Tuuri, to address Issue #161.
As a deviation from the approved patch, this patch also makes
btr_search_validate() (invoked by CHECK TABLE) check that
buf_pool->page_hash is consistent with buf_block_align().
------------------------------------------------------------------------
r4039 | vasil | 2009-01-27 08:04:17 +0200 (Tue, 27 Jan 2009) | 5 lines
branches/zip:
Adjust the paths in innodb_file_per_table.diff with a recent rename of
the test/result files in the MySQL tree.
------------------------------------------------------------------------
r4042 | marko | 2009-01-27 10:05:24 +0200 (Tue, 27 Jan 2009) | 2 lines
branches/zip: buf_LRU_invalidate_tablespace(): Fix a race condition:
read zip_size while still holding block_mutex.
------------------------------------------------------------------------
r4045 | marko | 2009-01-28 00:31:17 +0200 (Wed, 28 Jan 2009) | 8 lines
branches/zip: btr_search_validate(): Fix a bogus UNIV_DEBUG
assertion failure that was accidentally introduced in r4036.
Instead of calling buf_block_get_frame(), which asserts that the
block must be buffer-fixed, access block->frame directly. That
is safe, because changes of block->page.state are protected by
the buffer pool mutex, which we are holding.
This bug was reported by Michael.
------------------------------------------------------------------------
r4046 | marko | 2009-01-28 00:33:20 +0200 (Wed, 28 Jan 2009) | 2 lines
branches/zip: Revert the change to univ.i that was accidentally
committed in r4045.
------------------------------------------------------------------------
r4047 | marko | 2009-01-28 00:46:13 +0200 (Wed, 28 Jan 2009) | 6 lines
branches/zip: btr_search_validate(): Fix an assertion failure that was
introduced in r4036.
Do not call buf_block_get_space(), buf_block_get_page_no()
unless the block state is BUF_BLOCK_FILE_PAGE.
This bug was reported by Michael.
------------------------------------------------------------------------
r4050 | vasil | 2009-01-28 08:21:44 +0200 (Wed, 28 Jan 2009) | 5 lines
branches/zip:
Adjust the paths in innodb_lock_wait_timeout.diff with a recent rename of
the test/result files in the MySQL tree.
------------------------------------------------------------------------
r4051 | marko | 2009-01-28 14:35:49 +0200 (Wed, 28 Jan 2009) | 1 line
branches/zip: trx0sys.ic: Remove unnecessary #include <data0type.h>.
------------------------------------------------------------------------
r4052 | marko | 2009-01-28 15:21:45 +0200 (Wed, 28 Jan 2009) | 5 lines
branches/zip: Enclose some functions inside #ifdef UNIV_HOTBACKUP:
ut_sprintf_timestamp_without_extra_chars(), ut_get_year_month_day(),
log_reset_first_header_and_checkpoint(): These functions are only used
in InnoDB Hot Backup.
------------------------------------------------------------------------
r4056 | calvin | 2009-01-29 03:06:41 +0200 (Thu, 29 Jan 2009) | 33 lines
branches/zip: Merge revisions 4032:4035 from branches/5.1
All InnoDB related tests passed on Windows, except
known failure in partition_innodb_semi_consistent.
The inadvertent change to btr0sea.c in this commit is reverted in r4060.
------------------------------------------------------------------------
r4035 | vasil | 2009-01-26 09:26:25 -0600 (Mon, 26 Jan 2009) | 23 lines
branches/5.1:
Merge a change from MySQL:
------------------------------------------------------------
revno: 2646.161.4
committer: Tatiana A. Nurnberg <azundris@mysql.com>
branch nick: 51-31177v2
timestamp: Mon 2009-01-12 06:32:49 +0100
message:
Bug#31177: Server variables can't be set to their current values
Bounds-checks and blocksize corrections were applied to user-input,
but constants in the server were trusted implicitly. If these values
did not actually meet the requirements, the user could not set change
a variable, then set it back to the (wonky) factory default or maximum
by explicitly specifying it (SET <var>=<value> vs SET <var>=DEFAULT).
Now checks also apply to the server's presets. Wonky values and maxima
get corrected at startup. Consequently all non-offsetted values the user
sees are valid, and users can set the variable to that exact value if
they so desire.
------------------------------------------------------------------------
r4060 | marko | 2009-01-29 09:39:04 +0200 (Thu, 29 Jan 2009) | 1 line
branches/zip: btr0sea.c: Revert the inadvertent change made in r4056.
------------------------------------------------------------------------
2009-01-29 09:47:07 +00:00
|
|
|
if (hash_block) {
|
|
|
|
ut_a(hash_block == block);
|
|
|
|
} else {
|
|
|
|
/* When a block is being freed,
|
|
|
|
buf_LRU_search_and_free_block() first
|
|
|
|
removes the block from
|
2006-11-02 09:06:49 +00:00
|
|
|
buf_pool->page_hash by calling
|
|
|
|
buf_LRU_block_remove_hashed_page().
|
|
|
|
After that, it invokes
|
branches/innodb+: Merge revisions 4006:4060 from branches/zip:
------------------------------------------------------------------------
r4008 | vasil | 2009-01-20 17:01:08 +0200 (Tue, 20 Jan 2009) | 4 lines
branches/zip:
Add ChangeLog entries for the bugfixes in r4004 and r4005.
------------------------------------------------------------------------
r4027 | marko | 2009-01-23 11:04:49 +0200 (Fri, 23 Jan 2009) | 1 line
branches/zip: Remove some redundant #include statements.
------------------------------------------------------------------------
r4028 | marko | 2009-01-23 11:26:10 +0200 (Fri, 23 Jan 2009) | 13 lines
branches/zip: Enclose some more unused code in #ifdef UNIV_LOG_ARCHIVE.
This will help trim the dependencies of InnoDB Hot Backup.
recv_recovery_from_checkpoint_start(): Rename to
recv_recovery_from_checkpoint_start_func(), and remove the two first
parameters unless UNIV_LOG_ARCHIVE is defined. Define and use
the auxiliary macros TYPE_CHECKPOINT and LIMIT_LSN in the function.
struct recv_sys_struct: Remove archive_group unless UNIV_LOG_ARCHIVE
is defined.
Do not define LOG_ARCHIVE unless UNIV_LOG_ARCHIVE is defined.
------------------------------------------------------------------------
r4029 | marko | 2009-01-23 14:07:38 +0200 (Fri, 23 Jan 2009) | 1 line
branches/zip: Remove some redundant #include directives.
------------------------------------------------------------------------
r4030 | marko | 2009-01-23 15:31:36 +0200 (Fri, 23 Jan 2009) | 2 lines
branches/zip: buf_page_get_gen(): Remove the unused mode BUF_GET_NOWAIT.
This was noticed while investigating Issue #160.
------------------------------------------------------------------------
r4033 | marko | 2009-01-23 15:49:04 +0200 (Fri, 23 Jan 2009) | 16 lines
branches/zip: Merge revisions 4005:4032 from branches/5.1:
------------------------------------------------------------------------
r4032 | marko | 2009-01-23 15:43:51 +0200 (Fri, 23 Jan 2009) | 10 lines
branches/5.1: Merge r4031 from branches/5.0:
btr_search_drop_page_hash_when_freed(): Check if buf_page_get_gen()
returns NULL. The page may have been evicted from the buffer pool
between buf_page_peek_if_search_hashed() and buf_page_get_gen(),
because the buffer pool mutex will be released between these two calls.
(Bug #42279, Issue #160)
rb://82 approved by Heikki Tuuri
------------------------------------------------------------------------
------------------------------------------------------------------------
r4034 | marko | 2009-01-26 16:16:39 +0200 (Mon, 26 Jan 2009) | 2 lines
branches/zip: buf_page_get_gen(): Fix a "possibly uninitialized" warning
that was introduced in r4030.
------------------------------------------------------------------------
r4036 | marko | 2009-01-26 22:33:20 +0200 (Mon, 26 Jan 2009) | 22 lines
branches/zip: In r988, the function buf_block_align() was enclosed
within UNIV_DEBUG. The two remaining callers in non-debug builds,
btr_search_guess_on_hash() and btr_search_validate(), were rewritten
to call buf_page_hash_get().
To implement support for a resizeable buffer pool, the function
buf_block_align() had been rewritten to perform a page hash lookup in
the buffer pool. The caller was also made responsible for holding the
buffer pool mutex.
Because the page hash lookup is expensive and it has to be done while
holding the buffer pool mutex, implement buf_block_align() by pointer
arithmetics again, and make btr_search_guess_on_hash() call it. Note
that this will have to be adjusted if the interface to the resizeable
buffer pool is actually implemented.
rb://83 approved by Heikki Tuuri, to address Issue #161.
As a deviation from the approved patch, this patch also makes
btr_search_validate() (invoked by CHECK TABLE) check that
buf_pool->page_hash is consistent with buf_block_align().
------------------------------------------------------------------------
r4039 | vasil | 2009-01-27 08:04:17 +0200 (Tue, 27 Jan 2009) | 5 lines
branches/zip:
Adjust the paths in innodb_file_per_table.diff with a recent rename of
the test/result files in the MySQL tree.
------------------------------------------------------------------------
r4042 | marko | 2009-01-27 10:05:24 +0200 (Tue, 27 Jan 2009) | 2 lines
branches/zip: buf_LRU_invalidate_tablespace(): Fix a race condition:
read zip_size while still holding block_mutex.
------------------------------------------------------------------------
r4045 | marko | 2009-01-28 00:31:17 +0200 (Wed, 28 Jan 2009) | 8 lines
branches/zip: btr_search_validate(): Fix a bogus UNIV_DEBUG
assertion failure that was accidentally introduced in r4036.
Instead of calling buf_block_get_frame(), which asserts that the
block must be buffer-fixed, access block->frame directly. That
is safe, because changes of block->page.state are protected by
the buffer pool mutex, which we are holding.
This bug was reported by Michael.
------------------------------------------------------------------------
r4046 | marko | 2009-01-28 00:33:20 +0200 (Wed, 28 Jan 2009) | 2 lines
branches/zip: Revert the change to univ.i that was accidentally
committed in r4045.
------------------------------------------------------------------------
r4047 | marko | 2009-01-28 00:46:13 +0200 (Wed, 28 Jan 2009) | 6 lines
branches/zip: btr_search_validate(): Fix an assertion failure that was
introduced in r4036.
Do not call buf_block_get_space(), buf_block_get_page_no()
unless the block state is BUF_BLOCK_FILE_PAGE.
This bug was reported by Michael.
------------------------------------------------------------------------
r4050 | vasil | 2009-01-28 08:21:44 +0200 (Wed, 28 Jan 2009) | 5 lines
branches/zip:
Adjust the paths in innodb_lock_wait_timeout.diff with a recent rename of
the test/result files in the MySQL tree.
------------------------------------------------------------------------
r4051 | marko | 2009-01-28 14:35:49 +0200 (Wed, 28 Jan 2009) | 1 line
branches/zip: trx0sys.ic: Remove unnecessary #include <data0type.h>.
------------------------------------------------------------------------
r4052 | marko | 2009-01-28 15:21:45 +0200 (Wed, 28 Jan 2009) | 5 lines
branches/zip: Enclose some functions inside #ifdef UNIV_HOTBACKUP:
ut_sprintf_timestamp_without_extra_chars(), ut_get_year_month_day(),
log_reset_first_header_and_checkpoint(): These functions are only used
in InnoDB Hot Backup.
------------------------------------------------------------------------
r4056 | calvin | 2009-01-29 03:06:41 +0200 (Thu, 29 Jan 2009) | 33 lines
branches/zip: Merge revisions 4032:4035 from branches/5.1
All InnoDB related tests passed on Windows, except
known failure in partition_innodb_semi_consistent.
The inadvertent change to btr0sea.c in this commit is reverted in r4060.
------------------------------------------------------------------------
r4035 | vasil | 2009-01-26 09:26:25 -0600 (Mon, 26 Jan 2009) | 23 lines
branches/5.1:
Merge a change from MySQL:
------------------------------------------------------------
revno: 2646.161.4
committer: Tatiana A. Nurnberg <azundris@mysql.com>
branch nick: 51-31177v2
timestamp: Mon 2009-01-12 06:32:49 +0100
message:
Bug#31177: Server variables can't be set to their current values
Bounds-checks and blocksize corrections were applied to user-input,
but constants in the server were trusted implicitly. If these values
did not actually meet the requirements, the user could not set change
a variable, then set it back to the (wonky) factory default or maximum
by explicitly specifying it (SET <var>=<value> vs SET <var>=DEFAULT).
Now checks also apply to the server's presets. Wonky values and maxima
get corrected at startup. Consequently all non-offsetted values the user
sees are valid, and users can set the variable to that exact value if
they so desire.
------------------------------------------------------------------------
r4060 | marko | 2009-01-29 09:39:04 +0200 (Thu, 29 Jan 2009) | 1 line
branches/zip: btr0sea.c: Revert the inadvertent change made in r4056.
------------------------------------------------------------------------
2009-01-29 09:47:07 +00:00
|
|
|
btr_search_drop_page_hash_index() to
|
|
|
|
remove the block from
|
|
|
|
btr_search_sys->hash_index. */
|
|
|
|
|
|
|
|
ut_a(buf_block_get_state(block)
|
|
|
|
== BUF_BLOCK_REMOVE_HASH);
|
2006-11-02 09:06:49 +00:00
|
|
|
}
|
|
|
|
|
2008-01-25 14:37:11 +00:00
|
|
|
ut_a(!dict_index_is_ibuf(block->index));
|
|
|
|
|
2007-10-01 07:45:02 +00:00
|
|
|
offsets = rec_get_offsets((const rec_t*) node->data,
|
2006-08-29 09:30:31 +00:00
|
|
|
block->index, offsets,
|
|
|
|
block->curr_n_fields
|
|
|
|
+ (block->curr_n_bytes > 0),
|
|
|
|
&heap);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
2006-08-29 09:30:31 +00:00
|
|
|
if (!block->is_hashed || node->fold
|
|
|
|
!= rec_fold((rec_t*)(node->data),
|
2006-02-23 19:25:29 +00:00
|
|
|
offsets,
|
|
|
|
block->curr_n_fields,
|
|
|
|
block->curr_n_bytes,
|
branches/innodb+: Merge revisions 4006:4060 from branches/zip:
------------------------------------------------------------------------
r4008 | vasil | 2009-01-20 17:01:08 +0200 (Tue, 20 Jan 2009) | 4 lines
branches/zip:
Add ChangeLog entries for the bugfixes in r4004 and r4005.
------------------------------------------------------------------------
r4027 | marko | 2009-01-23 11:04:49 +0200 (Fri, 23 Jan 2009) | 1 line
branches/zip: Remove some redundant #include statements.
------------------------------------------------------------------------
r4028 | marko | 2009-01-23 11:26:10 +0200 (Fri, 23 Jan 2009) | 13 lines
branches/zip: Enclose some more unused code in #ifdef UNIV_LOG_ARCHIVE.
This will help trim the dependencies of InnoDB Hot Backup.
recv_recovery_from_checkpoint_start(): Rename to
recv_recovery_from_checkpoint_start_func(), and remove the two first
parameters unless UNIV_LOG_ARCHIVE is defined. Define and use
the auxiliary macros TYPE_CHECKPOINT and LIMIT_LSN in the function.
struct recv_sys_struct: Remove archive_group unless UNIV_LOG_ARCHIVE
is defined.
Do not define LOG_ARCHIVE unless UNIV_LOG_ARCHIVE is defined.
------------------------------------------------------------------------
r4029 | marko | 2009-01-23 14:07:38 +0200 (Fri, 23 Jan 2009) | 1 line
branches/zip: Remove some redundant #include directives.
------------------------------------------------------------------------
r4030 | marko | 2009-01-23 15:31:36 +0200 (Fri, 23 Jan 2009) | 2 lines
branches/zip: buf_page_get_gen(): Remove the unused mode BUF_GET_NOWAIT.
This was noticed while investigating Issue #160.
------------------------------------------------------------------------
r4033 | marko | 2009-01-23 15:49:04 +0200 (Fri, 23 Jan 2009) | 16 lines
branches/zip: Merge revisions 4005:4032 from branches/5.1:
------------------------------------------------------------------------
r4032 | marko | 2009-01-23 15:43:51 +0200 (Fri, 23 Jan 2009) | 10 lines
branches/5.1: Merge r4031 from branches/5.0:
btr_search_drop_page_hash_when_freed(): Check if buf_page_get_gen()
returns NULL. The page may have been evicted from the buffer pool
between buf_page_peek_if_search_hashed() and buf_page_get_gen(),
because the buffer pool mutex will be released between these two calls.
(Bug #42279, Issue #160)
rb://82 approved by Heikki Tuuri
------------------------------------------------------------------------
------------------------------------------------------------------------
r4034 | marko | 2009-01-26 16:16:39 +0200 (Mon, 26 Jan 2009) | 2 lines
branches/zip: buf_page_get_gen(): Fix a "possibly uninitialized" warning
that was introduced in r4030.
------------------------------------------------------------------------
r4036 | marko | 2009-01-26 22:33:20 +0200 (Mon, 26 Jan 2009) | 22 lines
branches/zip: In r988, the function buf_block_align() was enclosed
within UNIV_DEBUG. The two remaining callers in non-debug builds,
btr_search_guess_on_hash() and btr_search_validate(), were rewritten
to call buf_page_hash_get().
To implement support for a resizeable buffer pool, the function
buf_block_align() had been rewritten to perform a page hash lookup in
the buffer pool. The caller was also made responsible for holding the
buffer pool mutex.
Because the page hash lookup is expensive and it has to be done while
holding the buffer pool mutex, implement buf_block_align() by pointer
arithmetics again, and make btr_search_guess_on_hash() call it. Note
that this will have to be adjusted if the interface to the resizeable
buffer pool is actually implemented.
rb://83 approved by Heikki Tuuri, to address Issue #161.
As a deviation from the approved patch, this patch also makes
btr_search_validate() (invoked by CHECK TABLE) check that
buf_pool->page_hash is consistent with buf_block_align().
------------------------------------------------------------------------
r4039 | vasil | 2009-01-27 08:04:17 +0200 (Tue, 27 Jan 2009) | 5 lines
branches/zip:
Adjust the paths in innodb_file_per_table.diff with a recent rename of
the test/result files in the MySQL tree.
------------------------------------------------------------------------
r4042 | marko | 2009-01-27 10:05:24 +0200 (Tue, 27 Jan 2009) | 2 lines
branches/zip: buf_LRU_invalidate_tablespace(): Fix a race condition:
read zip_size while still holding block_mutex.
------------------------------------------------------------------------
r4045 | marko | 2009-01-28 00:31:17 +0200 (Wed, 28 Jan 2009) | 8 lines
branches/zip: btr_search_validate(): Fix a bogus UNIV_DEBUG
assertion failure that was accidentally introduced in r4036.
Instead of calling buf_block_get_frame(), which asserts that the
block must be buffer-fixed, access block->frame directly. That
is safe, because changes of block->page.state are protected by
the buffer pool mutex, which we are holding.
This bug was reported by Michael.
------------------------------------------------------------------------
r4046 | marko | 2009-01-28 00:33:20 +0200 (Wed, 28 Jan 2009) | 2 lines
branches/zip: Revert the change to univ.i that was accidentally
committed in r4045.
------------------------------------------------------------------------
r4047 | marko | 2009-01-28 00:46:13 +0200 (Wed, 28 Jan 2009) | 6 lines
branches/zip: btr_search_validate(): Fix an assertion failure that was
introduced in r4036.
Do not call buf_block_get_space(), buf_block_get_page_no()
unless the block state is BUF_BLOCK_FILE_PAGE.
This bug was reported by Michael.
------------------------------------------------------------------------
r4050 | vasil | 2009-01-28 08:21:44 +0200 (Wed, 28 Jan 2009) | 5 lines
branches/zip:
Adjust the paths in innodb_lock_wait_timeout.diff with a recent rename of
the test/result files in the MySQL tree.
------------------------------------------------------------------------
r4051 | marko | 2009-01-28 14:35:49 +0200 (Wed, 28 Jan 2009) | 1 line
branches/zip: trx0sys.ic: Remove unnecessary #include <data0type.h>.
------------------------------------------------------------------------
r4052 | marko | 2009-01-28 15:21:45 +0200 (Wed, 28 Jan 2009) | 5 lines
branches/zip: Enclose some functions inside #ifdef UNIV_HOTBACKUP:
ut_sprintf_timestamp_without_extra_chars(), ut_get_year_month_day(),
log_reset_first_header_and_checkpoint(): These functions are only used
in InnoDB Hot Backup.
------------------------------------------------------------------------
r4056 | calvin | 2009-01-29 03:06:41 +0200 (Thu, 29 Jan 2009) | 33 lines
branches/zip: Merge revisions 4032:4035 from branches/5.1
All InnoDB related tests passed on Windows, except
known failure in partition_innodb_semi_consistent.
The inadvertent change to btr0sea.c in this commit is reverted in r4060.
------------------------------------------------------------------------
r4035 | vasil | 2009-01-26 09:26:25 -0600 (Mon, 26 Jan 2009) | 23 lines
branches/5.1:
Merge a change from MySQL:
------------------------------------------------------------
revno: 2646.161.4
committer: Tatiana A. Nurnberg <azundris@mysql.com>
branch nick: 51-31177v2
timestamp: Mon 2009-01-12 06:32:49 +0100
message:
Bug#31177: Server variables can't be set to their current values
Bounds-checks and blocksize corrections were applied to user-input,
but constants in the server were trusted implicitly. If these values
did not actually meet the requirements, the user could not set change
a variable, then set it back to the (wonky) factory default or maximum
by explicitly specifying it (SET <var>=<value> vs SET <var>=DEFAULT).
Now checks also apply to the server's presets. Wonky values and maxima
get corrected at startup. Consequently all non-offsetted values the user
sees are valid, and users can set the variable to that exact value if
they so desire.
------------------------------------------------------------------------
r4060 | marko | 2009-01-29 09:39:04 +0200 (Thu, 29 Jan 2009) | 1 line
branches/zip: btr0sea.c: Revert the inadvertent change made in r4056.
------------------------------------------------------------------------
2009-01-29 09:47:07 +00:00
|
|
|
btr_page_get_index_id(block->frame))) {
|
|
|
|
const page_t* page = block->frame;
|
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
ok = FALSE;
|
|
|
|
ut_print_timestamp(stderr);
|
|
|
|
|
|
|
|
fprintf(stderr,
|
2006-08-29 09:30:31 +00:00
|
|
|
" InnoDB: Error in an adaptive hash"
|
|
|
|
" index pointer to page %lu\n"
|
|
|
|
"InnoDB: ptr mem address %p"
|
|
|
|
" index id %lu %lu,"
|
|
|
|
" node fold %lu, rec fold %lu\n",
|
2006-10-12 07:02:36 +00:00
|
|
|
(ulong) page_get_page_no(page),
|
2005-10-27 07:29:40 +00:00
|
|
|
node->data,
|
2006-09-19 10:14:07 +00:00
|
|
|
(ulong) ut_dulint_get_high(
|
|
|
|
btr_page_get_index_id(page)),
|
|
|
|
(ulong) ut_dulint_get_low(
|
|
|
|
btr_page_get_index_id(page)),
|
2005-10-27 07:29:40 +00:00
|
|
|
(ulong) node->fold,
|
|
|
|
(ulong) rec_fold((rec_t*)(node->data),
|
2006-08-29 09:30:31 +00:00
|
|
|
offsets,
|
|
|
|
block->curr_n_fields,
|
|
|
|
block->curr_n_bytes,
|
2006-09-19 10:14:07 +00:00
|
|
|
btr_page_get_index_id(
|
|
|
|
page)));
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
fputs("InnoDB: Record ", stderr);
|
|
|
|
rec_print_new(stderr, (rec_t*)node->data,
|
2006-08-29 09:30:31 +00:00
|
|
|
offsets);
|
2005-10-27 07:29:40 +00:00
|
|
|
fprintf(stderr, "\nInnoDB: on that page."
|
2006-08-29 09:30:31 +00:00
|
|
|
" Page mem address %p, is hashed %lu,"
|
|
|
|
" n fields %lu, n bytes %lu\n"
|
|
|
|
"InnoDB: side %lu\n",
|
|
|
|
(void*) page, (ulong) block->is_hashed,
|
|
|
|
(ulong) block->curr_n_fields,
|
|
|
|
(ulong) block->curr_n_bytes,
|
2006-09-19 10:14:07 +00:00
|
|
|
(ulong) block->curr_left_side);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
2006-02-23 19:25:29 +00:00
|
|
|
if (n_page_dumps < 20) {
|
2006-05-02 11:44:39 +00:00
|
|
|
buf_page_print(page, 0);
|
2005-10-27 07:29:40 +00:00
|
|
|
n_page_dumps++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-02-17 14:19:39 +00:00
|
|
|
for (i = 0; i < cell_count; i += chunk_size) {
|
|
|
|
ulint end_index = ut_min(i + chunk_size - 1, cell_count - 1);
|
2006-02-23 19:25:29 +00:00
|
|
|
|
2006-02-17 14:19:39 +00:00
|
|
|
/* We release btr_search_latch every once in a while to
|
|
|
|
give other queries a chance to run. */
|
|
|
|
if (i != 0) {
|
2008-01-10 09:37:13 +00:00
|
|
|
buf_pool_mutex_exit();
|
2006-02-17 14:19:39 +00:00
|
|
|
rw_lock_x_unlock(&btr_search_latch);
|
|
|
|
os_thread_yield();
|
|
|
|
rw_lock_x_lock(&btr_search_latch);
|
2008-01-10 09:37:13 +00:00
|
|
|
buf_pool_mutex_enter();
|
2006-02-17 14:19:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!ha_validate(btr_search_sys->hash_index, i, end_index)) {
|
|
|
|
ok = FALSE;
|
|
|
|
}
|
2005-10-27 07:29:40 +00:00
|
|
|
}
|
|
|
|
|
2008-01-10 09:37:13 +00:00
|
|
|
buf_pool_mutex_exit();
|
2005-10-27 07:29:40 +00:00
|
|
|
rw_lock_x_unlock(&btr_search_latch);
|
|
|
|
if (UNIV_LIKELY_NULL(heap)) {
|
|
|
|
mem_heap_free(heap);
|
|
|
|
}
|
|
|
|
|
|
|
|
return(ok);
|
|
|
|
}
|