---
# System prepended metadata

title: wait/synch/sxlock/innodb/fil_space_latch

---

# wait/synch/sxlock/innodb/fil_space_latch

## 待機イベントの意味
stackoverflow によると...
>テーブルスペースに関する操作で取得された latch に対する待機イベント。
大量のレコードを持ってきて JOIN などで一時テーブルを作成する場合、一時テーブルへの I/O 操作が発生し、この待機イベントの増加が確認できる。

ref: https://stackoverflow.com/questions/74840332/mysql-wait-synch-sxlock-innodb-fil-space-latch-understanding

## latch を作成している場所
### fil_space_create()

fil_space_create() の中でのみ  "fil_space_latch" キーでの latch は作成されている。
```cpp=
/** Create a space memory object and put it to the fil_system hash table.
The tablespace name is independent from the tablespace file-name.
Error messages are issued to the server log.
@param[in]	name	Tablespace name
@param[in]	id	Tablespace identifier
@param[in]	flags	Tablespace flags
@param[in]	purpose	Tablespace purpose
@return pointer to created tablespace, to be filled in with fil_node_create()
@retval NULL on failure (such as when the same tablespace exists) */
fil_space_t*
fil_space_create(
	const char*	name,
	ulint		id,
	ulint		flags,
	fil_type_t	purpose)
```

```cpp=
rw_lock_create(fil_space_latch_key, &space->latch, SYNC_FSP);
```

https://github.com/mysql/mysql-server/blob/5.7/storage/innobase/fil/fil0fil.cc#L1407

この関数自体は、tablespace object をメモリに作成し、それを fil_system ハッシュテーブルに置くもの。今のところ意味不明。

- tablespace: テーブルのデータとインデックスを格納するファイル。拡張子は .ibd
    - innodb_file_per_table が MySQL 5.6 以降有効になっているので、ibd ファイル = tablespace はテーブルごとに作られる。
- fil_system: テーブルスペースをメモリ上にキャッシュしたもの
    - https://github.com/mysql/mysql-server/blob/5.7/storage/innobase/fil/fil0fil.cc#L218
    - 型は fil_system_t
        - https://github.com/mysql/mysql-server/blob/5.7/storage/innobase/fil/fil0fil.cc#L165
        - hash_table_t: tablespaces をハッシュテーブルで持っている

### fil_space_create() が呼ばれてる箇所
以下の6箇所.

- innobase_start_or_create_for_mysql
    - innodb engine 起動のための関数
    - https://github.com/mysql/mysql-server/blob/5.7/storage/innobase/srv/srv0start.cc#L1452
- fil_ibd_create
    - tablespace 作成
    - https://github.com/mysql/mysql-server/blob/5.7/storage/innobase/fil/fil0fil.cc#L3528 
- fil_ibd_open
    - tablespace を開く
    - mysqld が起動した時 or IMPORT TABLESPACE で使用される関数
    -  https://github.com/mysql/mysql-server/blob/5.7/storage/innobase/fil/fil0fil.cc#L3846
- fil_ibd_load
    - tablespace ファイルを開き、InnoDB データ構造に加える
    - REDO log を処理している時に呼ばれるということ以外は、fil_ibd_open と似ている
    - data dictionary は使えない
    - https://github.com/mysql/mysql-server/blob/5.7/storage/innobase/fil/fil0fil.cc#L4472
- Tablespace::open_or_create
    - データファイルを開く
    - is_temp
    - https://github.com/mysql/mysql-server/blob/5.7/storage/innobase/fsp/fsp0space.cc#L101
- SysTablespace::open_or_create
    - https://github.com/mysql/mysql-server/blob/5.7/storage/innobase/fsp/fsp0sysspace.cc#L865

