mariadb/storage/innobase/include
Thirunarayanan Balathandayuthapani c6de1267dd MDEV-35689 InnoDB system tables cannot be optimized or defragmented
- With the help of MDEV-14795, InnoDB implemented a way to shrink
the InnoDB system tablespace after undo tablespaces have been moved
to separate files (MDEV-29986). There is no way to defragment any
pages of InnoDB system tables. By doing that, shrinking of
system tablespace can be more effective. This patch deals with
defragment of system tables inside ibdata1.

Following steps are done to do the defragmentation of system
tablespace:
1) Make sure that there is no user tables exist in ibdata1

2) Iterate through all extent descriptor pages in system tablespace
and note their states.

3) Find the free earlier extent to replace the lastly used
extents in the system tablespace.

4) Iterate through all indexes of system tablespace and defragment
the tree level by level.

5) Iterate the level from left page to right page and find out
the page comes under the extent to be replaced. If it is then
do step (6) else step(4)

6) Prepare the allocation of new extent by latching necessary
pages. If any error happens then there is no modification of
page happened till step (5).

7) Allocate the new page from the new extent

8) Prepare the associated pages for the block to be modified

9) Prepare the step of freeing of page

10) If any error happens during preparing of associated pages,
freeing of page then restore the page which was modified
during new page allocation

11) Copy the old page content to new page

12) Change the associative pages like left, right and parent page

13) Complete the freeing of old page

Allocation of page from new extent, changing of relative pages,
freeing of page are done by 2 steps. one is prepare which
latches the to be modified pages and checks their validation.
Other is complete(), Do the operation

fseg_validate(): Validate the list exist in inode segment

