mariadb/storage/perfschema
Haidong Ji 03c9a4ef4a MDEV-29091: Correct event_name in PFS for wait caused by FOR UPDATE
When one session SELECT ... FOR UPDATE and holds the lock, subsequent
sessions that SELECT ... FOR UPDATE will wait to get the lock.
Currently, that event is labeled as `wait/io/table/sql/handler`, which
is incorrect. Instead, it should have been
`wait/lock/table/sql/handler`.

Two factors contribute to this bug:
1. Instrumentation interface and the heavy usage of `TABLE_IO_WAIT` in
   `sql/handler.cc` file. See interface [^1] for better understanding;
2. The balancing act [^2] of doing instrumentation aggregration _AND_
   having good performance. For example, EVENTS_WAITS_SUMMARY... is
   aggregated using EVENTS_WAITS_CURRENT. Aggregration needs to be based
   on the same wait class, and the code was overly aggressive in label a
   LOCK operation as an IO operation in this case.

The proposed fix is pretty simple, but understanding the bug took a
while. Hence the footnotes below.  For future improvement and
refactoring, we may want to consider renaming `TABLE_IO_WAIT` and making
it less coarse and more targeted.

Note that newly added test case, events_waits_current_MDEV-29091,
initially didn't pass Buildbot CI for embedded build tests.  Further
research showed that other impacted tests all included not_embedded.inc.
This oversight was fixed later.

All new code of the whole pull request, including one or several files
that are either new files or modified ones, are contributed under the
BSD-new license.  I am contributing on behalf of my employer Amazon Web
Services, Inc.

[^1]: To understand `performance_schema` instrumentation interface, I
found this URL is the most helpful:
https://dev.mysql.com/doc/dev/mysql-server/latest/PAGE_PFS_PSI.html
[^2]: The best place to understand instrumentation projection,
composition, and aggregration is through the source file. Although I
prefer reading Doxygen produced html file, but for whatever reason, the
rendering is not ideal. Here is link to 10.6's pfs.cc:
https://github.com/MariaDB/server/blob/10.6/storage/perfschema/pfs.cc
2023-02-15 14:36:05 +00:00
..
unittest
CMakeLists.txt
cursor_by_account.cc
cursor_by_account.h
cursor_by_host.cc
cursor_by_host.h
cursor_by_thread.cc
cursor_by_thread.h
cursor_by_thread_connect_attr.cc
cursor_by_thread_connect_attr.h
cursor_by_user.cc
cursor_by_user.h
gen_pfs_lex_token.cc
ha_perfschema.cc
ha_perfschema.h
pfs.cc MDEV-29091: Correct event_name in PFS for wait caused by FOR UPDATE 2023-02-15 14:36:05 +00:00
pfs.h
pfs_account.cc
pfs_account.h
pfs_atomic.h
pfs_autosize.cc
pfs_column_types.h
pfs_column_values.cc
pfs_column_values.h
pfs_con_slice.cc
pfs_con_slice.h
pfs_defaults.cc
pfs_defaults.h
pfs_digest.cc
pfs_digest.h
pfs_engine_table.cc
pfs_engine_table.h
pfs_events.h
pfs_events_stages.cc
pfs_events_stages.h
pfs_events_statements.cc
pfs_events_statements.h
pfs_events_waits.cc
pfs_events_waits.h
pfs_global.cc
pfs_global.h
pfs_host.cc
pfs_host.h
pfs_instr.cc
pfs_instr.h
pfs_instr_class.cc
pfs_instr_class.h
pfs_lock.h
pfs_server.cc
pfs_server.h
pfs_setup_actor.cc
pfs_setup_actor.h
pfs_setup_object.cc
pfs_setup_object.h
pfs_stat.h
pfs_timer.cc
pfs_timer.h
pfs_user.cc
pfs_user.h
pfs_visitor.cc
pfs_visitor.h
table_accounts.cc
table_accounts.h
table_all_instr.cc
table_all_instr.h
table_esgs_by_account_by_event_name.cc
table_esgs_by_account_by_event_name.h
table_esgs_by_host_by_event_name.cc
table_esgs_by_host_by_event_name.h
table_esgs_by_thread_by_event_name.cc
table_esgs_by_thread_by_event_name.h
table_esgs_by_user_by_event_name.cc
table_esgs_by_user_by_event_name.h
table_esgs_global_by_event_name.cc
table_esgs_global_by_event_name.h
table_esms_by_account_by_event_name.cc
table_esms_by_account_by_event_name.h
table_esms_by_digest.cc
table_esms_by_digest.h
table_esms_by_host_by_event_name.cc
table_esms_by_host_by_event_name.h
table_esms_by_thread_by_event_name.cc
table_esms_by_thread_by_event_name.h
table_esms_by_user_by_event_name.cc
table_esms_by_user_by_event_name.h
table_esms_global_by_event_name.cc
table_esms_global_by_event_name.h
table_events_stages.cc
table_events_stages.h
table_events_statements.cc
table_events_statements.h
table_events_waits.cc
table_events_waits.h
table_events_waits_summary.cc
table_events_waits_summary.h
table_ews_by_account_by_event_name.cc
table_ews_by_account_by_event_name.h
table_ews_by_host_by_event_name.cc
table_ews_by_host_by_event_name.h
table_ews_by_thread_by_event_name.cc
table_ews_by_thread_by_event_name.h
table_ews_by_user_by_event_name.cc
table_ews_by_user_by_event_name.h
table_ews_global_by_event_name.cc
table_ews_global_by_event_name.h
table_file_instances.cc
table_file_instances.h
table_file_summary_by_event_name.cc
table_file_summary_by_event_name.h
table_file_summary_by_instance.cc
table_file_summary_by_instance.h
table_helper.cc
table_helper.h
table_host_cache.cc
table_host_cache.h
table_hosts.cc
table_hosts.h
table_os_global_by_type.cc
table_os_global_by_type.h
table_performance_timers.cc
table_performance_timers.h
table_session_account_connect_attrs.cc
table_session_account_connect_attrs.h
table_session_connect.cc
table_session_connect.h
table_session_connect_attrs.cc
table_session_connect_attrs.h
table_setup_actors.cc
table_setup_actors.h
table_setup_consumers.cc
table_setup_consumers.h
table_setup_instruments.cc
table_setup_instruments.h
table_setup_objects.cc
table_setup_objects.h
table_setup_timers.cc
table_setup_timers.h
table_socket_instances.cc
table_socket_instances.h
table_socket_summary_by_event_name.cc
table_socket_summary_by_event_name.h
table_socket_summary_by_instance.cc
table_socket_summary_by_instance.h
table_sync_instances.cc
table_sync_instances.h
table_threads.cc
table_threads.h
table_tiws_by_index_usage.cc
table_tiws_by_index_usage.h
table_tiws_by_table.cc
table_tiws_by_table.h
table_tlws_by_table.cc
table_tlws_by_table.h
table_users.cc
table_users.h