# 3/4 
## rwlock とは
rwlock = [Readers-writer lock](https://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock).
読み取りは共有ロックを取得し、書き込みは排他ロックを取得する仕組み。
書き込み優先の rwlock の場合、書き込みリクエストはキューに貯められ、その間読み取りリクエストが新規にロックを取ることはできない。聞いた感じは、MDL の動作と同じっぽい？

そして、[fil_space_create()](https://github.com/mysql/mysql-server/blob/5.7/storage/innobase/fil/fil0fil.cc#L1407)でも、この rwlock を取得している。

>- rwlock は共有リソース (buffer pool のページ、tablespace、データディクショナリ、information_schema)に対するアクセスを制御するために使われる。
>- rwlock は spin lock によって実現されている。
>- rwlock には S（共有）, X（排他）, SX（共有排他） の3種類のモードがある。

ref: https://mysqlonarm.github.io/Understanding-InnoDB-rwlock-stats/

## tablespace とは
- データとインデックスが入っているファイル構造とそのオブジェクト
- 具体的な構造は以下

https://baotiao.github.io/2020/09/08/innodb-page-management.html 

![tablespace](https://hackmd.io/_uploads/r19UXXfTT.jpg)

## debug build1

client SQL
```sql
SHOW FULL FIELDS FROM test_1
```

[create_innodb_tmp_table](https://github.com/mysql/mysql-server/blob/99077a555bc197b8be46287543cbde36ab4da8dd/sql/sql_tmp_table.cc#L2234) にブレークポイントを打ってみた。
```
Breakpoint 1, create_innodb_tmp_table (table=0xffff109258d0, keyinfo=0xffff10926890) at /mysql-5.7.12/sql/sql_tmp_table.cc:2236
2236      TABLE_SHARE *share= table->s;
(gdb) bt
#0  create_innodb_tmp_table (table=0xffff109258d0, keyinfo=0xffff10926890) at /mysql-5.7.12/sql/sql_tmp_table.cc:2236
#1  0x0000000001581650 in instantiate_tmp_table (table=0xffff109258d0, keyinfo=0xffff10926890, start_recinfo=0xffff10926930, recinfo=0xffff10005dd8, options=4096, big_tables=0 '\000', trace=0xffff10014808) at /mysql-5.7.12/sql/sql_tmp_table.cc:2350
#2  0x000000000157ee10 in create_tmp_table (thd=0xffff100124c0, param=0xffff10005d98, fields=..., group=0x0, distinct=false, save_sum_fields=false, select_options=4096, rows_limit=18446744073709551615, table_alias=0xffff10010b90 "COLUMNS")
    at /mysql-5.7.12/sql/sql_tmp_table.cc:1517
#3  0x000000000154cca4 in create_schema_table (thd=0xffff100124c0, table_list=0xffff100049b0) at /mysql-5.7.12/sql/sql_show.cc:7614
#4  0x000000000154d9e0 in mysql_schema_table (thd=0xffff100124c0, lex=0xffff10014820, table_list=0xffff100049b0) at /mysql-5.7.12/sql/sql_show.cc:7843
#5  0x000000000144c9f0 in open_and_process_table (thd=0xffff100124c0, lex=0xffff10014820, tables=0xffff100049b0, counter=0xffff100148e0, flags=0, prelocking_strategy=0xffff7516d648, has_prelocking_list=false, ot_ctx=0xffff7516d5c8)
    at /mysql-5.7.12/sql/sql_base.cc:4997
#6  0x000000000144dd58 in open_tables (thd=0xffff100124c0, start=0xffff7516d630, counter=0xffff100148e0, flags=0, prelocking_strategy=0xffff7516d648) at /mysql-5.7.12/sql/sql_base.cc:5718
#7  0x000000000144ef38 in open_tables_for_query (thd=0xffff100124c0, tables=0xffff100049b0, flags=0) at /mysql-5.7.12/sql/sql_base.cc:6484
#8  0x00000000014d7dac in execute_sqlcom_select (thd=0xffff100124c0, all_tables=0xffff100049b0) at /mysql-5.7.12/sql/sql_parse.cc:5080
#9  0x00000000014cfd58 in mysql_execute_command (thd=0xffff100124c0, first_level=true) at /mysql-5.7.12/sql/sql_parse.cc:2758
#10 0x00000000014d8d98 in mysql_parse (thd=0xffff100124c0, parser_state=0xffff7516ece8) at /mysql-5.7.12/sql/sql_parse.cc:5519
#11 0x00000000014cca24 in dispatch_command (thd=0xffff100124c0, com_data=0xffff7516f8c0, command=COM_QUERY) at /mysql-5.7.12/sql/sql_parse.cc:1429
#12 0x00000000014cb984 in do_command (thd=0xffff100124c0) at /mysql-5.7.12/sql/sql_parse.cc:997
#13 0x000000000160165c in handle_connection (arg=0x32742010) at /mysql-5.7.12/sql/conn_handler/connection_handler_per_thread.cc:301
#14 0x00000000018d59b4 in pfs_spawn_thread (arg=0x31d15ce0) at /mysql-5.7.12/storage/perfschema/pfs.cc:2188
#15 0x0000ffffb817be48 in start_thread (arg=0xffff751701d0) at pthread_create.c:314
#16 0x0000ffffb7f1c320 in clone () at ../ports/sysdeps/unix/sysv/linux/aarch64/nptl/../clone.S:96
```

latch を取ってそうなところは[一箇所あった](https://github.com/mysql/mysql-server/blob/99077a555bc197b8be46287543cbde36ab4da8dd/storage/innobase/handler/ha_innodb.cc#L11926)がそこを通ってたわけではなかった。

あとは重要そうな関数
- [create_tmp_table](https://github.com/mysql/mysql-server/blob/99077a555bc197b8be46287543cbde36ab4da8dd/sql/sql_tmp_table.cc#L653)
- [instantiate_tmp_table](https://github.com/mysql/mysql-server/blob/99077a555bc197b8be46287543cbde36ab4da8dd/sql/sql_tmp_table.cc#L2337)


## debug build2
client SQL
```sql
SHOW FULL FIELDS FROM test_1
```

[rw_lock_x_lock_func](https://github.com/mysql/mysql-server/blob/99077a555bc197b8be46287543cbde36ab4da8dd/storage/innobase/sync/sync0rw.cc#L711) にブレークポイントを打ってみる

backtrace
```
Breakpoint 1, rw_lock_x_lock_func (lock=0x29268a90, pass=0, file_name=0x22e0390 "/mysql-5.7.12/storage/innobase/fsp/fsp0fsp.cc", line=2613) at /mysql-5.7.12/storage/innobase/sync/sync0rw.cc:719
719             ulint           i = 0;
(gdb) bt
#0  rw_lock_x_lock_func (lock=0x29268a90, pass=0, file_name=0x22e0390 "/mysql-5.7.12/storage/innobase/fsp/fsp0fsp.cc", line=2613) at /mysql-5.7.12/storage/innobase/sync/sync0rw.cc:719
#1  0x00000000019db094 in pfs_rw_lock_x_lock_func (lock=0x29268a90, pass=0, file_name=0x22e0390 "/mysql-5.7.12/storage/innobase/fsp/fsp0fsp.cc", line=2613) at /mysql-5.7.12/storage/innobase/include/sync0rw.ic:705
#2  0x00000000019ede78 in mtr_t::x_lock (this=0xffff4c050cf8, lock=0x29268a90, file=0x22e0390 "/mysql-5.7.12/storage/innobase/fsp/fsp0fsp.cc", line=2613) at /mysql-5.7.12/storage/innobase/include/mtr0mtr.ic:255
#3  0x0000000001a329b0 in mtr_t::x_lock_space (this=0xffff4c050cf8, space_id=25, file=0x22e0390 "/mysql-5.7.12/storage/innobase/fsp/fsp0fsp.cc", line=2613) at /mysql-5.7.12/storage/innobase/mtr/mtr0mtr.cc:703
#4  0x0000000001cd2f30 in fseg_create_general (space_id=25, page=0, byte_offset=84, has_done_reservation=0, mtr=0xffff4c050cf8) at /mysql-5.7.12/storage/innobase/fsp/fsp0fsp.cc:2613
#5  0x0000000001cd33dc in fseg_create (space=25, page=0, byte_offset=84, mtr=0xffff4c050cf8) at /mysql-5.7.12/storage/innobase/fsp/fsp0fsp.cc:2735
#6  0x0000000001bdbc1c in btr_create (type=1, space=25, page_size=..., index_id=1, index=0xfffee4020aa0, btr_redo_create_info=0x0, mtr=0xffff4c050cf8) at /mysql-5.7.12/storage/innobase/btr/btr0btr.cc:1003
#7  0x0000000001c6b358 in dict_create_index_tree_in_mem (index=0xfffee4020aa0, trx=0xffff84eacd08) at /mysql-5.7.12/storage/innobase/dict/dict0crea.cc:1080
#8  0x0000000001ade514 in row_create_index_for_mysql (index=0xfffee4020aa0, trx=0xffff84eacd08, field_lengths=0x0, handler=0xfffee4010420) at /mysql-5.7.12/storage/innobase/row/row0mysql.cc:3293
#9  0x000000000198df08 in create_clustered_index_when_no_primary (trx=0xffff84eacd08, flags=33, table_name=0xffff4c051538 "tmp/#sql_492a_0") at /mysql-5.7.12/storage/innobase/handler/ha_innodb.cc:10356
#10 0x000000000197a498 in create_table_info_t::create_table (this=0xffff4c051420) at /mysql-5.7.12/storage/innobase/handler/ha_innodb.cc:11592
#11 0x000000000197aff0 in ha_innobase::create (this=0xfffee401eb58, name=0xfffee401e320 "/tmp/#sql_492a_0", form=0xfffee401ca20, create_info=0xffff4c051ba8) at /mysql-5.7.12/storage/innobase/handler/ha_innodb.cc:11929
#12 0x0000000001581148 in create_innodb_tmp_table (table=0xfffee401ca20, keyinfo=0xfffee401d9e0) at /mysql-5.7.12/sql/sql_tmp_table.cc:2250
#13 0x0000000001581650 in instantiate_tmp_table (table=0xfffee401ca20, keyinfo=0xfffee401d9e0, start_recinfo=0xfffee401da80, recinfo=0xfffee401be38, options=4096, big_tables=0 '\000', trace=0xfffee4002eb8) at /mysql-5.7.12/sql/sql_tmp_table.cc:2350
#14 0x000000000157ee10 in create_tmp_table (thd=0xfffee4000b70, param=0xfffee401bdf8, fields=..., group=0x0, distinct=false, save_sum_fields=false, select_options=4096, rows_limit=18446744073709551615, table_alias=0xfffee40074d0 "COLUMNS")
    at /mysql-5.7.12/sql/sql_tmp_table.cc:1517
#15 0x000000000154cca4 in create_schema_table (thd=0xfffee4000b70, table_list=0xfffee401aa10) at /mysql-5.7.12/sql/sql_show.cc:7614
#16 0x000000000154d9e0 in mysql_schema_table (thd=0xfffee4000b70, lex=0xfffee4002ed0, table_list=0xfffee401aa10) at /mysql-5.7.12/sql/sql_show.cc:7843
#17 0x000000000144c9f0 in open_and_process_table (thd=0xfffee4000b70, lex=0xfffee4002ed0, tables=0xfffee401aa10, counter=0xfffee4002f90, flags=0, prelocking_strategy=0xffff4c052648, has_prelocking_list=false, ot_ctx=0xffff4c0525c8) at /mysql-5.7.12/sql/sql_base.cc:4997
#18 0x000000000144dd58 in open_tables (thd=0xfffee4000b70, start=0xffff4c052630, counter=0xfffee4002f90, flags=0, prelocking_strategy=0xffff4c052648) at /mysql-5.7.12/sql/sql_base.cc:5718
#19 0x000000000144ef38 in open_tables_for_query (thd=0xfffee4000b70, tables=0xfffee401aa10, flags=0) at /mysql-5.7.12/sql/sql_base.cc:6484
#20 0x00000000014d7dac in execute_sqlcom_select (thd=0xfffee4000b70, all_tables=0xfffee401aa10) at /mysql-5.7.12/sql/sql_parse.cc:5080
#21 0x00000000014cfd58 in mysql_execute_command (thd=0xfffee4000b70, first_level=true) at /mysql-5.7.12/sql/sql_parse.cc:2758
#22 0x00000000014d8d98 in mysql_parse (thd=0xfffee4000b70, parser_state=0xffff4c053ce8) at /mysql-5.7.12/sql/sql_parse.cc:5519
#23 0x00000000014cca24 in dispatch_command (thd=0xfffee4000b70, com_data=0xffff4c0548c0, command=COM_QUERY) at /mysql-5.7.12/sql/sql_parse.cc:1429
#24 0x00000000014cb984 in do_command (thd=0xfffee4000b70) at /mysql-5.7.12/sql/sql_parse.cc:997
#25 0x000000000160165c in handle_connection (arg=0x29569ed0) at /mysql-5.7.12/sql/conn_handler/connection_handler_per_thread.cc:301
#26 0x00000000018d59b4 in pfs_spawn_thread (arg=0x28b4a360) at /mysql-5.7.12/storage/perfschema/pfs.cc:2188
#27 0x0000ffff8f072e48 in start_thread (arg=0xffff4c0551d0) at pthread_create.c:314
#28 0x0000ffff8ee13320 in clone () at ../ports/sysdeps/unix/sysv/linux/aarch64/nptl/../clone.S:96
```

[ha_innobase::create](https://github.com/mysql/mysql-server/blob/99077a555bc197b8be46287543cbde36ab4da8dd/storage/innobase/handler/ha_innodb.cc#L11929)

一つのクエリで2回目止まった。1回目との違いは `fsp_reserve_free_extents` が挟まっていること。
```
Breakpoint 1, rw_lock_x_lock_func (lock=0x29268a90, pass=0, file_name=0x22e0390 "/mysql-5.7.12/storage/innobase/fsp/fsp0fsp.cc", line=3361) at /mysql-5.7.12/storage/innobase/sync/sync0rw.cc:719
719             ulint           i = 0;
(gdb) bt
#0  rw_lock_x_lock_func (lock=0x29268a90, pass=0, file_name=0x22e0390 "/mysql-5.7.12/storage/innobase/fsp/fsp0fsp.cc", line=3361) at /mysql-5.7.12/storage/innobase/sync/sync0rw.cc:719
#1  0x00000000019db094 in pfs_rw_lock_x_lock_func (lock=0x29268a90, pass=0, file_name=0x22e0390 "/mysql-5.7.12/storage/innobase/fsp/fsp0fsp.cc", line=3361) at /mysql-5.7.12/storage/innobase/include/sync0rw.ic:705
#2  0x00000000019ede78 in mtr_t::x_lock (this=0xffff4c050cf8, lock=0x29268a90, file=0x22e0390 "/mysql-5.7.12/storage/innobase/fsp/fsp0fsp.cc", line=3361) at /mysql-5.7.12/storage/innobase/include/mtr0mtr.ic:255
#3  0x0000000001a329b0 in mtr_t::x_lock_space (this=0xffff4c050cf8, space_id=25, file=0x22e0390 "/mysql-5.7.12/storage/innobase/fsp/fsp0fsp.cc", line=3361) at /mysql-5.7.12/storage/innobase/mtr/mtr0mtr.cc:703
#4  0x0000000001cd547c in fsp_reserve_free_extents (n_reserved=0xffff4c050b90, space_id=25, n_ext=2, alloc_type=FSP_NORMAL, mtr=0xffff4c050cf8, n_pages=2) at /mysql-5.7.12/storage/innobase/fsp/fsp0fsp.cc:3361
#5  0x0000000001cd3040 in fseg_create_general (space_id=25, page=0, byte_offset=84, has_done_reservation=0, mtr=0xffff4c050cf8) at /mysql-5.7.12/storage/innobase/fsp/fsp0fsp.cc:2641
#6  0x0000000001cd33dc in fseg_create (space=25, page=0, byte_offset=84, mtr=0xffff4c050cf8) at /mysql-5.7.12/storage/innobase/fsp/fsp0fsp.cc:2735
#7  0x0000000001bdbc1c in btr_create (type=1, space=25, page_size=..., index_id=1, index=0xfffee4020aa0, btr_redo_create_info=0x0, mtr=0xffff4c050cf8) at /mysql-5.7.12/storage/innobase/btr/btr0btr.cc:1003
#8  0x0000000001c6b358 in dict_create_index_tree_in_mem (index=0xfffee4020aa0, trx=0xffff84eacd08) at /mysql-5.7.12/storage/innobase/dict/dict0crea.cc:1080
#9  0x0000000001ade514 in row_create_index_for_mysql (index=0xfffee4020aa0, trx=0xffff84eacd08, field_lengths=0x0, handler=0xfffee4010420) at /mysql-5.7.12/storage/innobase/row/row0mysql.cc:3293
#10 0x000000000198df08 in create_clustered_index_when_no_primary (trx=0xffff84eacd08, flags=33, table_name=0xffff4c051538 "tmp/#sql_492a_0") at /mysql-5.7.12/storage/innobase/handler/ha_innodb.cc:10356
#11 0x000000000197a498 in create_table_info_t::create_table (this=0xffff4c051420) at /mysql-5.7.12/storage/innobase/handler/ha_innodb.cc:11592
#12 0x000000000197aff0 in ha_innobase::create (this=0xfffee401eb58, name=0xfffee401e320 "/tmp/#sql_492a_0", form=0xfffee401ca20, create_info=0xffff4c051ba8) at /mysql-5.7.12/storage/innobase/handler/ha_innodb.cc:11929
#13 0x0000000001581148 in create_innodb_tmp_table (table=0xfffee401ca20, keyinfo=0xfffee401d9e0) at /mysql-5.7.12/sql/sql_tmp_table.cc:2250
#14 0x0000000001581650 in instantiate_tmp_table (table=0xfffee401ca20, keyinfo=0xfffee401d9e0, start_recinfo=0xfffee401da80, recinfo=0xfffee401be38, options=4096, big_tables=0 '\000', trace=0xfffee4002eb8) at /mysql-5.7.12/sql/sql_tmp_table.cc:2350
#15 0x000000000157ee10 in create_tmp_table (thd=0xfffee4000b70, param=0xfffee401bdf8, fields=..., group=0x0, distinct=false, save_sum_fields=false, select_options=4096, rows_limit=18446744073709551615, table_alias=0xfffee40074d0 "COLUMNS")
    at /mysql-5.7.12/sql/sql_tmp_table.cc:1517
#16 0x000000000154cca4 in create_schema_table (thd=0xfffee4000b70, table_list=0xfffee401aa10) at /mysql-5.7.12/sql/sql_show.cc:7614
#17 0x000000000154d9e0 in mysql_schema_table (thd=0xfffee4000b70, lex=0xfffee4002ed0, table_list=0xfffee401aa10) at /mysql-5.7.12/sql/sql_show.cc:7843
#18 0x000000000144c9f0 in open_and_process_table (thd=0xfffee4000b70, lex=0xfffee4002ed0, tables=0xfffee401aa10, counter=0xfffee4002f90, flags=0, prelocking_strategy=0xffff4c052648, has_prelocking_list=false, ot_ctx=0xffff4c0525c8) at /mysql-5.7.12/sql/sql_base.cc:4997
#19 0x000000000144dd58 in open_tables (thd=0xfffee4000b70, start=0xffff4c052630, counter=0xfffee4002f90, flags=0, prelocking_strategy=0xffff4c052648) at /mysql-5.7.12/sql/sql_base.cc:5718
#20 0x000000000144ef38 in open_tables_for_query (thd=0xfffee4000b70, tables=0xfffee401aa10, flags=0) at /mysql-5.7.12/sql/sql_base.cc:6484
#21 0x00000000014d7dac in execute_sqlcom_select (thd=0xfffee4000b70, all_tables=0xfffee401aa10) at /mysql-5.7.12/sql/sql_parse.cc:5080
#22 0x00000000014cfd58 in mysql_execute_command (thd=0xfffee4000b70, first_level=true) at /mysql-5.7.12/sql/sql_parse.cc:2758
#23 0x00000000014d8d98 in mysql_parse (thd=0xfffee4000b70, parser_state=0xffff4c053ce8) at /mysql-5.7.12/sql/sql_parse.cc:5519
#24 0x00000000014cca24 in dispatch_command (thd=0xfffee4000b70, com_data=0xffff4c0548c0, command=COM_QUERY) at /mysql-5.7.12/sql/sql_parse.cc:1429
#25 0x00000000014cb984 in do_command (thd=0xfffee4000b70) at /mysql-5.7.12/sql/sql_parse.cc:997
#26 0x000000000160165c in handle_connection (arg=0x29569ed0) at /mysql-5.7.12/sql/conn_handler/connection_handler_per_thread.cc:301
#27 0x00000000018d59b4 in pfs_spawn_thread (arg=0x28b4a360) at /mysql-5.7.12/storage/perfschema/pfs.cc:2188
#28 0x0000ffff8f072e48 in start_thread (arg=0xffff4c0551d0) at pthread_create.c:314
#29 0x0000ffff8ee13320 in clone () at ../ports/sysdeps/unix/sysv/linux/aarch64/nptl/../clone.S:96
```

3回目
1回目、2回目との違いは `fseg_alloc_free_page_low`, `fsp_alloc_free_page` が挟まっている。

```
Breakpoint 1, rw_lock_x_lock_func (lock=0x291f5458, pass=0, file_name=0x22bdc78 "/mysql-5.7.12/storage/innobase/buf/buf0buf.cc", line=5348) at /mysql-5.7.12/storage/innobase/sync/sync0rw.cc:719
719             ulint           i = 0;
(gdb) bt
#0  rw_lock_x_lock_func (lock=0x291f5458, pass=0, file_name=0x22bdc78 "/mysql-5.7.12/storage/innobase/buf/buf0buf.cc", line=5348) at /mysql-5.7.12/storage/innobase/sync/sync0rw.cc:719
#1  0x0000000001c226d0 in pfs_rw_lock_x_lock_func (lock=0x291f5458, pass=0, file_name=0x22bdc78 "/mysql-5.7.12/storage/innobase/buf/buf0buf.cc", line=5348) at /mysql-5.7.12/storage/innobase/include/sync0rw.ic:705
#2  0x0000000001c34454 in buf_page_create (page_id=..., page_size=..., mtr=0xffff4c050cf8) at /mysql-5.7.12/storage/innobase/buf/buf0buf.cc:5348
#3  0x0000000001cd0960 in fsp_page_create (page_id=..., page_size=..., rw_latch=RW_SX_LATCH, mtr=0xffff4c050cf8, init_mtr=0xffff4c050cf8) at /mysql-5.7.12/storage/innobase/fsp/fsp0fsp.cc:1859
#4  0x0000000001cd123c in fsp_alloc_free_page (space=25, page_size=..., hint=0, rw_latch=RW_SX_LATCH, mtr=0xffff4c050cf8, init_mtr=0xffff4c050cf8) at /mysql-5.7.12/storage/innobase/fsp/fsp0fsp.cc:2020
#5  0x0000000001cd4a24 in fseg_alloc_free_page_low (space=0x292689e8, page_size=..., seg_inode=0xffff4dbcd832 "", hint=0, direction=111 'o', rw_latch=RW_SX_LATCH, mtr=0xffff4c050cf8, init_mtr=0xffff4c050cf8, has_done_reservation=0)
    at /mysql-5.7.12/storage/innobase/fsp/fsp0fsp.cc:3099
#6  0x0000000001cd3224 in fseg_create_general (space_id=25, page=0, byte_offset=84, has_done_reservation=0, mtr=0xffff4c050cf8) at /mysql-5.7.12/storage/innobase/fsp/fsp0fsp.cc:2681
#7  0x0000000001cd33dc in fseg_create (space=25, page=0, byte_offset=84, mtr=0xffff4c050cf8) at /mysql-5.7.12/storage/innobase/fsp/fsp0fsp.cc:2735
#8  0x0000000001bdbc1c in btr_create (type=1, space=25, page_size=..., index_id=1, index=0xfffee4020aa0, btr_redo_create_info=0x0, mtr=0xffff4c050cf8) at /mysql-5.7.12/storage/innobase/btr/btr0btr.cc:1003
#9  0x0000000001c6b358 in dict_create_index_tree_in_mem (index=0xfffee4020aa0, trx=0xffff84eacd08) at /mysql-5.7.12/storage/innobase/dict/dict0crea.cc:1080
#10 0x0000000001ade514 in row_create_index_for_mysql (index=0xfffee4020aa0, trx=0xffff84eacd08, field_lengths=0x0, handler=0xfffee4010420) at /mysql-5.7.12/storage/innobase/row/row0mysql.cc:3293
#11 0x000000000198df08 in create_clustered_index_when_no_primary (trx=0xffff84eacd08, flags=33, table_name=0xffff4c051538 "tmp/#sql_492a_0") at /mysql-5.7.12/storage/innobase/handler/ha_innodb.cc:10356
#12 0x000000000197a498 in create_table_info_t::create_table (this=0xffff4c051420) at /mysql-5.7.12/storage/innobase/handler/ha_innodb.cc:11592
#13 0x000000000197aff0 in ha_innobase::create (this=0xfffee401eb58, name=0xfffee401e320 "/tmp/#sql_492a_0", form=0xfffee401ca20, create_info=0xffff4c051ba8) at /mysql-5.7.12/storage/innobase/handler/ha_innodb.cc:11929
#14 0x0000000001581148 in create_innodb_tmp_table (table=0xfffee401ca20, keyinfo=0xfffee401d9e0) at /mysql-5.7.12/sql/sql_tmp_table.cc:2250
#15 0x0000000001581650 in instantiate_tmp_table (table=0xfffee401ca20, keyinfo=0xfffee401d9e0, start_recinfo=0xfffee401da80, recinfo=0xfffee401be38, options=4096, big_tables=0 '\000', trace=0xfffee4002eb8) at /mysql-5.7.12/sql/sql_tmp_table.cc:2350
#16 0x000000000157ee10 in create_tmp_table (thd=0xfffee4000b70, param=0xfffee401bdf8, fields=..., group=0x0, distinct=false, save_sum_fields=false, select_options=4096, rows_limit=18446744073709551615, table_alias=0xfffee40074d0 "COLUMNS")
    at /mysql-5.7.12/sql/sql_tmp_table.cc:1517
#17 0x000000000154cca4 in create_schema_table (thd=0xfffee4000b70, table_list=0xfffee401aa10) at /mysql-5.7.12/sql/sql_show.cc:7614
#18 0x000000000154d9e0 in mysql_schema_table (thd=0xfffee4000b70, lex=0xfffee4002ed0, table_list=0xfffee401aa10) at /mysql-5.7.12/sql/sql_show.cc:7843
#19 0x000000000144c9f0 in open_and_process_table (thd=0xfffee4000b70, lex=0xfffee4002ed0, tables=0xfffee401aa10, counter=0xfffee4002f90, flags=0, prelocking_strategy=0xffff4c052648, has_prelocking_list=false, ot_ctx=0xffff4c0525c8) at /mysql-5.7.12/sql/sql_base.cc:4997
#20 0x000000000144dd58 in open_tables (thd=0xfffee4000b70, start=0xffff4c052630, counter=0xfffee4002f90, flags=0, prelocking_strategy=0xffff4c052648) at /mysql-5.7.12/sql/sql_base.cc:5718
#21 0x000000000144ef38 in open_tables_for_query (thd=0xfffee4000b70, tables=0xfffee401aa10, flags=0) at /mysql-5.7.12/sql/sql_base.cc:6484
#22 0x00000000014d7dac in execute_sqlcom_select (thd=0xfffee4000b70, all_tables=0xfffee401aa10) at /mysql-5.7.12/sql/sql_parse.cc:5080
#23 0x00000000014cfd58 in mysql_execute_command (thd=0xfffee4000b70, first_level=true) at /mysql-5.7.12/sql/sql_parse.cc:2758
#24 0x00000000014d8d98 in mysql_parse (thd=0xfffee4000b70, parser_state=0xffff4c053ce8) at /mysql-5.7.12/sql/sql_parse.cc:5519
#25 0x00000000014cca24 in dispatch_command (thd=0xfffee4000b70, com_data=0xffff4c0548c0, command=COM_QUERY) at /mysql-5.7.12/sql/sql_parse.cc:1429
#26 0x00000000014cb984 in do_command (thd=0xfffee4000b70) at /mysql-5.7.12/sql/sql_parse.cc:997
#27 0x000000000160165c in handle_connection (arg=0x29569ed0) at /mysql-5.7.12/sql/conn_handler/connection_handler_per_thread.cc:301
#28 0x00000000018d59b4 in pfs_spawn_thread (arg=0x28b4a360) at /mysql-5.7.12/storage/perfschema/pfs.cc:2188
#29 0x0000ffff8f072e48 in start_thread (arg=0xffff4c0551d0) at pthread_create.c:314
#30 0x0000ffff8ee13320 in clone () at ../ports/sysdeps/unix/sysv/linux/aarch64/nptl/../clone.S:96
```

4回目は1回目と同じ、5回目は2回目と同じ backtrace だった。

6回目
```
Breakpoint 1, rw_lock_x_lock_func (lock=0xfffee40242a8, pass=0, file_name=0x22cf3c8 "/mysql-5.7.12/storage/innobase/dict/dict0dict.cc", line=373) at /mysql-5.7.12/storage/innobase/sync/sync0rw.cc:719
719             ulint           i = 0;
(gdb) bt
#0  rw_lock_x_lock_func (lock=0xfffee40242a8, pass=0, file_name=0x22cf3c8 "/mysql-5.7.12/storage/innobase/dict/dict0dict.cc", line=373) at /mysql-5.7.12/storage/innobase/sync/sync0rw.cc:719
#1  0x0000000001c6fd90 in pfs_rw_lock_x_lock_func (lock=0xfffee40242a8, pass=0, file_name=0x22cf3c8 "/mysql-5.7.12/storage/innobase/dict/dict0dict.cc", line=373) at /mysql-5.7.12/storage/innobase/include/sync0rw.ic:705
#2  0x0000000001c75848 in dict_table_stats_lock (table=0xfffee4010420, latch_mode=2) at /mysql-5.7.12/storage/innobase/dict/dict0dict.cc:373
#3  0x0000000001ca2940 in dict_stats_empty_table (table=0xfffee4010420) at /mysql-5.7.12/storage/innobase/dict/dict0stats.cc:545
#4  0x0000000001ca7df0 in dict_stats_update (table=0xfffee4010420, stats_upd_option=DICT_STATS_EMPTY_TABLE) at /mysql-5.7.12/storage/innobase/dict/dict0stats.cc:3125
#5  0x000000000197ac84 in create_table_info_t::create_table_update_dict (this=0xffff4c051420) at /mysql-5.7.12/storage/innobase/handler/ha_innodb.cc:11809
#6  0x000000000197b0c8 in ha_innobase::create (this=0xfffee401eb58, name=0xfffee401e320 "/tmp/#sql_492a_0", form=0xfffee401ca20, create_info=0xffff4c051ba8) at /mysql-5.7.12/storage/innobase/handler/ha_innodb.cc:11944
#7  0x0000000001581148 in create_innodb_tmp_table (table=0xfffee401ca20, keyinfo=0xfffee401d9e0) at /mysql-5.7.12/sql/sql_tmp_table.cc:2250
#8  0x0000000001581650 in instantiate_tmp_table (table=0xfffee401ca20, keyinfo=0xfffee401d9e0, start_recinfo=0xfffee401da80, recinfo=0xfffee401be38, options=4096, big_tables=0 '\000', trace=0xfffee4002eb8) at /mysql-5.7.12/sql/sql_tmp_table.cc:2350
#9  0x000000000157ee10 in create_tmp_table (thd=0xfffee4000b70, param=0xfffee401bdf8, fields=..., group=0x0, distinct=false, save_sum_fields=false, select_options=4096, rows_limit=18446744073709551615, table_alias=0xfffee40074d0 "COLUMNS")
    at /mysql-5.7.12/sql/sql_tmp_table.cc:1517
#10 0x000000000154cca4 in create_schema_table (thd=0xfffee4000b70, table_list=0xfffee401aa10) at /mysql-5.7.12/sql/sql_show.cc:7614
#11 0x000000000154d9e0 in mysql_schema_table (thd=0xfffee4000b70, lex=0xfffee4002ed0, table_list=0xfffee401aa10) at /mysql-5.7.12/sql/sql_show.cc:7843
#12 0x000000000144c9f0 in open_and_process_table (thd=0xfffee4000b70, lex=0xfffee4002ed0, tables=0xfffee401aa10, counter=0xfffee4002f90, flags=0, prelocking_strategy=0xffff4c052648, has_prelocking_list=false, ot_ctx=0xffff4c0525c8) at /mysql-5.7.12/sql/sql_base.cc:4997
#13 0x000000000144dd58 in open_tables (thd=0xfffee4000b70, start=0xffff4c052630, counter=0xfffee4002f90, flags=0, prelocking_strategy=0xffff4c052648) at /mysql-5.7.12/sql/sql_base.cc:5718
#14 0x000000000144ef38 in open_tables_for_query (thd=0xfffee4000b70, tables=0xfffee401aa10, flags=0) at /mysql-5.7.12/sql/sql_base.cc:6484
#15 0x00000000014d7dac in execute_sqlcom_select (thd=0xfffee4000b70, all_tables=0xfffee401aa10) at /mysql-5.7.12/sql/sql_parse.cc:5080
#16 0x00000000014cfd58 in mysql_execute_command (thd=0xfffee4000b70, first_level=true) at /mysql-5.7.12/sql/sql_parse.cc:2758
#17 0x00000000014d8d98 in mysql_parse (thd=0xfffee4000b70, parser_state=0xffff4c053ce8) at /mysql-5.7.12/sql/sql_parse.cc:5519
#18 0x00000000014cca24 in dispatch_command (thd=0xfffee4000b70, com_data=0xffff4c0548c0, command=COM_QUERY) at /mysql-5.7.12/sql/sql_parse.cc:1429
#19 0x00000000014cb984 in do_command (thd=0xfffee4000b70) at /mysql-5.7.12/sql/sql_parse.cc:997
#20 0x000000000160165c in handle_connection (arg=0x29569ed0) at /mysql-5.7.12/sql/conn_handler/connection_handler_per_thread.cc:301
#21 0x00000000018d59b4 in pfs_spawn_thread (arg=0x28b4a360) at /mysql-5.7.12/storage/perfschema/pfs.cc:2188
#22 0x0000ffff8f072e48 in start_thread (arg=0xffff4c0551d0) at pthread_create.c:314
#23 0x0000ffff8ee13320 in clone () at ../ports/sysdeps/unix/sysv/linux/aarch64/nptl/../clone.S:96
```

この後も何回か止まる。

重要そうな場所:
- [create_table_info_t::create_table() の index 作成箇所](https://github.com/mysql/mysql-server/blob/99077a555bc197b8be46287543cbde36ab4da8dd/storage/innobase/handler/ha_innodb.cc#L11591)
- [fsp_reserve_free_extents](https://github.com/mysql/mysql-server/blob/99077a555bc197b8be46287543cbde36ab4da8dd/storage/innobase/fsp/fsp0fsp.cc#L3342)
    - 表領域から空きページを予約する。表領域から複数のページを使用する可能性のある全てのミニトランザクションは、事前にこの関数を呼び出し、B-treeページ分割のような操作を完全に行えるように、十分な空きエクステントを予約しておく必要があります。
- [mtr_t::x_lock_space](https://github.com/mysql/mysql-server/blob/99077a555bc197b8be46287543cbde36ab4da8dd/storage/innobase/mtr/mtr0mtr.cc#L668)
    - `Acquire a tablespace X-latch.`
    - 対あり

結論: 内部一時テーブルをディスクに作るときに InnoDB エンジンが使われる。InnoDB エンジンは PK を指定しないでテーブルを作ると、内部的に PK 相当のインデックスを作成するが、それは内部一時テーブルに対しても同様である。その際、テーブルスペースに対して事前に空き領域を確保するところで、rwlock (mode = X) を取っている。
