Suboptimal AHI partitioning code to access AHI latches and hash tables
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
Percona Server moved to https://jira.percona.com/projects/PS |
Fix Released
|
Low
|
Alexey Kopytov | ||
5.1 |
Invalid
|
Undecided
|
Unassigned | ||
5.5 |
Fix Released
|
Low
|
Alexey Kopytov | ||
5.6 |
Fix Released
|
Low
|
Alexey Kopytov |
Bug Description
The AHI partitioning code looks up the latch corresponding to a specific index through a helper (inline) function btr_search_
Additionally, for some unknown reasons slots in the array of latches are pointers to latches, rather than the actual latches.
So the following steps are performed whenever InnoDB wants to get an adaptive hash index latch:
1. Read index->id
2. calculate index->id % btr_search_
3. read the base address of the latches array
4. read the latch pointer corresponding to the base address and the offset calculated on step #2.
By making the latch an attribute of the index struct (which it really is), the above can become:
1. Read index->search_latch
Which is not a big optimization in itself, but again that code is sometimes executed on critical code paths many times per each row, and that change also results in a bit cleaner code in a few places (e.g. we don't have to store the latch pointer in a control block of a buffer pool frame, and then do dirty reads and verify if block->index is in sync with block->
The same applies to hash tables protected by the corresponding latches.
Related branches
- Laurynas Biveinis (community): Approve
-
Diff: 1935 lines (+448/-373) (has conflicts)22 files modifiedPercona-Server/mysql-test/r/percona_bug1218330.result (+8/-0)
Percona-Server/mysql-test/t/percona_bug1218330-master.opt (+1/-0)
Percona-Server/mysql-test/t/percona_bug1218330.test (+42/-0)
Percona-Server/storage/innobase/btr/btr0cur.c (+6/-5)
Percona-Server/storage/innobase/btr/btr0sea.c (+119/-139)
Percona-Server/storage/innobase/buf/buf0buf.c (+1/-3)
Percona-Server/storage/innobase/dict/dict0boot.c (+8/-0)
Percona-Server/storage/innobase/dict/dict0dict.c (+3/-1)
Percona-Server/storage/innobase/dict/dict0load.c (+2/-0)
Percona-Server/storage/innobase/handler/ha_innodb.cc (+11/-6)
Percona-Server/storage/innobase/ibuf/ibuf0ibuf.c (+2/-0)
Percona-Server/storage/innobase/include/btr0sea.h (+36/-15)
Percona-Server/storage/innobase/include/btr0sea.ic (+67/-35)
Percona-Server/storage/innobase/include/btr0types.h (+6/-7)
Percona-Server/storage/innobase/include/buf0buf.h (+0/-1)
Percona-Server/storage/innobase/include/dict0mem.h (+4/-0)
Percona-Server/storage/innobase/include/trx0trx.h (+7/-5)
Percona-Server/storage/innobase/include/trx0trx.ic (+13/-0)
Percona-Server/storage/innobase/row/row0mysql.c (+6/-2)
Percona-Server/storage/innobase/row/row0sel.c (+36/-97)
Percona-Server/storage/innobase/srv/srv0srv.c (+64/-36)
Percona-Server/storage/innobase/trx/trx0trx.c (+6/-21)
- Laurynas Biveinis (community): Approve
-
Diff: 1957 lines (+482/-381)25 files modifiedPercona-Server/mysql-test/r/percona_bug1218330.result (+14/-0)
Percona-Server/mysql-test/t/percona_bug1218330-master.opt (+1/-0)
Percona-Server/mysql-test/t/percona_bug1218330.test (+72/-0)
Percona-Server/storage/innobase/btr/btr0cur.cc (+7/-7)
Percona-Server/storage/innobase/btr/btr0sea.cc (+109/-132)
Percona-Server/storage/innobase/buf/buf0buf.cc (+0/-2)
Percona-Server/storage/innobase/dict/dict0boot.cc (+6/-0)
Percona-Server/storage/innobase/dict/dict0dict.cc (+5/-3)
Percona-Server/storage/innobase/dict/dict0load.cc (+1/-0)
Percona-Server/storage/innobase/ha/ha0ha.cc (+2/-2)
Percona-Server/storage/innobase/handler/ha_innodb.cc (+21/-19)
Percona-Server/storage/innobase/handler/xtradb_i_s.cc (+35/-33)
Percona-Server/storage/innobase/ibuf/ibuf0ibuf.cc (+2/-0)
Percona-Server/storage/innobase/include/btr0sea.h (+35/-9)
Percona-Server/storage/innobase/include/btr0sea.ic (+66/-11)
Percona-Server/storage/innobase/include/btr0types.h (+7/-6)
Percona-Server/storage/innobase/include/buf0buf.h (+0/-2)
Percona-Server/storage/innobase/include/dict0mem.h (+4/-0)
Percona-Server/storage/innobase/include/trx0trx.h (+7/-5)
Percona-Server/storage/innobase/include/trx0trx.ic (+5/-12)
Percona-Server/storage/innobase/row/row0ftsort.cc (+3/-0)
Percona-Server/storage/innobase/row/row0sel.cc (+32/-91)
Percona-Server/storage/innobase/srv/srv0srv.cc (+42/-44)
Percona-Server/storage/innobase/sync/sync0sync.cc (+3/-3)
Percona-Server/storage/innobase/trx/trx0trx.cc (+3/-0)
description: | updated |
Does not technically apply to 5.6, but will be soon once AHI partitioning is ported there.