WL#7364: RBR: Enhanced Applier Thread Progress Details
Affects: Server-8.0
—
Status: Complete
EXECUTIVE SUMMARY ================= This worklog aims at improving/fixing the stats that are shown through SHOW PROCESSLIST, INFORMATION_SCHEMA.PROCESSLIST, PERFORMANCE_SCHEMA.THREADS and PERFORMANCE_SCHEMA.EVENTS_STAGES_* for the SQL thread when it is applying row events. This is motivated by the fact that users do not have a clue of what is happening when the SQL thread is applying a ROW event. In fact, currently wrong information can be reported through PROCESSLIST. Therefore, users should at least be able to see through PERFORMANCE_SCHEMA tables what is the correct state of the SQL thread and what exactly it is doing at the moment. This minimal information is of great help to troubleshoot Row-based Replication problems. The work on this worklog should be later extended with further PERFORMANCE_SCHEMA additions that export many more stats for RBR. SOLUTION ======== - Fix the command field: set it to NULL (or QUERY(?)) - Put in the "Info" field the contents of Rows_query_log_event. - Fix a proper THD_STAGE_INFO for when the thread is applying row events. - Add RBR stages for reporting how far the SQL thread has processed each ROW event (lets call it bundle of RBR changes). This is reported through performance_schema stages tables.
FUNCTIONAL REQUIREMENTS
-----------------------
F1. SHOW PROCESSLIST SHALL have the following fields updated
with accurate information when processing a Delete, Write,
or Update_rows_log_event:
- command: NULL / (QUERY?)
- db --> the database the row event is changing
- Info --> NULL or the contents of Rows_query_log_event if
available or the statement itself (for BINLOG '' statements)
F2. SELECT command, db, Info FROM INFORMATION_SCHEMA.PROCESSLIST SHALL
have the following fields updated with accurate information
when processing a Delete, Write, or Update_rows_log_event:
- command --> same as SHOW PROCESSLIST
- db --> same as SHOW PROCESSLIST
- Info --> same as SHOW PROCESSLIST
F3. SELECT PROCESSLIST_DB, PROCESSLIST_STATE, PROCESSLIST_INFO
FROM PERFORMANCE_SCHEMA.THREADS SHALL have the following fields
updated with accurate information when processing a Delete,
Write or Update_rows_log_event:
- processlist_db --> same as SHOW PROCESSLIST
- processlist_command --> same as SHOW PROCESSLIST
- processlist_info --> same as SHOW PROCESSLIST
F4. There SHALL be three new Performance schema stages:
- Applying batch of row changes (write)
- Applying batch of row changes (update)
- Applying batch of row changes (delete)
F5. These new stages SHALL report progress (WORK_COMPLETED and
WORK_ESTIMATED on the PERFORMANCE_SCHEMA.EVENTS_STAGES_CURRENT
table).
F6. The data presented SHALL be discarded once the worker thread
stops.
F7. BINLOG statements SHALL comply with F1, F2, F3 and F4.
NON-FUNCTIONAL REQUIREMENTS
---------------------------
NFR1. There SHALL NOT be a significant performance degradation on the
binlog applier. (No more than 3%)
- Three new performance schema stages are implemented:
- "Applying batch of row changes (write)"
- "Applying batch of row changes (update)"
- "Applying batch of row changes (delete)"
- These stages are set while the applier thread applies the rows.
As such the regular performance schema stages operations apply.
- The following commands will report more accurate information than
that that is exposed today (see requirements section):
- SHOW PROCESSLIST
- SELECT command, db, Info FROM INFORMATION_SCHEMA.PROCESSLIST
- SELECT PROCESSLIST_DB, PROCESSLIST_STATE, PROCESSLIST_INFO
FROM PERFORMANCE_SCHEMA.THREADS
- The following command will report accurate information when instrumentation
for the three stages mentioned above is enabled:
- SELECT WORK_ESTIMATED, WORK_COMPLETED
FROM performance_schema.events_stages_current
WHERE EVENT_NAME LIKE 'stage/sql/Applying%'
Stage Instrumentation
---------------------
- Progress for each stage is to be accounted for in the member
function Rows_log_event::do_post_row_operations .
- Estimation of work to do is done after processing the first row
change. This is needed since estimation is performed based on
pointers to the data in the buffer: m_rows_end, m_rows_buf and
m_curr_row . Therefore, we know the size of the buffer and the
approximate size of each row change after we process the first row
and set the m_curr_row correctly.
- Context lifecycle is set as part of the Rows_log_event.
Copyright (c) 2000, 2025, Oracle Corporation and/or its affiliates. All rights reserved.