Defragmentation is enabled only when :autoextend exist in
innodb_data_file_path variable.
2025-04-10 17:13:34 +05:30
..
btr0btr.h Merge 10.11 into 11.4 2024-12-02 11:35:34 +02:00
btr0btr.inl MDEV-29603 btr_cur_open_at_index_side() is missing some consistency checks 2022-11-17 08:19:01 +02:00
btr0bulk.h MDEV-13542: Crashing on corrupted page is unhelpful 2022-06-06 14:03:22 +03:00
btr0cur.h Merge 10.11 into 11.4 2024-12-02 11:35:34 +02:00
btr0cur.inl MDEV-34515: Contention between purge and workload 2024-08-26 12:23:06 +03:00
btr0pcur.h Merge 10.5 into 10.6 2024-04-19 16:01:26 +03:00
btr0pcur.inl MDEV-30400 Assertion height == btr_page_get_level(...) on INSERT 2023-01-24 14:09:21 +02:00
btr0sea.h MDEV-29445: Reimplement SET GLOBAL innodb_buffer_pool_size 2025-03-26 17:05:44 +02:00
btr0sea.inl MDEV-27700 ASAN: Heap_use_after_free in btr_search_drop_page_hash_index() 2022-08-22 16:29:46 +05:30
btr0types.h MDEV-34458 wait_for_read in buf_page_get_low hurts performance 2024-06-26 13:51:38 +03:00
buf0buddy.h MDEV-29445: Reimplement SET GLOBAL innodb_buffer_pool_size 2025-03-26 17:05:44 +02:00
buf0buf.h Merge 10.11 into 11.4 2025-04-02 10:15:08 +03:00
buf0buf.inl MDEV-29445: Reimplement SET GLOBAL innodb_buffer_pool_size 2025-03-26 17:05:44 +02:00
buf0checksum.h MDEV-25105 Remove innodb_checksum_algorithm values none,innodb,... 2021-03-11 12:46:18 +02:00
buf0dblwr.h Merge 10.11 into 11.4 2025-04-02 10:15:08 +03:00
buf0dump.h Make .clang-format work with clang-8 2019-11-15 18:09:30 +01:00
buf0flu.h Merge branch '10.6' into 10.11 2025-01-10 13:14:42 +01:00
buf0lru.h Merge 10.11 into 11.4 2025-03-28 13:55:21 +02:00
buf0rea.h Merge branch '10.11' into 11.4 2025-01-14 23:45:41 +01:00
buf0types.h Merge branch '10.6' into 10.11 2025-01-10 13:14:42 +01:00
cache.h MDEV-33447 fixup for POWER 8 2024-04-24 12:39:30 +03:00
data0data.h Merge branch '10.6' into 10.11 2024-04-22 15:23:10 +02:00
data0data.inl Merge branch '10.4' into 10.5 2024-04-16 11:04:14 +02:00
data0type.h MDEV-29694 Remove the InnoDB change buffer 2023-01-11 17:59:36 +02:00
data0type.inl MDEV-29694 Remove the InnoDB change buffer 2023-01-11 17:59:36 +02:00
data0types.h
db0err.h MDEV-24035 Failing assertion: UT_LIST_GET_LEN(lock.trx_locks) == 0 causing disruption and replication failure 2024-12-12 18:02:00 +02:00
dict0boot.h Merge 10.6 into 10.11 2024-11-29 13:43:17 +02:00
dict0crea.h MDEV-34823 Invalid arguments in ib_push_warning() 2024-09-06 14:29:09 +03:00
dict0crea.inl MDEV-27494 Rename .ic files to .inl 2022-01-17 16:41:51 +01:00
dict0dict.h MDEV-35689 InnoDB system tables cannot be optimized or defragmented 2025-04-10 17:13:34 +05:30
dict0dict.inl Merge 10.11 into 11.4 2025-03-03 11:07:56 +02:00
dict0load.h MDEV-34529 Shrink the system tablespace when system tablespace contains MDEV-30671 leaked undo pages 2024-10-16 21:34:24 +05:30
dict0mem.h Merge 10.11 into 11.4 2025-03-03 11:07:56 +02:00
dict0mem.inl Merge 10.5 into 10.6 2024-04-17 14:14:58 +03:00
dict0pagecompress.h MDEV-27494 Rename .ic files to .inl 2022-01-17 16:41:51 +01:00
dict0pagecompress.inl MDEV-27494 Rename .ic files to .inl 2022-01-17 16:41:51 +01:00
dict0stats.h Merge 10.11 into 11.4 2025-03-03 11:07:56 +02:00
dict0stats_bg.h Merge 10.5 into 10.6 2022-04-26 15:21:20 +03:00
dict0types.h Merge branch '10.11 into 11.4 2025-01-30 12:01:11 +01:00
dyn0buf.h Merge branch '10.6' into 10.11 2024-04-22 15:23:10 +02:00
dyn0types.h Merge from 10.4 to 10.5 2024-04-15 17:46:49 +02:00
eval0eval.h MDEV-27494 Rename .ic files to .inl 2022-01-17 16:41:51 +01:00
eval0eval.inl Merge branch '10.4' into 10.5 2022-02-01 20:33:04 +01:00
eval0proc.h MDEV-27494 Rename .ic files to .inl 2022-01-17 16:41:51 +01:00
eval0proc.inl MDEV-27494 Rename .ic files to .inl 2022-01-17 16:41:51 +01:00
fil0crypt.h Merge branch '10.6' into 10.11 2024-08-03 09:15:40 +02:00
fil0crypt.inl MDEV-27494 Rename .ic files to .inl 2022-01-17 16:41:51 +01:00
fil0fil.h MDEV-35689 InnoDB system tables cannot be optimized or defragmented 2025-04-10 17:13:34 +05:30
fil0pagecompress.h Merge 10.6 into 10.7 2021-08-19 13:03:48 +03:00
fsp0file.h Merge 10.11 into 11.2 2024-10-18 11:32:22 +03:00
fsp0fsp.h Merge 10.11 into 11.4 2025-03-03 11:07:56 +02:00
fsp0space.h MDEV-26195: Use a 32-bit data type for some tablespace fields 2021-07-22 11:22:47 +03:00
fsp0sysspace.h MDEV-34529 Shrink the system tablespace when system tablespace contains MDEV-30671 leaked undo pages 2024-10-16 21:34:24 +05:30
fsp0types.h MDEV-29694 Remove the InnoDB change buffer 2023-01-11 17:59:36 +02:00
fts0ast.h Merge 10.4 to 10.5 2020-10-22 17:08:49 +03:00
fts0blex.h
fts0fts.h MDEV-24035 Failing assertion: UT_LIST_GET_LEN(lock.trx_locks) == 0 causing disruption and replication failure 2024-12-12 18:02:00 +02:00
fts0opt.h Merge 10.1 to 10.2 2019-10-25 17:33:39 +03:00
fts0pars.h
fts0plugin.h
fts0priv.h Merge 10.5 into 10.6 2024-02-13 20:42:59 +02:00
fts0priv.inl MDEV-33383: Corrupted red-black tree due to incorrect comparison 2024-02-12 17:01:45 +02:00
fts0tlex.h
fts0tokenize.h MDEV-21581 Helper functions and methods for CHARSET_INFO 2020-01-28 12:29:23 +04:00
fts0types.h Merge 10.5 into 10.6 2024-02-13 20:42:59 +02:00
fts0types.inl MDEV-33383: Corrupted red-black tree due to incorrect comparison 2024-02-12 17:01:45 +02:00
fts0vlc.h MDEV-19522 InnoDB commit fails when FTS_DOC_ID value is greater than 4294967295 2021-10-21 12:56:59 +03:00
fut0lst.h MDEV-35689 InnoDB system tables cannot be optimized or defragmented 2025-04-10 17:13:34 +05:30
gis0geo.h MDEV-21924 Clean up InnoDB GIS record comparison 2020-03-12 18:13:53 +02:00
gis0rtree.h Merge 10.11 into 11.0 2023-01-25 10:17:54 +02:00
gis0rtree.inl MDEV-29694 Remove the InnoDB change buffer 2023-01-11 17:59:36 +02:00
gis0type.h Merge 10.5 into 10.6 2024-04-17 14:14:58 +03:00
ha0ha.h Merge branch '10.4' into 10.5 2022-02-01 20:33:04 +01:00
ha0ha.inl Merge branch '10.4' into 10.5 2022-02-01 20:33:04 +01:00
ha0storage.h MDEV-27494 Rename .ic files to .inl 2022-01-17 16:41:51 +01:00
ha0storage.inl Merge branch '10.4' into 10.5 2022-02-01 20:33:04 +01:00
ha_prototypes.h MDEV-35854: Simplify dict_get_referenced_table() 2025-01-23 14:38:08 +02:00
handler0alter.h Merge branch '10.2' into 10.3 2020-05-04 16:47:11 +02:00
hash0hash.h MDEV-34877 Port "Bug #11745929 Change lock priority so that the transaction holding S-lock gets X-lock first" fix from MySQL to MariaDB 2025-01-23 17:38:32 +03:00
ibuf0ibuf.h MDEV-35000 preparation: Clean up dict_table_t::stat 2025-02-28 08:55:16 +02:00
lock0iter.h
lock0lock.h Merge branch '10.11 into 11.4 2025-01-30 12:01:11 +01:00
lock0lock.inl MDEV-34877 Port "Bug #11745929 Change lock priority so that the transaction holding S-lock gets X-lock first" fix from MySQL to MariaDB 2025-01-23 17:38:32 +03:00
lock0prdt.h MDEV-20612: Partition lock_sys.latch 2021-02-12 17:44:32 +02:00
lock0priv.h MDEV-34877 Port "Bug #11745929 Change lock priority so that the transaction holding S-lock gets X-lock first" fix from MySQL to MariaDB 2025-01-23 17:38:32 +03:00
lock0priv.inl MDEV-34877 Port "Bug #11745929 Change lock priority so that the transaction holding S-lock gets X-lock first" fix from MySQL to MariaDB 2025-01-23 17:38:32 +03:00
lock0types.h MDEV-34877 Port "Bug #11745929 Change lock priority so that the transaction holding S-lock gets X-lock first" fix from MySQL to MariaDB 2025-01-23 17:38:32 +03:00
log0crypt.h Merge 10.11 into 11.0 2024-03-28 10:51:36 +02:00
log0log.h Merge 10.11 into 11.4 2025-03-03 11:07:56 +02:00
log0recv.h Merge 10.11 into 11.4 2025-03-28 13:55:21 +02:00
log0types.h Remove bogus references to replaced Google contributions 2023-08-21 15:51:16 +03:00
mach0data.h Merge branch '10.4' into 10.5 2022-02-01 20:33:04 +01:00
mach0data.inl Merge branch '10.5' into 10.6 2024-08-03 09:04:24 +02:00
mariadb_stats.h MDEV-34190: r_engine_stats.pages_read_count is unrealistically low 2024-07-04 15:24:49 +03:00
mem0mem.h Merge branch '10.4' into 10.5 2022-02-01 20:33:04 +01:00
mem0mem.inl Merge branch '10.5' into 10.6 2022-02-03 17:01:31 +01:00
mtr0log.h Merge 10.6 into 10.11 2024-11-29 13:43:17 +02:00
mtr0mtr.h Merge branch '10.11' into 11.4 2025-01-14 23:45:41 +01:00
mtr0types.h Merge 10.6 into 10.8 2023-02-16 09:17:06 +02:00
os0file.h Merge 10.11 into 11.4 2025-04-02 10:15:08 +03:00
os0file.inl Merge branch '10.6' into 10.11 2024-10-29 15:24:38 +01:00
page0cur.h Merge 10.11 into 11.2 2024-08-29 16:02:57 +03:00
page0cur.inl Merge 10.11 into 11.2 2024-08-29 16:02:57 +03:00
page0page.h Merge 10.11 into 11.4 2024-12-02 11:35:34 +02:00
page0page.inl MDEV-32175: Reduce page_align(), page_offset() calls 2024-11-21 11:01:30 +02:00
page0types.h MDEV-27924 page_zip_copy_recs() corrupts ROW_FORMAT=COMPRESSED block descriptor 2022-02-23 11:34:52 +02:00
page0zip.h MDEV-29694 Remove the InnoDB change buffer 2023-01-11 17:59:36 +02:00
page0zip.inl MDEV-29694 Remove the InnoDB change buffer 2023-01-11 17:59:36 +02:00
pars0grm.h Cleanup: Remove pars_stored_procedure_call() 2021-07-29 15:37:35 +03:00
pars0opt.h
pars0pars.h MDEV-25919 preparation: Various cleanup 2021-08-31 13:54:20 +03:00
pars0sym.h
pars0types.h
que0que.h MDEV-34515: Reduce context switching in purge 2024-08-26 12:23:17 +03:00
que0que.inl Merge branch '10.5' into 10.6 2022-02-03 17:01:31 +01:00
que0types.h MDEV-23379 Deprecate&ignore InnoDB concurrency throttling parameters 2020-08-04 06:59:29 +03:00
read0types.h MDEV-24402: InnoDB CHECK TABLE ... EXTENDED 2022-10-21 10:02:54 +03:00
rem0cmp.h Merge branch '10.4' into 10.5 2022-02-01 20:33:04 +01:00
rem0rec.h Merge 10.5 into 10.6 2023-02-10 13:03:01 +02:00
rem0rec.inl MDEV-29694 Remove the InnoDB change buffer 2023-01-11 17:59:36 +02:00
rem0types.h Merge 10.4 into 10.5 2020-05-05 21:16:22 +03:00
row0ext.h Merge branch '10.3' into 10.4 2022-01-30 09:46:52 +01:00
row0ext.inl MDEV-27494 Rename .ic files to .inl 2022-01-17 16:41:51 +01:00
row0ftsort.h Merge branch '10.5' into 10.6 2023-11-08 15:57:05 +01:00
row0import.h MDEV-26137 Improve import tablespace workflow. 2023-07-04 17:56:27 +10:00
row0ins.h Merge 10.5 into 10.6 2023-03-28 15:25:52 +03:00
row0log.h MDEV-15250 UPSERT during ALTER TABLE results in 'Duplicate entry' error for alter 2022-04-26 16:22:56 +05:30
row0merge.h MDEV-34703 LOAD DATA INFILE using Innodb bulk load aborts 2025-01-15 23:49:13 +05:30
row0mysql.h MDEV-35854: Clarify row_rename_table_for_mysql() 2025-01-23 14:38:35 +02:00
row0purge.h MDEV-34515: Contention between purge and workload 2024-08-26 12:23:06 +03:00
row0quiesce.h
row0row.h Merge 10.11 into 11.4 2025-03-03 11:07:56 +02:00
row0row.inl MDEV-36015: unrepresentable value in row_parse_int() 2025-02-13 15:10:53 +01:00
row0sel.h MDEV-36015: unrepresentable value in row_parse_int() 2025-02-13 15:10:53 +01:00
row0types.h Merge 10.4 into 10.5 2020-03-30 19:07:25 +03:00
row0uins.h
row0umod.h
row0undo.h MDEV-32050: Clean up log parsing 2023-10-25 08:27:08 +03:00
row0upd.h Merge 10.5 into 10.6 2023-01-03 18:13:11 +02:00
row0upd.inl Merge branch '10.4' into 10.5 2022-02-01 20:33:04 +01:00
row0vers.h MDEV-34515: Contention between purge and workload 2024-08-26 12:23:06 +03:00
rw_lock.h MDEV-34983: Remove x86 asm from InnoDB 2024-09-23 12:51:27 +03:00
small_vector.h MDEV-35701 trx_t::autoinc_locks causes unnecessary dynamic memory allocation 2025-01-15 16:55:01 +02:00
srv0mon.h Merge 10.11 into 11.0 2024-03-28 10:51:36 +02:00
srv0mon.inl MDEV-27494 Rename .ic files to .inl 2022-01-17 16:41:51 +01:00
srv0srv.h Merge 10.11 into 11.4 2025-03-28 13:55:21 +02:00
srv0start.h MDEV-19229 Allow innodb_undo_tablespaces to be changed after database creation 2022-10-25 11:19:36 +05:30
srw_lock.h Merge 10.6 into 10.11 2024-10-03 10:55:08 +03:00
sux_lock.h Merge branch '10.11' into 11.4 2025-01-14 23:45:41 +01:00
transactional_lock_guard.h MDEV-34973 fixup for POWER,s390x 2024-10-01 13:29:59 +03:00
trx0i_s.h MDEV-35189: Updating cache for INNODB_LOCKS et al is suboptimal 2024-11-12 12:17:34 +02:00
trx0purge.h Merge branch '10.6' into 10.11 2024-10-29 15:24:38 +01:00
trx0rec.h Merge 10.6 into 10.11 2024-08-29 07:47:29 +03:00
trx0roll.h MDEV-24035 Failing assertion: UT_LIST_GET_LEN(lock.trx_locks) == 0 causing disruption and replication failure 2024-12-12 18:02:00 +02:00
trx0rseg.h Merge 10.6 into 10.11 2024-10-03 10:55:08 +03:00
trx0sys.h Merge 10.11 into 11.4 2025-01-09 07:58:08 +02:00
trx0trx.h Merge branch '10.11 into 11.4 2025-01-30 12:01:11 +01:00
trx0trx.inl MDEV-24035 Failing assertion: UT_LIST_GET_LEN(lock.trx_locks) == 0 causing disruption and replication failure 2024-12-12 18:02:00 +02:00
trx0types.h Merge 10.6 into 10.11 2024-12-19 15:38:53 +02:00
trx0undo.h Merge 10.11 into 11.4 2024-12-02 11:35:34 +02:00
trx0undo.inl MDEV-33819 The purge of committed history is mis-parsing some log 2024-04-08 11:48:46 +03:00
trx0xa.h
univ.i Merge branch '10.11' into 11.4 2025-01-14 23:45:41 +01:00
ut0byte.h MDEV-21174 fixup: Remove unused ut_bit_set_nth() 2023-09-19 18:02:56 +03:00
ut0byte.inl MDEV-21174 fixup: Remove unused ut_bit_set_nth() 2023-09-19 18:02:56 +03:00
ut0counter.h Merge 10.5 into 10.6 2024-06-17 08:40:07 +03:00
ut0dbg.h
ut0list.h MDEV-27494 Rename .ic files to .inl 2022-01-17 16:41:51 +01:00
ut0list.inl MDEV-27494 Rename .ic files to .inl 2022-01-17 16:41:51 +01:00
ut0lst.h Do not use C++11 before MariaDB 10.4 2022-10-14 11:54:05 +03:00
ut0mem.h Merge branch '10.4' into 10.5 2022-02-01 20:33:04 +01:00
ut0mem.inl Merge branch '10.4' into 10.5 2022-02-01 20:33:04 +01:00
ut0new.h Merge 10.5 into 10.6 2024-03-27 15:00:56 +02:00
ut0pool.h Merge 10.6 into 10.11 2024-11-29 13:43:17 +02:00
ut0rbt.h
ut0rnd.h MDEV-35247: ut_hash_ulint() is a waste 2024-11-21 08:59:31 +02:00
ut0rnd.inl MDEV-35247: ut_hash_ulint() is a waste 2024-11-21 08:59:31 +02:00
ut0sort.h
ut0stage.h MDEV-21907: Fix most clang -Wconversion in InnoDB 2020-03-11 08:29:48 +02:00
ut0ut.h Merge 10.6 into 10.11 2024-02-08 15:04:46 +02:00
ut0ut.inl MDEV-27494 Rename .ic files to .inl 2022-01-17 16:41:51 +01:00
ut0vec.h MDEV-33383: Replace fts_doc_id_cmp, ib_vector_sort 2024-02-12 17:01:17 +02:00
ut0vec.inl MDEV-33383: Replace fts_doc_id_cmp, ib_vector_sort 2024-02-12 17:01:17 +02:00
ut0wqueue.h Merge 10.5 into 10.6 2021-10-21 16:06:34 +03:00